PKI"D\)''speedrack-latest/changes.html Changes — Speedrack 0.6.1 documentation

Changes

0.6.0
added SCRIPT_NAME configuration variable for supporting sub-path server roots
0.5.2
bugfix for APScheduler stale dependency and overambitious setup
0.5.1
bugfix for sudo controls
0.5
added in-app manual suspension of tasks, more convenient than commenting out task in yaml and reloading
0.4.1
bugfix for spam_fail
0.4
added spam_fail setting, for hammering failure messages
0.3.1
added simple sudo controls
0.3.0
fixed email and spam settings
0.2.11
add params tab to show single-task execution criteria
0.2.10
add single-file view
0.2.9
reduce number of copied version strings add placeholder for tasks with no description
0.2.8
standard numbering scheme
0.2.h
use gevent if available, otherwise use Flask’s development server gevent/libevent is no longer a hard requirement, and is not installed with speedrack
0.2.f
convert docs to sphinx documentation and wire to readthedocs
0.2.e
merge debug and config to one page
0.2
beta
0.1
prototype/alpha
Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.
PKI"D\#Wspeedrack-latest/searchindex.jsSearch.setIndex({objects:{},terms:{all:[1,2,6,5],illustr:5,global:5,prefix:5,abil:6,follow:5,depend:4,flask:[1,4,5],script_nam:[5,4],send:5,init:5,under:2,executor_func:6,everi:1,string:[5,2,4],fals:2,failur:[0,5,2,6,4],brows:5,administr:2,level:[0,1],button:2,overambiti:4,previou:6,"try":5,fail_by_nonzero_status_cod:2,team:1,cooki:6,readthedoc:4,pleas:1,prevent:6,cron:[0,2],second:2,design:5,click:5,even:5,index:5,what:[1,6,5],sub:[0,5,4],fine:5,current:2,version:4,"new":[1,5],told:5,crunch:1,gener:5,executor:6,drew:1,pjax:6,let:5,path:[0,5,4],modifi:5,wait:2,convert:4,chang:[0,5,4],via:[0,2,6],love:1,tweak:1,app:[2,4],instal:[0,5,4],from:[1,6,5,3],would:5,two:[5,2],live:6,typo:1,criteria:4,jonathan:3,tell:5,more:[4,1,6],conveni:[0,4],notif:[0,6],warn:5,trail:5,stick:5,known:1,effort:1,speedrack_task:5,placehold:4,hour:2,setup:4,work:[1,2],dev:5,histori:6,whatev:5,learn:5,sentri:6,root:[5,4],control:[0,2,4],apschedul:[1,2,4],sudo:[0,2,4],indic:2,high:0,tab:[2,4],attract:0,end:[0,2],clint:3,secur:5,rather:5,email_url_prefix:5,write:[5,6],how:5,instead:6,config:[0,5,2,6,4],updat:6,resourc:0,befor:2,mixin:1,data:1,practic:1,bootstrap:1,issu:6,inform:2,help:2,group:[1,5],fix:4,better:1,yaml:[5,4],restart:2,mail:5,might:[0,2],non:5,good:1,thei:[1,5],food:1,dai:1,auth:6,front:0,now:[2,6],choic:1,name:5,simpl:[1,2,4,5],mode:[0,5],each:5,debug:4,fatigu:1,mean:[5,2],domain:5,list:6,hard:4,ensur:6,year:1,our:1,todo:[0,6],event:1,out:[4,1,6],variabl:[4,5,6],robert:1,content:0,rel:5,internet:5,got:5,correct:5,shut:2,given:2,free:2,standard:4,ask:6,philip:1,launch:[5,2],success:[0,2,6],thing:1,place:5,retain:6,first:1,origin:5,onc:5,qualiti:1,number:4,yourself:1,restrict:5,instruct:5,alreadi:1,suspens:4,stabl:1,open:5,differ:2,script:0,system:0,messag:[4,6],too:5,scheme:4,store:6,shell:[0,5],copi:4,took:1,task:[0,1,2,4,5,6],part:1,pars:5,happili:1,than:[1,4],grew:1,target:5,provid:5,remov:5,stale:4,browser:[5,2],runner:0,mine:1,have:[1,2,5],need:[0,1,2,5],take:[5,2],churn:5,equival:2,rout:0,note:[1,5],also:[5,2],client:5,build:5,singl:[0,4],montgomeri:1,track:0,who:5,reach:1,add_cron_job:2,most:[1,2],beta:4,detect:6,alpha:4,misconfigur:5,don:5,url:5,doc:[1,4],request:[1,5],drive:0,doe:5,declar:5,determin:2,link:5,show:4,syntax:5,trivial:1,celeri:1,access:[5,2],locat:[0,5],just:[1,6,5],configur:[0,5,2,4],solut:1,should:[1,5],contribut:[0,1,3],get:[1,2,5],familiar:5,likewis:[1,5],stop:2,geek:1,requir:[5,2,4],bar:1,reload:[0,2,4],bad:1,pydog:1,common:1,contain:5,where:5,view:[5,4],set:[0,1,2,4,5],knowledg:1,see:[0,5],respons:[5,2],fail:5,hammer:4,arm:1,wire:4,hopefulli:1,someth:1,spam_fail:4,won:5,"1h10m":2,email:[0,1,4,5],attribut:6,altern:[0,1],job:[0,2,6],come:5,minut:[1,5],both:[1,2],expos:5,alon:5,improv:6,com:5,comment:4,point:5,overview:0,inspir:[0,1],param:4,three:1,accumul:1,basic:5,immedi:2,andrew:1,ani:5,togeth:1,countless:1,"case":5,ingredi:[0,1],myself:1,look:[1,5],servic:1,can:[5,2],defin:[0,5],"while":2,behavior:[0,5],everyon:1,demo:[0,5],them:[1,5],activ:5,itself:2,develop:4,author:3,suggest:1,make:[0,5],python:5,complex:1,document:[2,4],howarth:3,complet:2,http:5,user:[5,2,6],extern:5,weird:6,appropri:5,kept:1,well:1,exampl:[1,5],command:[5,2],thi:[1,2,5],model:6,roughli:2,execut:[0,1,2,4,5,6],less:2,when:[1,2,5],relianc:1,kill:2,administ:[1,5],task_command:2,web:[0,2],easi:[0,1],except:2,littl:1,add:[4,6],schedul:[0,5,2],els:1,save:1,eunic:3,raven:6,speedrack_set:5,applic:[0,1,2,5],read:5,know:5,password:2,saniti:6,like:[1,5],lost:1,manual:[4,6],resolv:5,server:[5,4],pithi:6,necessari:5,output:0,page:[4,6],therein:5,www:5,right:[1,2,5],often:5,twitter:1,some:[1,5],gevent:[5,4],sampl:5,flush:6,definit:[0,5],per:2,slash:5,localhost:5,machin:1,investig:1,run:[0,1,2,6,5],gratitud:[0,1],host:2,task_sudo_us:2,about:[0,1],actual:5,plai:1,regular:[0,1],own:5,effici:1,easy_instal:5,libev:[5,4],down:2,contributor:[0,3],your:5,merg:4,spam:4,support:[0,5,4],stylesheet:5,avail:4,start:5,interfac:[0,2],low:0,lot:1,interv:[2,6],fork:1,hear:1,line:1,"true":2,bug:1,pull:1,made:1,"default":2,bugfix:4,displai:6,day_of_week:2,otherwis:4,featur:1,dure:1,speedrack:[0,1,2,4,5],file:[5,4],pip:5,check:5,probabl:1,excel:1,refactor:6,prepend:5,field:1,futur:[0,6],test:[1,6,5],you:[0,1,2,5],nice:1,node:[0,1],fail_by_stderr:2,intend:0,deserv:0,reduc:4,sphinx:4,longer:[1,4],directori:5,descript:4,time:[1,5],prototyp:4},objtypes:{},titles:["Speedrack","About","Task Execution","Contributors","Changes","Installation and Demo Mode","Todo"],objnames:{},filenames:["index","about","task execution","contributors","changes","setup","todo"]})PKI"Dڿ speedrack-latest/search.html Search — Speedrack 0.6.1 documentation

Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.
PKI"DkCH+H+$speedrack-latest/task execution.html Task Execution — Speedrack 0.6.1 documentation

Task Execution

Scheduling

Speedrack uses simple strings for interval (1h10m) and APScheduler’s add_cron_job for cron scheduling (e.g. { "day_of_week": 2, "hour": 23 }. The most current documentation is in the app itself, under the Help tab.

Speedrack can launch jobs immediately via the Run Now button.

Success / Failure

FAIL_BY_NONZERO_STATUS_CODE and FAIL_BY_STDERR determine different indicators of task failure, both defaulted to true. Setting both of these to false will work, but you’ll get less information in the task browser.

This is also configurable per task. The administrator is responsible for getting the defaults / exceptions right.

Sudo control

Sudo execution requires the hosting user to have password-free sudo access to the given user. Commands will end up being roughly equivalent to:

$ sudo -u task_sudo_user task_command

Config Reloading

When you reload the application via the web interface, Speedrack waits for all current tasks to complete. This means that if you have a task that is going to take two hours to complete, it might be a while before Speedrack shuts down. Kill and restart Speedrack if you need it to stop and reload right this second.

Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.
PKI"D$$speedrack-latest/todo.html Todo — Speedrack 0.6.1 documentation

Todo

1.0

  • more tests
  • refactor models.Executor / Task / aps.executor_func

Future

  • detect sanity of config variables to ensure no weird write failures
  • “retain X previous failures”, to prevent issues from being flushed out by successes in display
  • add ability to list all jobs (or what, 100?) if asked instead of pithy message
  • add users - no auth, just cookie for attribution
  • run now improvements - store “manual execution” in job history / display? / store “executed by”?
  • failure notification - raven / sentry
  • live update of page? via pjax - 5s interval
Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.
PKI"D{?speedrack-latest/.buildinfo# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: 0f1d1b1345f68fff1a12520671ab1890 tags: fbb0d17656682115ca4d033fb2f83ba1 PKI"D%}"""speedrack-latest/contributors.html Contributors — Speedrack 0.6.1 documentation

Contributors

Authored by Clint Howarth.

With contributions from:

  • Jonathan Eunice
Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.
PKI"D&--speedrack-latest/about.html About — Speedrack 0.6.1 documentation

About

What’s a speedrack? At a bar or food service event, the most common mixins are kept at arm-level, for efficiency — this is the speedrack. Every reach is lost time, more fatigue, and the line gets longer. Likewise, every reach for data or regular task execution, the line’s getting longer.

Like a lot of geeks, I’ll work three days to save myself three minutes during crunch times. It’s nice when things just work.

(note: this took longer than three days)

Ingredients

Speedrack is made from Flask, Twitter Bootstrap, and APScheduler.

Contributing

Some notes to hopefully save some effort on everyone’s part.

  • Bugs: love to hear about them!
  • Simple contributions (known bugs, docs, typos, tweaks): just fork and request pull (tests <3)
  • Complex contributions (new features): email first
  • Suggestions to do it right: Save yourself time. :)

Gratitude and Inspiration

The good parts of this Flask application drew on knowledge and practices that Andrew Roberts and I accumulated in our work together. He’s excellent; the bad parts are all mine.

Speedrack was inspired by Pydog, by Philip Montgomery. My team used Pydog happily for years, but as our reliance on it grew, we needed something a little more stable. We already loved Flask, so it was an easy choice.

Alternatives

Please, play the field. This solution works well for my team, but you should look at what else is out there.

For example, if you have a group of machines you’d like to run tasks on, please investigate Celery or RQ — they’re both quality work. There are countless alternatives, and most of them are probably better than this.

Speedrack is trivial to set up and administer. It runs well on one node. It’s a good bad solution.

Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.
PKI"D@]]speedrack-latest/genindex.html Index — Speedrack 0.6.1 documentation

Index

Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.
PKI"D66speedrack-latest/setup.html Installation and Demo Mode — Speedrack 0.6.1 documentation

Installation and Demo Mode

Speedrack requires Python 2.6+. Python comes with easy_install.

(If you don’t have pip, prepend the following instructions with: easy_install pip)

pip install speedrack
speedrack run

Open a browser at http://localhost:8118, see the demo tasks churning (can take a minute). Note that some of the test tasks are designed to fail (and often), to illustrate what failure would look like. Likewise with misconfigured tasks, and so on.

Don’t expose this to the internet; it’s not even trying for security.

(If you have have libevent/gevent installed, Speedrack will run using that. Flask’s dev server is fine, too.)

Configuration

speedrack init <target directory>

This will write two files to the target directory: speedrack_settings.py and speedrack_tasks.yaml. They’re the settings from the demo mode and are useful to build your tasks from.

Application settings

speedrack_settings.py contains application behavior: your application name, mail server settings, and so on. You won’t need them all. If you’re not familiar with python, you don’t need to learn it to administer this application — just stick with the simple declarative syntax.

Sub-path support

If Speedrack is running at a non-root location on a domain (e.g., http://www.example.com/speedrack/ resolves to the application root view), then you’ll need to let Speedrack know to modify the URLs it makes appropriately. In your configuration file, set the variable SCRIPT_NAME to whatever path prefix points to the Speedrack index (in this case, SCRIPT_NAME = '/speedrack').

Note

This setting alone does not actually change how Speedrack parses requests. Rather, this tells Speedrack that when it generates a URL, it should prefix it with the provided string. This means that when the client clicks a link or requests a stylesheet in the original response, the new request is pointed at the right location.

Speedrack also needs to be told where the URLs it generates in the emails it sends should point. The variable EMAIL_URL_PREFIX should be set to the external root URL of the application (no trailing slash), and then links will be relative to that root URL.

Task definitions and behavior

speedrack_tasks.yaml defines each task: a shell command and schedule of execution. The sample file contains the tasks used for the demo you started with.

Warning

Restrict access to this file. Speedrack reads this file and executes the commands therein, as the user who launched speedrack. speedrack init gets the basic settings correct, but if you build your own, you should remove global write (and group, if necessary).

Running

Once you’ve got your settings and tasks in place:

speedrack run --settings speedrack_settings.py --tasks speedrack_tasks.yaml

Browse http://localhost:8118/config to check your active configuration at any time.

Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.
PKI"DV|speedrack-latest/objects.inv# Sphinx inventory version 2 # Project: Speedrack # Version: 0.6.1 # The remainder of this file is compressed using zlib. xOKIP(.IILJQ5T(ͅJe(+槔*xShBu@&%g*AC$r1PKI"D&# , ,speedrack-latest/index.html Speedrack — Speedrack 0.6.1 documentation

Speedrack

Speedrack is a single-node cron system with an attractive web interface, job-tracking and configurable notification via email. It’s not the task runner you need, but it might be the one you deserve.

It is intended to drive regular executions of low-resource shell scripts, routing output to defined locations. The web front end makes it easy to see a high-level overview. It’s convenient and easy.

Contents:

Read the Docs v: latest
Versions
latest
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.
PKI"D-\y3y3-speedrack-latest/.doctrees/environment.pickle(csphinx.environment BuildEnvironment qoq}q(Udlfilesqcsphinx.util FilenameUniqDict q)qc__builtin__ set q]RqbUappq NU _warnfuncq NUtitlesq }q (Uindexq cdocutils.nodes title q)q}q(U rawsourceqUU attributesq}q(Udupnamesq]Uclassesq]Ubackrefsq]Uidsq]Unamesq]uUchildrenq]qcdocutils.nodes Text qX Speedrackqq}q(hX SpeedrackqUparentq hubaUtagnameq!Utitleq"ubUaboutq#h)q$}q%(hUh}q&(h]h]h]h]h]uh]q'hXAboutq(q)}q*(hXAboutq+h h$ubah!h"ubUtask executionq,h)q-}q.(hUh}q/(h]h]h]h]h]uh]q0hXTask Executionq1q2}q3(hXTask Executionq4h h-ubah!h"ubU contributorsq5h)q6}q7(hUh}q8(h]h]h]h]h]uh]q9hX Contributorsq:q;}q<(hX Contributorsq=h h6ubah!h"ubUtodoq>h)q?}q@(hUh}qA(h]h]h]h]h]uh]qBhXTodoqCqD}qE(hXTodoqFh h?ubah!h"ubUsetupqGh)qH}qI(hUh}qJ(h]h]h]h]h]uh]qKhXInstallation and Demo ModeqLqM}qN(hXInstallation and Demo ModeqOh hHubah!h"ubUchangesqPh)qQ}qR(hUh}qS(h]h]h]h]h]uh]qThXChangesqUqV}qW(hXChangesqXh hQubah!h"ubuU domaindataqY}qZ(Ustdq[}q\(Uversionq]KU anonlabelsq^}q_(Umodindexq`U py-modindexUUgenindexqahaUUsearchqbUsearchUuUlabelsqc}qd(h`U py-modindexUcsphinx.locale _TranslationProxy qecsphinx.locale mygettext qfU Module IndexqgqhhfhgqibhahaUhehfUIndexqjqkhfhjqlbhbhbUhehfU Search PageqmqnhfhmqobuU progoptionsqp}qqUobjectsqr}qsuUc}qt(hr}quh]KuUpyqv}qw(hr}qxUmodulesqy}qzh]KuUjsq{}q|(hr}q}h]KuUrstq~}q(hr}qh]KuUcppq}q(hr}qh]KuuU glob_toctreesqh]RqU reread_alwaysqh]RqU doctreedirqUL/var/build/user_builds/speedrack/checkouts/latest/docs/_build/html/.doctreesqUversioning_conditionqU citationsq}h]K)UsrcdirqU6/var/build/user_builds/speedrack/checkouts/latest/docsqUconfigqcsphinx.config Config q)q}q(U html_contextq}q(U using_themeU html_themeqUsphinx_rtd_themeqUcurrent_versionqUlatestqU new_themeUPRODUCTION_DOMAINUreadthedocs.orgU github_userUNoneqUanalytics_codeUUdisplay_githubU downloads]q(UPDFU@https://media.readthedocs.org/pdf/speedrack/latest/speedrack.pdfqUHTMLUDhttps://media.readthedocs.org/htmlzip/speedrack/latest/speedrack.zipqUEpubUBhttps://media.readthedocs.org/epub/speedrack/latest/speedrack.epubqeU READTHEDOCSU conf_py_pathU/docs/U github_repohUslugqU speedrackqUnameqX speedrackUversions]qhU /en/latest/qaUgithub_versionUdefaultqU MEDIA_URLqUhttps://media.readthedocs.org/uUpygments_styleqUsphinxqUhtmlhelp_basenameqU SpeedrackdochhU master_docqUindexqU source_suffixqU.rstUtexinfo_documentsq]q(UindexqU SpeedrackqXSpeedrack DocumentationqX Clint HowarthqhU One line description of project.U MiscellaneoustqaU copyrightqX2012, Clint HowarthUexclude_patternsq]qU_buildqah]U0.6.1qU man_pagesq]q(hhh]qhaKtqaU html_styleqNUhtml_theme_optionsq}Utemplates_pathq]q(UA/home/docs/checkouts/readthedocs.org/readthedocs/templates/sphinxqhhhU _templatesqeUlatex_documentsq]q(hU Speedrack.texhhUmanualtqaUhtml_static_pathq]q(U_staticqUI/home/docs/checkouts/readthedocs.org/readthedocs/templates/sphinx/_staticqhhheUhtml_theme_pathq]q(U_themesqhhhheUlatex_elementsq}UlanguageqXenqU overridesq}qhhsUprojectqX SpeedrackU extensionsq]q(Ureadthedocs_ext.readthedocsqU"readthedocs_ext.readthedocshtmldirqhhhhhheUreleaseqhUsetupqNubUmetadataq}q(h }h#}h,}h5}h>}hG}hP}uUversionchangesq}Utoc_num_entriesq}q(h Kh#Kh,Kh5Kh>KhGKhPKuUimagesqh)qh]RqbUnumbered_toctreesqh]RqU found_docsqh]q(h h#h,h5h>hGhPeRqU longtitlesq}q(h hh#h$h,h-h5h6h>h?hGhHhPhQuU dependenciesq}Utoctree_includesq}qh ]q(XsetupqXtask executionqXaboutqXchangesqX contributorsqXtodoqesU temp_dataq}Utocsq}q(h cdocutils.nodes bullet_list q)q}q(hUh}q(h]h]h]h]h]uh]qcdocutils.nodes list_item q)q}q(hUh}q(h]h]h]h]h]uh hh]q(csphinx.addnodes compact_paragraph q)q}q(hUh}q(h]h]h]h]h]uh hh]rcdocutils.nodes reference r)r}r(hUh}r(U anchornameUUrefurih h]h]h]h]h]Uinternaluh hh]rhX Speedrackrr}r(hhh jubah!U referencer ubah!Ucompact_paragraphr ubh)r }r (hUh}r (h]h]h]h]h]uh hh]rcsphinx.addnodes toctree r)r}r(hUh}r(UnumberedKUparenth U titlesonlyUglobh]h]h]h]h]Uentries]r(NhrNhrNhrNhrNhrNhreUhiddenU includefiles]r(hhhhhheUmaxdepthKuh j h]h!Utoctreerubah!U bullet_listrubeh!U list_itemrubah!jubh#h)r}r(hUh}r (h]h]h]h]h]uh]r!(h)r"}r#(hUh}r$(h]h]h]h]h]uh jh]r%(h)r&}r'(hUh}r((h]h]h]h]h]uh j"h]r)j)r*}r+(hUh}r,(U anchornameUUrefurih#h]h]h]h]h]Uinternaluh j&h]r-hXAboutr.r/}r0(hh+h j*ubah!j ubah!j ubh)r1}r2(hUh}r3(h]h]h]h]h]uh j"h]r4(h)r5}r6(hUh}r7(h]h]h]h]h]uh j1h]r8h)r9}r:(hUh}r;(h]h]h]h]h]uh j5h]r<j)r=}r>(hUh}r?(U anchornameU #ingredientsUrefurih#h]h]h]h]h]Uinternaluh j9h]r@hX IngredientsrArB}rC(hX IngredientsrDh j=ubah!j ubah!j ubah!jubh)rE}rF(hUh}rG(h]h]h]h]h]uh j1h]rHh)rI}rJ(hUh}rK(h]h]h]h]h]uh jEh]rLj)rM}rN(hUh}rO(U anchornameU #contributingUrefurih#h]h]h]h]h]Uinternaluh jIh]rPhX ContributingrQrR}rS(hX ContributingrTh jMubah!j ubah!j ubah!jubh)rU}rV(hUh}rW(h]h]h]h]h]uh j1h]rXh)rY}rZ(hUh}r[(h]h]h]h]h]uh jUh]r\j)r]}r^(hUh}r_(U anchornameU#gratitude-and-inspirationUrefurih#h]h]h]h]h]Uinternaluh jYh]r`hXGratitude and Inspirationrarb}rc(hXGratitude and Inspirationrdh j]ubah!j ubah!j ubah!jubeh!jubeh!jubh)re}rf(hUh}rg(h]h]h]h]h]uh jh]rhh)ri}rj(hUh}rk(h]h]h]h]h]uh jeh]rlj)rm}rn(hUh}ro(U anchornameU #alternativesUrefurih#h]h]h]h]h]Uinternaluh jih]rphX Alternativesrqrr}rs(hX Alternativesrth jmubah!j ubah!j ubah!jubeh!jubh,h)ru}rv(hUh}rw(h]h]h]h]h]uh]rxh)ry}rz(hUh}r{(h]h]h]h]h]uh juh]r|(h)r}}r~(hUh}r(h]h]h]h]h]uh jyh]rj)r}r(hUh}r(U anchornameUUrefurih,h]h]h]h]h]Uinternaluh j}h]rhXTask Executionrr}r(hh4h jubah!j ubah!j ubh)r}r(hUh}r(h]h]h]h]h]uh jyh]r(h)r}r(hUh}r(h]h]h]h]h]uh jh]rh)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hUh}r(U anchornameU #schedulingUrefurih,h]h]h]h]h]Uinternaluh jh]rhX Schedulingrr}r(hX Schedulingrh jubah!j ubah!j ubah!jubh)r}r(hUh}r(h]h]h]h]h]uh jh]rh)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hUh}r(U anchornameU#success-failureUrefurih,h]h]h]h]h]Uinternaluh jh]rhXSuccess / Failurerr}r(hXSuccess / Failurerh jubah!j ubah!j ubah!jubh)r}r(hUh}r(h]h]h]h]h]uh jh]rh)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hUh}r(U anchornameU #sudo-controlUrefurih,h]h]h]h]h]Uinternaluh jh]rhX Sudo controlrr}r(hX Sudo controlrh jubah!j ubah!j ubah!jubh)r}r(hUh}r(h]h]h]h]h]uh jh]rh)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hUh}r(U anchornameU#config-reloadingUrefurih,h]h]h]h]h]Uinternaluh jh]rhXConfig Reloadingrr}r(hXConfig Reloadingrh jubah!j ubah!j ubah!jubeh!jubeh!jubah!jubh5h)r}r(hUh}r(h]h]h]h]h]uh]rh)r}r(hUh}r(h]h]h]h]h]uh jh]rh)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hUh}r(U anchornameUUrefurih5h]h]h]h]h]Uinternaluh jh]rhX Contributorsrr}r(hh=h jubah!j ubah!j ubah!jubah!jubh>h)r}r(hUh}r(h]h]h]h]h]uh]rh)r}r(hUh}r(h]h]h]h]h]uh jh]r(h)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hUh}r(U anchornameUUrefurih>h]h]h]h]h]Uinternaluh jh]rhXTodorr}r(hhFh jubah!j ubah!j ubh)r}r(hUh}r(h]h]h]h]h]uh jh]r(h)r}r(hUh}r(h]h]h]h]h]uh jh]rh)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hUh}r(U anchornameU#id1Urefurih>h]h]h]h]h]Uinternaluh jh]rhX1.0rr}r(hX1.0rh jubah!j ubah!j ubah!jubh)r}r(hUh}r(h]h]h]h]h]uh jh]r h)r }r (hUh}r (h]h]h]h]h]uh jh]r j)r}r(hUh}r(U anchornameU#futureUrefurih>h]h]h]h]h]Uinternaluh j h]rhXFuturerr}r(hXFuturerh jubah!j ubah!j ubah!jubeh!jubeh!jubah!jubhGh)r}r(hUh}r(h]h]h]h]h]uh]r(h)r}r(hUh}r(h]h]h]h]h]uh jh]rh)r}r(hUh}r (h]h]h]h]h]uh jh]r!j)r"}r#(hUh}r$(U anchornameUUrefurihGh]h]h]h]h]Uinternaluh jh]r%hXInstallation and Demo Moder&r'}r((hhOh j"ubah!j ubah!j ubah!jubh)r)}r*(hUh}r+(h]h]h]h]h]uh jh]r,(h)r-}r.(hUh}r/(h]h]h]h]h]uh j)h]r0j)r1}r2(hUh}r3(U anchornameU#configurationUrefurihGh]h]h]h]h]Uinternaluh j-h]r4hX Configurationr5r6}r7(hX Configurationh j1ubah!j ubah!j ubh)r8}r9(hUh}r:(h]h]h]h]h]uh j)h]r;h)r<}r=(hUh}r>(h]h]h]h]h]uh j8h]r?h)r@}rA(hUh}rB(h]h]h]h]h]uh j<h]rCj)rD}rE(hUh}rF(U anchornameU#application-settingsUrefurihGh]h]h]h]h]Uinternaluh j@h]rGhXApplication settingsrHrI}rJ(hXApplication settingsh jDubah!j ubah!j ubah!jubah!jubeh!jubh)rK}rL(hUh}rM(h]h]h]h]h]uh jh]rN(h)rO}rP(hUh}rQ(h]h]h]h]h]uh jKh]rRj)rS}rT(hUh}rU(U anchornameU#sub-path-supportUrefurihGh]h]h]h]h]Uinternaluh jOh]rVhXSub-path supportrWrX}rY(hXSub-path supporth jSubah!j ubah!j ubh)rZ}r[(hUh}r\(h]h]h]h]h]uh jKh]r]h)r^}r_(hUh}r`(h]h]h]h]h]uh jZh]rah)rb}rc(hUh}rd(h]h]h]h]h]uh j^h]rej)rf}rg(hUh}rh(U anchornameU#task-definitions-and-behaviorUrefurihGh]h]h]h]h]Uinternaluh jbh]rihXTask definitions and behaviorrjrk}rl(hXTask definitions and behaviorh jfubah!j ubah!j ubah!jubah!jubeh!jubh)rm}rn(hUh}ro(h]h]h]h]h]uh jh]rph)rq}rr(hUh}rs(h]h]h]h]h]uh jmh]rtj)ru}rv(hUh}rw(U anchornameU#runningUrefurihGh]h]h]h]h]Uinternaluh jqh]rxhXRunningryrz}r{(hXRunningh juubah!j ubah!j ubah!jubeh!jubhPh)r|}r}(hUh}r~(h]h]h]h]h]uh]rh)r}r(hUh}r(h]h]h]h]h]uh j|h]rh)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hUh}r(U anchornameUUrefurihPh]h]h]h]h]Uinternaluh jh]rhXChangesrr}r(hhXh jubah!j ubah!j ubah!jubah!jubuU indexentriesr}r(h ]h#]h,]h5]h>]hG]hP]uUall_docsr}r(h GAԱ`ލh#GAԱ`Mh,GAԱ`Rh5GAԱ` h>GAԱ`XhGGAԱ`GhPGAԱ`JAuUsettingsr}r(Ucloak_email_addressesrUtrim_footnote_reference_spacerU halt_levelrKUsectsubtitle_xformrUembed_stylesheetrU pep_base_urlrUhttp://www.python.org/dev/peps/rUdoctitle_xformrUwarning_streamrcsphinx.util.nodes WarningStream r)r}r(U_rercre _compile rU+\((DEBUG|INFO|WARNING|ERROR|SEVERE)/[0-4]\)rKRrUwarnfuncrNubUenvrhU rfc_base_urlrUhttp://tools.ietf.org/html/rUgettext_compactrUinput_encodingrU utf-8-sigruUfiles_to_rebuildr}r(hh]rh aRrhh]rh aRrhh]rh aRrhh]rh aRrhh]rh aRrhh]rh aRruUtoc_secnumbersr}U_nitpick_ignorerh]Rrub.PKI"Du\Jm.m.*speedrack-latest/.doctrees/changes.doctreecdocutils.nodes document q)q}q(U nametypesq}qXchangesqNsUsubstitution_defsq}qUparse_messagesq ]q Ucurrent_sourceq NU decorationq NUautofootnote_startq KUnameidsq}qhUchangesqsUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qXB/var/build/user_builds/speedrack/checkouts/latest/docs/changes.rstqq}qbUtagnameqUsectionqU attributesq}q (Udupnamesq!]Uclassesq"]Ubackrefsq#]Uidsq$]q%haUnamesq&]q'hauUlineq(KUdocumentq)hh]q*(cdocutils.nodes title q+)q,}q-(hXChangesq.hhhhhUtitleq/h}q0(h!]h"]h#]h$]h&]uh(Kh)hh]q1cdocutils.nodes Text q2XChangesq3q4}q5(hh.hh,ubaubcdocutils.nodes definition_list q6)q7}q8(hUhhhhhUdefinition_listq9h}q:(h!]h"]h#]h$]h&]uh(Nh)hh]q;(cdocutils.nodes definition_list_item q<)q=}q>(hXT0.6.0 added SCRIPT_NAME configuration variable for supporting sub-path server roots hh7hhhUdefinition_list_itemq?h}q@(h!]h"]h#]h$]h&]uh(Kh]qA(cdocutils.nodes term qB)qC}qD(hX0.6.0qEhh=hhhUtermqFh}qG(h!]h"]h#]h$]h&]uh(Kh]qHh2X0.6.0qIqJ}qK(hhEhhCubaubcdocutils.nodes definition qL)qM}qN(hUh}qO(h!]h"]h#]h$]h&]uhh=h]qPcdocutils.nodes paragraph qQ)qR}qS(hXMadded SCRIPT_NAME configuration variable for supporting sub-path server rootsqThhMhhhU paragraphqUh}qV(h!]h"]h#]h$]h&]uh(Kh]qWh2XMadded SCRIPT_NAME configuration variable for supporting sub-path server rootsqXqY}qZ(hhThhRubaubahU definitionq[ubeubh<)q\}q](hXF0.5.2 bugfix for APScheduler stale dependency and overambitious setup hh7hhhh?h}q^(h!]h"]h#]h$]h&]uh(K h)hh]q_(hB)q`}qa(hX0.5.2qbhh\hhhhFh}qc(h!]h"]h#]h$]h&]uh(K h]qdh2X0.5.2qeqf}qg(hhbhh`ubaubhL)qh}qi(hUh}qj(h!]h"]h#]h$]h&]uhh\h]qkhQ)ql}qm(hX?bugfix for APScheduler stale dependency and overambitious setupqnhhhhhhhUh}qo(h!]h"]h#]h$]h&]uh(K h]qph2X?bugfix for APScheduler stale dependency and overambitious setupqqqr}qs(hhnhhlubaubahh[ubeubh<)qt}qu(hX0.5.1 bugfix for sudo controls hh7hhhh?h}qv(h!]h"]h#]h$]h&]uh(K h)hh]qw(hB)qx}qy(hX0.5.1qzhhthhhhFh}q{(h!]h"]h#]h$]h&]uh(K h]q|h2X0.5.1q}q~}q(hhzhhxubaubhL)q}q(hUh}q(h!]h"]h#]h$]h&]uhhth]qhQ)q}q(hXbugfix for sudo controlsqhhhhhhUh}q(h!]h"]h#]h$]h&]uh(K h]qh2Xbugfix for sudo controlsqq}q(hhhhubaubahh[ubeubh<)q}q(hXl0.5 added in-app manual suspension of tasks, more convenient than commenting out task in yaml and reloading hh7hhhh?h}q(h!]h"]h#]h$]h&]uh(Kh)hh]q(hB)q}q(hX0.5qhhhhhhFh}q(h!]h"]h#]h$]h&]uh(Kh]qh2X0.5qq}q(hhhhubaubhL)q}q(hUh}q(h!]h"]h#]h$]h&]uhhh]qhQ)q}q(hXgadded in-app manual suspension of tasks, more convenient than commenting out task in yaml and reloadingqhhhhhhUh}q(h!]h"]h#]h$]h&]uh(Kh]qh2Xgadded in-app manual suspension of tasks, more convenient than commenting out task in yaml and reloadingqq}q(hhhhubaubahh[ubeubh<)q}q(hX0.4.1 bugfix for spam_fail hh7hhhh?h}q(h!]h"]h#]h$]h&]uh(Kh)hh]q(hB)q}q(hX0.4.1qhhhhhhFh}q(h!]h"]h#]h$]h&]uh(Kh]qh2X0.4.1qq}q(hhhhubaubhL)q}q(hUh}q(h!]h"]h#]h$]h&]uhhh]qhQ)q}q(hXbugfix for spam_failqhhhhhhUh}q(h!]h"]h#]h$]h&]uh(Kh]qh2Xbugfix for spam_failqq}q(hhhhubaubahh[ubeubh<)q}q(hX<0.4 added spam_fail setting, for hammering failure messages hh7hhhh?h}q(h!]h"]h#]h$]h&]uh(Kh)hh]q(hB)q}q(hX0.4qhhhhhhFh}q(h!]h"]h#]h$]h&]uh(Kh]qh2X0.4qŅq}q(hhhhubaubhL)q}q(hUh}q(h!]h"]h#]h$]h&]uhhh]qhQ)q}q(hX7added spam_fail setting, for hammering failure messagesqhhhhhhUh}q(h!]h"]h#]h$]h&]uh(Kh]qh2X7added spam_fail setting, for hammering failure messagesqхq}q(hhhhubaubahh[ubeubh<)q}q(hX!0.3.1 added simple sudo controls hh7hhhh?h}q(h!]h"]h#]h$]h&]uh(Kh)hh]q(hB)q}q(hX0.3.1qhhhhhhFh}q(h!]h"]h#]h$]h&]uh(Kh]qh2X0.3.1q݅q}q(hhhhubaubhL)q}q(hUh}q(h!]h"]h#]h$]h&]uhhh]qhQ)q}q(hXadded simple sudo controlsqhhhhhhUh}q(h!]h"]h#]h$]h&]uh(Kh]qh2Xadded simple sudo controlsq酁q}q(hhhhubaubahh[ubeubh<)q}q(hX$0.3.0 fixed email and spam settings hh7hhhh?h}q(h!]h"]h#]h$]h&]uh(Kh)hh]q(hB)q}q(hX0.3.0qhhhhhhFh}q(h!]h"]h#]h$]h&]uh(Kh]qh2X0.3.0qq}q(hhhhubaubhL)q}q(hUh}q(h!]h"]h#]h$]h&]uhhh]qhQ)q}q(hXfixed email and spam settingsqhhhhhhUh}q(h!]h"]h#]h$]h&]uh(Kh]rh2Xfixed email and spam settingsrr}r(hhhhubaubahh[ubeubh<)r}r(hX=0.2.11 add params tab to show single-task execution criteria hh7hhhh?h}r(h!]h"]h#]h$]h&]uh(Kh)hh]r(hB)r}r (hX0.2.11r hjhhhhFh}r (h!]h"]h#]h$]h&]uh(Kh]r h2X0.2.11r r}r(hj hjubaubhL)r}r(hUh}r(h!]h"]h#]h$]h&]uhjh]rhQ)r}r(hX5add params tab to show single-task execution criteriarhjhhhhUh}r(h!]h"]h#]h$]h&]uh(Kh]rh2X5add params tab to show single-task execution criteriarr}r(hjhjubaubahh[ubeubh<)r}r(hX0.2.10 add single-file view hh7hhhh?h}r(h!]h"]h#]h$]h&]uh(K!h)hh]r(hB)r }r!(hX0.2.10r"hjhhhhFh}r#(h!]h"]h#]h$]h&]uh(K!h]r$h2X0.2.10r%r&}r'(hj"hj ubaubhL)r(}r)(hUh}r*(h!]h"]h#]h$]h&]uhjh]r+hQ)r,}r-(hXadd single-file viewr.hj(hhhhUh}r/(h!]h"]h#]h$]h&]uh(K!h]r0h2Xadd single-file viewr1r2}r3(hj.hj,ubaubahh[ubeubh<)r4}r5(hX\0.2.9 reduce number of copied version strings add placeholder for tasks with no description hh7hhhh?h}r6(h!]h"]h#]h$]h&]uh(K%h)hh]r7(hB)r8}r9(hX0.2.9r:hj4hhhhFh}r;(h!]h"]h#]h$]h&]uh(K%h]r<h2X0.2.9r=r>}r?(hj:hj8ubaubhL)r@}rA(hUh}rB(h!]h"]h#]h$]h&]uhj4h]rChQ)rD}rE(hXUreduce number of copied version strings add placeholder for tasks with no descriptionrFhj@hhhhUh}rG(h!]h"]h#]h$]h&]uh(K$h]rHh2XUreduce number of copied version strings add placeholder for tasks with no descriptionrIrJ}rK(hjFhjDubaubahh[ubeubh<)rL}rM(hX 0.2.8 standard numbering scheme hh7hhhh?h}rN(h!]h"]h#]h$]h&]uh(K(h)hh]rO(hB)rP}rQ(hX0.2.8rRhjLhhhhFh}rS(h!]h"]h#]h$]h&]uh(K(h]rTh2X0.2.8rUrV}rW(hjRhjPubaubhL)rX}rY(hUh}rZ(h!]h"]h#]h$]h&]uhjLh]r[hQ)r\}r](hXstandard numbering schemer^hjXhhhhUh}r_(h!]h"]h#]h$]h&]uh(K(h]r`h2Xstandard numbering schemerarb}rc(hj^hj\ubaubahh[ubeubh<)rd}re(hX0.2.h use gevent if available, otherwise use Flask's development server gevent/libevent is no longer a hard requirement, and is not installed with speedrack hh7hhhh?h}rf(h!]h"]h#]h$]h&]uh(K,h)hh]rg(hB)rh}ri(hX0.2.hrjhjdhhhhFh}rk(h!]h"]h#]h$]h&]uh(K,h]rlh2X0.2.hrmrn}ro(hjjhjhubaubhL)rp}rq(hUh}rr(h!]h"]h#]h$]h&]uhjdh]rshQ)rt}ru(hXuse gevent if available, otherwise use Flask's development server gevent/libevent is no longer a hard requirement, and is not installed with speedrackrvhjphhhhUh}rw(h!]h"]h#]h$]h&]uh(K+h]rxh2Xuse gevent if available, otherwise use Flask's development server gevent/libevent is no longer a hard requirement, and is not installed with speedrackryrz}r{(hjvhjtubaubahh[ubeubh<)r|}r}(hXC0.2.f convert docs to sphinx documentation and wire to readthedocs hh7hhhh?h}r~(h!]h"]h#]h$]h&]uh(K/h)hh]r(hB)r}r(hX0.2.frhj|hhhhFh}r(h!]h"]h#]h$]h&]uh(K/h]rh2X0.2.frr}r(hjhjubaubhL)r}r(hUh}r(h!]h"]h#]h$]h&]uhj|h]rhQ)r}r(hX<convert docs to sphinx documentation and wire to readthedocsrhjhhhhUh}r(h!]h"]h#]h$]h&]uh(K/h]rh2X<convert docs to sphinx documentation and wire to readthedocsrr}r(hjhjubaubahh[ubeubh<)r}r(hX)0.2.e merge debug and config to one page hh7hhhh?h}r(h!]h"]h#]h$]h&]uh(K2h)hh]r(hB)r}r(hX0.2.erhjhhhhFh}r(h!]h"]h#]h$]h&]uh(K2h]rh2X0.2.err}r(hjhjubaubhL)r}r(hUh}r(h!]h"]h#]h$]h&]uhjh]rhQ)r}r(hX"merge debug and config to one pagerhjhhhhUh}r(h!]h"]h#]h$]h&]uh(K2h]rh2X"merge debug and config to one pagerr}r(hjhjubaubahh[ubeubh<)r}r(hX 0.2 beta hh7hhhh?h}r(h!]h"]h#]h$]h&]uh(K5h)hh]r(hB)r}r(hX0.2rhjhhhhFh}r(h!]h"]h#]h$]h&]uh(K5h]rh2X0.2rr}r(hjhjubaubhL)r}r(hUh}r(h!]h"]h#]h$]h&]uhjh]rhQ)r}r(hXbetarhjhhhhUh}r(h!]h"]h#]h$]h&]uh(K5h]rh2Xbetarr}r(hjhjubaubahh[ubeubh<)r}r(hX0.1 prototype/alphahh7hhhh?h}r(h!]h"]h#]h$]h&]uh(K7h)hh]r(hB)r}r(hX0.1rhjhhhhFh}r(h!]h"]h#]h$]h&]uh(K7h]rh2X0.1rr}r(hjhjubaubhL)r}r(hUh}r(h!]h"]h#]h$]h&]uhjh]rhQ)r}r(hXprototype/alpharhjhhhhUh}r(h!]h"]h#]h$]h&]uh(K8h]rh2Xprototype/alpharr}r(hjhjubaubahh[ubeubeubeubahUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh)hU current_linerNUtransform_messagesr]rUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNh/NUerror_encoding_error_handlerrUbackslashreplacer Udebugr NUembed_stylesheetr Uoutput_encoding_error_handlerr Ustrictr U sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8r U source_urlr!NUinput_encodingr"U utf-8-sigr#U_disable_configr$NU id_prefixr%UU tab_widthr&KUerror_encodingr'UUTF-8r(U_sourcer)UB/var/build/user_builds/speedrack/checkouts/latest/docs/changes.rstr*Ugettext_compactr+U generatorr,NUdump_internalsr-NU smart_quotesr.U pep_base_urlr/Uhttp://www.python.org/dev/peps/r0Usyntax_highlightr1Ulongr2Uinput_encoding_error_handlerr3j Uauto_id_prefixr4Uidr5Udoctitle_xformr6Ustrip_elements_with_classesr7NU _config_filesr8]Ufile_insertion_enabledr9KU raw_enabledr:KU dump_settingsr;NubUsymbol_footnote_startr<KUidsr=}r>hhsUsubstitution_namesr?}r@hh)h}rA(h!]h$]h#]Usourcehh"]h&]uU footnotesrB]rCUrefidsrD}rEub.PKI"DMNk k /speedrack-latest/.doctrees/contributors.doctreecdocutils.nodes document q)q}q(U nametypesq}qX contributorsqNsUsubstitution_defsq}qUparse_messagesq ]q Ucurrent_sourceq NU decorationq NUautofootnote_startq KUnameidsq}qhU contributorsqsUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qXG/var/build/user_builds/speedrack/checkouts/latest/docs/contributors.rstqq}qbUtagnameqUsectionqU attributesq}q (Udupnamesq!]Uclassesq"]Ubackrefsq#]Uidsq$]q%haUnamesq&]q'hauUlineq(KUdocumentq)hh]q*(cdocutils.nodes title q+)q,}q-(hX Contributorsq.hhhhhUtitleq/h}q0(h!]h"]h#]h$]h&]uh(Kh)hh]q1cdocutils.nodes Text q2X Contributorsq3q4}q5(hh.hh,ubaubcdocutils.nodes paragraph q6)q7}q8(hXAuthored by Clint Howarth.q9hhhhhU paragraphq:h}q;(h!]h"]h#]h$]h&]uh(Kh)hh]q}q?(hh9hh7ubaubh6)q@}qA(hXWith contributions from:qBhhhhhh:h}qC(h!]h"]h#]h$]h&]uh(Kh)hh]qDh2XWith contributions from:qEqF}qG(hhBhh@ubaubcdocutils.nodes bullet_list qH)qI}qJ(hUhhhhhU bullet_listqKh}qL(UbulletqMX-h$]h#]h!]h"]h&]uh(K h)hh]qNcdocutils.nodes list_item qO)qP}qQ(hXJonathan EuniceqRhhIhhhU list_itemqSh}qT(h!]h"]h#]h$]h&]uh(Nh)hh]qUh6)qV}qW(hhRhhPhhhh:h}qX(h!]h"]h#]h$]h&]uh(K h]qYh2XJonathan EuniceqZq[}q\(hhRhhVubaubaubaubeubahUU transformerq]NU footnote_refsq^}q_Urefnamesq`}qaUsymbol_footnotesqb]qcUautofootnote_refsqd]qeUsymbol_footnote_refsqf]qgU citationsqh]qih)hU current_lineqjNUtransform_messagesqk]qlUreporterqmNUid_startqnKU autofootnotesqo]qpU citation_refsqq}qrUindirect_targetsqs]qtUsettingsqu(cdocutils.frontend Values qvoqw}qx(Ufootnote_backlinksqyKUrecord_dependenciesqzNU rfc_base_urlq{Uhttp://tools.ietf.org/html/q|U tracebackq}Upep_referencesq~NUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh/NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesqUtrim_footnote_reference_spaceqUenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformqU source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqUG/var/build/user_builds/speedrack/checkouts/latest/docs/contributors.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesqU pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformqUstrip_elements_with_classesqNU _config_filesq]Ufile_insertion_enabledqKU raw_enabledqKU dump_settingsqNubUsymbol_footnote_startqKUidsq}qhhsUsubstitution_namesq}qhh)h}q(h!]h$]h#]Usourcehh"]h&]uU footnotesq]qUrefidsq}qub.PKI"D|z(speedrack-latest/.doctrees/index.doctreecdocutils.nodes document q)q}q(U nametypesq}qX speedrackqNsUsubstitution_defsq}qUparse_messagesq ]q Ucurrent_sourceq NU decorationq NUautofootnote_startq KUnameidsq}qhU speedrackqsUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qX@/var/build/user_builds/speedrack/checkouts/latest/docs/index.rstqq}qbUtagnameqUsectionqU attributesq}q (Udupnamesq!]Uclassesq"]Ubackrefsq#]Uidsq$]q%haUnamesq&]q'hauUlineq(KUdocumentq)hh]q*(cdocutils.nodes title q+)q,}q-(hX Speedrackq.hhhhhUtitleq/h}q0(h!]h"]h#]h$]h&]uh(Kh)hh]q1cdocutils.nodes Text q2X Speedrackq3q4}q5(hh.hh,ubaubcdocutils.nodes paragraph q6)q7}q8(hXSpeedrack is a single-node cron system with an attractive web interface, job-tracking and configurable notification via email. It's not the task runner you need, but it might be the one you deserve.q9hhhhhU paragraphq:h}q;(h!]h"]h#]h$]h&]uh(Kh)hh]q}q?(hh9hh7ubaubh6)q@}qA(hXIt is intended to drive regular executions of low-resource shell scripts, routing output to defined locations. The web front end makes it easy to see a high-level overview. It's convenient and easy.qBhhhhhh:h}qC(h!]h"]h#]h$]h&]uh(Kh)hh]qDh2XIt is intended to drive regular executions of low-resource shell scripts, routing output to defined locations. The web front end makes it easy to see a high-level overview. It's convenient and easy.qEqF}qG(hhBhh@ubaubh6)qH}qI(hX Contents:qJhhhhhh:h}qK(h!]h"]h#]h$]h&]uh(K h)hh]qLh2X Contents:qMqN}qO(hhJhhHubaubcdocutils.nodes compound qP)qQ}qR(hUhhhhhUcompoundqSh}qT(h!]h"]qUUtoctree-wrapperqVah#]h$]h&]uh(Nh)hh]qWcsphinx.addnodes toctree qX)qY}qZ(hUhhQhhhUtoctreeq[h}q\(Unumberedq]KhUindexq^U titlesonlyq_Uglobq`h$]h#]h!]h"]h&]Uentriesqa]qb(NXsetupqcqdNXtask executionqeqfNXaboutqgqhNXchangesqiqjNX contributorsqkqlNXtodoqmqneUhiddenqoU includefilesqp]qq(hchehghihkhmeUmaxdepthqrKuh(K h]ubaubeubahUU transformerqsNU footnote_refsqt}quUrefnamesqv}qwUsymbol_footnotesqx]qyUautofootnote_refsqz]q{Usymbol_footnote_refsq|]q}U citationsq~]qh)hU current_lineqNUtransform_messagesq]qUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh/NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesqUtrim_footnote_reference_spaceqUenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformqU source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqU@/var/build/user_builds/speedrack/checkouts/latest/docs/index.rstqUgettext_compactqˆU generatorqNUdump_internalsqNU smart_quotesqʼnU pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformq͉Ustrip_elements_with_classesqNU _config_filesq]qUfile_insertion_enabledqKU raw_enabledqKU dump_settingsqNubUsymbol_footnote_startqKUidsq}qhhsUsubstitution_namesq}qhh)h}q(h!]h$]h#]Usourcehh"]h&]uU footnotesq]qUrefidsq}qub.PKI"DԞF77(speedrack-latest/.doctrees/about.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XceleryqXaboutqNXrqqX ingredientsq NXflaskq X alternativesq NXtwitter bootstrapq X contributingq NX apschedulerqXpydogqXandrew robertsqXgratitude and inspirationqNuUsubstitution_defsq}qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUceleryqhUaboutqhUrqqh U ingredientsqh Uflaskqh U alternativesq h Utwitter-bootstrapq!h U contributingq"hU apschedulerq#hUpydogq$hUandrew-robertsq%hUgratitude-and-inspirationq&uUchildrenq']q((cdocutils.nodes section q))q*}q+(U rawsourceq,UUparentq-hUsourceq.cdocutils.nodes reprunicode q/X@/var/build/user_builds/speedrack/checkouts/latest/docs/about.rstq0q1}q2bUtagnameq3Usectionq4U attributesq5}q6(Udupnamesq7]Uclassesq8]Ubackrefsq9]Uidsq:]q;haUnamesq<]q=hauUlineq>KUdocumentq?hh']q@(cdocutils.nodes title qA)qB}qC(h,XAboutqDh-h*h.h1h3UtitleqEh5}qF(h7]h8]h9]h:]h<]uh>Kh?hh']qGcdocutils.nodes Text qHXAboutqIqJ}qK(h,hDh-hBubaubcdocutils.nodes paragraph qL)qM}qN(h,X$What's a *speedrack*? At a bar or food service event, the most common mixins are kept at arm-level, for efficiency — this is the speedrack. Every reach is lost time, more fatigue, and the line gets longer. Likewise, every reach for data or regular task execution, the line's getting longer.qOh-h*h.h1h3U paragraphqPh5}qQ(h7]h8]h9]h:]h<]uh>Kh?hh']qR(hHX What's a qSqT}qU(h,X What's a h-hMubcdocutils.nodes emphasis qV)qW}qX(h,X *speedrack*h5}qY(h7]h8]h9]h:]h<]uh-hMh']qZhHX speedrackq[q\}q](h,Uh-hWubah3Uemphasisq^ubhHX? At a bar or food service event, the most common mixins are kept at arm-level, for efficiency — this is the speedrack. Every reach is lost time, more fatigue, and the line gets longer. Likewise, every reach for data or regular task execution, the line's getting longer.q_q`}qa(h,X? At a bar or food service event, the most common mixins are kept at arm-level, for efficiency — this is the speedrack. Every reach is lost time, more fatigue, and the line gets longer. Likewise, every reach for data or regular task execution, the line's getting longer.h-hMubeubhL)qb}qc(h,X|Like a lot of geeks, I'll work three days to save myself three minutes during crunch times. It's nice when things just work.qdh-h*h.h1h3hPh5}qe(h7]h8]h9]h:]h<]uh>Kh?hh']qfhHX|Like a lot of geeks, I'll work three days to save myself three minutes during crunch times. It's nice when things just work.qgqh}qi(h,hdh-hbubaubhL)qj}qk(h,X((note: this took longer than three days)qlh-h*h.h1h3hPh5}qm(h7]h8]h9]h:]h<]uh>Kh?hh']qnhHX((note: this took longer than three days)qoqp}qq(h,hlh-hjubaubh))qr}qs(h,Uh-h*h.h1h3h4h5}qt(h7]h8]h9]h:]quhah<]qvh auh>K h?hh']qw(hA)qx}qy(h,X Ingredientsqzh-hrh.h1h3hEh5}q{(h7]h8]h9]h:]h<]uh>K h?hh']q|hHX Ingredientsq}q~}q(h,hzh-hxubaubhL)q}q(h,XFSpeedrack is made from Flask_, `Twitter Bootstrap`_, and APScheduler_.qh-hrh.h1h3hPh5}q(h7]h8]h9]h:]h<]uh>K h?hh']q(hHXSpeedrack is made from qq}q(h,XSpeedrack is made from h-hubcdocutils.nodes reference q)q}q(h,XFlask_UresolvedqKh-hh3U referenceqh5}q(UnameXFlaskUrefuriqXhttp://flask.pocoo.orgqh:]h9]h7]h8]h<]uh']qhHXFlaskqq}q(h,Uh-hubaubhHX, qq}q(h,X, h-hubh)q}q(h,X`Twitter Bootstrap`_hKh-hh3hh5}q(UnameXTwitter BootstraphX#http://twitter.github.com/bootstrapqh:]h9]h7]h8]h<]uh']qhHXTwitter Bootstrapqq}q(h,Uh-hubaubhHX, and qq}q(h,X, and h-hubh)q}q(h,X APScheduler_hKh-hh3hh5}q(UnameX APSchedulerhX'http://packages.python.org/APScheduler/qh:]h9]h7]h8]h<]uh']qhHX APSchedulerqq}q(h,Uh-hubaubhHX.q}q(h,X.h-hubeubeubh))q}q(h,Uh-h*h.h1h3h4h5}q(h7]h8]h9]h:]qh"ah<]qh auh>Kh?hh']q(hA)q}q(h,X Contributingqh-hh.h1h3hEh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHX Contributingqq}q(h,hh-hubaubhL)q}q(h,X<Some notes to hopefully save some effort on everyone's part.qh-hh.h1h3hPh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHX<Some notes to hopefully save some effort on everyone's part.qq}q(h,hh-hubaubcdocutils.nodes bullet_list q)q}q(h,Uh-hh.h1h3U bullet_listqh5}q(UbulletqX-h:]h9]h7]h8]h<]uh>Kh?hh']q(cdocutils.nodes list_item q)q}q(h,X *Bugs*: love to hear about them!qh-hh.h1h3U list_itemqh5}q(h7]h8]h9]h:]h<]uh>Nh?hh']qhL)q}q(h,hh-hh.h1h3hPh5}q(h7]h8]h9]h:]h<]uh>Kh']q(hV)q}q(h,X*Bugs*h5}q(h7]h8]h9]h:]h<]uh-hh']qhHXBugsq؅q}q(h,Uh-hubah3h^ubhHX: love to hear about them!qۅq}q(h,X: love to hear about them!h-hubeubaubh)q}q(h,X_*Simple contributions* (known bugs, docs, typos, tweaks): just fork and request pull (tests <3)qh-hh.h1h3hh5}q(h7]h8]h9]h:]h<]uh>Nh?hh']qhL)q}q(h,hh-hh.h1h3hPh5}q(h7]h8]h9]h:]h<]uh>Kh']q(hV)q}q(h,X*Simple contributions*h5}q(h7]h8]h9]h:]h<]uh-hh']qhHXSimple contributionsq녁q}q(h,Uh-hubah3h^ubhHXI (known bugs, docs, typos, tweaks): just fork and request pull (tests <3)qq}q(h,XI (known bugs, docs, typos, tweaks): just fork and request pull (tests <3)h-hubeubaubh)q}q(h,X5*Complex contributions* (new features): *email first*qh-hh.h1h3hh5}q(h7]h8]h9]h:]h<]uh>Nh?hh']qhL)q}q(h,hh-hh.h1h3hPh5}q(h7]h8]h9]h:]h<]uh>Kh']q(hV)q}q(h,X*Complex contributions*h5}q(h7]h8]h9]h:]h<]uh-hh']qhHXComplex contributionsqq}r(h,Uh-hubah3h^ubhHX (new features): rr}r(h,X (new features): h-hubhV)r}r(h,X *email first*h5}r(h7]h8]h9]h:]h<]uh-hh']rhHX email firstrr }r (h,Uh-jubah3h^ubeubaubh)r }r (h,X5*Suggestions to do it right*: Save yourself time. :) h-hh.h1h3hh5}r (h7]h8]h9]h:]h<]uh>Nh?hh']rhL)r}r(h,X4*Suggestions to do it right*: Save yourself time. :)rh-j h.h1h3hPh5}r(h7]h8]h9]h:]h<]uh>Kh']r(hV)r}r(h,X*Suggestions to do it right*h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXSuggestions to do it rightrr}r(h,Uh-jubah3h^ubhHX: Save yourself time. :)rr}r(h,X: Save yourself time. :)h-jubeubaubeubeubh))r}r(h,Uh-h*h.h1h3h4h5}r (h7]h8]h9]h:]r!h&ah<]r"hauh>Kh?hh']r#(hA)r$}r%(h,XGratitude and Inspirationr&h-jh.h1h3hEh5}r'(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHXGratitude and Inspirationr)r*}r+(h,j&h-j$ubaubhL)r,}r-(h,XThe good parts of this Flask application drew on knowledge and practices that `Andrew Roberts`_ and I accumulated in our work together. He's excellent; the bad parts are all mine.r.h-jh.h1h3hPh5}r/(h7]h8]h9]h:]h<]uh>Kh?hh']r0(hHXNThe good parts of this Flask application drew on knowledge and practices that r1r2}r3(h,XNThe good parts of this Flask application drew on knowledge and practices that h-j,ubh)r4}r5(h,X`Andrew Roberts`_hKh-j,h3hh5}r6(UnameXAndrew RobertshXhttps://github.com/arobertsr7h:]h9]h7]h8]h<]uh']r8hHXAndrew Robertsr9r:}r;(h,Uh-j4ubaubhHXT and I accumulated in our work together. He's excellent; the bad parts are all mine.r<r=}r>(h,XT and I accumulated in our work together. He's excellent; the bad parts are all mine.h-j,ubeubhL)r?}r@(h,XSpeedrack was inspired by Pydog_, by Philip Montgomery. My team used Pydog happily for years, but as our reliance on it grew, we needed something a little more stable. We already loved Flask_, so it was an easy choice.rAh-jh.h1h3hPh5}rB(h7]h8]h9]h:]h<]uh>Kh?hh']rC(hHXSpeedrack was inspired by rDrE}rF(h,XSpeedrack was inspired by h-j?ubh)rG}rH(h,XPydog_hKh-j?h3hh5}rI(UnameXPydoghXhttp://pydog.sourceforge.netrJh:]h9]h7]h8]h<]uh']rKhHXPydogrLrM}rN(h,Uh-jGubaubhHX, by Philip Montgomery. My team used Pydog happily for years, but as our reliance on it grew, we needed something a little more stable. We already loved rOrP}rQ(h,X, by Philip Montgomery. My team used Pydog happily for years, but as our reliance on it grew, we needed something a little more stable. We already loved h-j?ubh)rR}rS(h,XFlask_hKh-j?h3hh5}rT(UnameXFlaskhhh:]h9]h7]h8]h<]uh']rUhHXFlaskrVrW}rX(h,Uh-jRubaubhHX, so it was an easy choice.rYrZ}r[(h,X, so it was an easy choice.h-j?ubeubcdocutils.nodes target r\)r]}r^(h,X<.. _`Twitter Bootstrap`: http://twitter.github.com/bootstrapU referencedr_Kh-jh.h1h3Utargetr`h5}ra(hhh:]rbh!ah9]h7]h8]h<]rch auh>K h?hh']ubj\)rd}re(h,X'.. _Pydog: http://pydog.sourceforge.netj_Kh-jh.h1h3j`h5}rf(hjJh:]rgh$ah9]h7]h8]h<]rhhauh>K!h?hh']ubj\)ri}rj(h,X!.. _Flask: http://flask.pocoo.orgj_Kh-jh.h1h3j`h5}rk(hhh:]rlhah9]h7]h8]h<]rmh auh>K"h?hh']ubj\)rn}ro(h,X8.. _APScheduler: http://packages.python.org/APScheduler/j_Kh-jh.h1h3j`h5}rp(hhh:]rqh#ah9]h7]h8]h<]rrhauh>K#h?hh']ubj\)rs}rt(h,X1.. _`Andrew Roberts`: https://github.com/arobertsj_Kh-jh.h1h3j`h5}ru(hj7h:]rvh%ah9]h7]h8]h<]rwhauh>K$h?hh']ubeubeubh))rx}ry(h,Uh-hh.h1h3h4h5}rz(h7]h8]h9]h:]r{h ah<]r|h auh>K'h?hh']r}(hA)r~}r(h,X Alternativesrh-jxh.h1h3hEh5}r(h7]h8]h9]h:]h<]uh>K'h?hh']rhHX Alternativesrr}r(h,jh-j~ubaubhL)r}r(h,XlPlease, play the field. This solution works well for my team, but you should look at what else is out there.rh-jxh.h1h3hPh5}r(h7]h8]h9]h:]h<]uh>K)h?hh']rhHXlPlease, play the field. This solution works well for my team, but you should look at what else is out there.rr}r(h,jh-jubaubhL)r}r(h,XFor example, if you have a group of machines you'd like to run tasks on, please investigate `Celery`_ or `RQ`_ — they're both quality work. There are countless alternatives, and most of them are probably better than this.rh-jxh.h1h3hPh5}r(h7]h8]h9]h:]h<]uh>K+h?hh']r(hHX\For example, if you have a group of machines you'd like to run tasks on, please investigate rr}r(h,X\For example, if you have a group of machines you'd like to run tasks on, please investigate h-jubh)r}r(h,X `Celery`_hKh-jh3hh5}r(UnameXCeleryhXhttp://celeryproject.orgrh:]h9]h7]h8]h<]uh']rhHXCeleryrr}r(h,Uh-jubaubhHX or rr}r(h,X or h-jubh)r}r(h,X`RQ`_hKh-jh3hh5}r(UnameXRQhXhttp://nvie.github.com/rqrh:]h9]h7]h8]h<]uh']rhHXRQrr}r(h,Uh-jubaubhHXq — they're both quality work. There are countless alternatives, and most of them are probably better than this.rr}r(h,Xq — they're both quality work. There are countless alternatives, and most of them are probably better than this.h-jubeubhL)r}r(h,XbSpeedrack is trivial to set up and administer. It runs well on one node. It's a good bad solution.rh-jxh.h1h3hPh5}r(h7]h8]h9]h:]h<]uh>K-h?hh']rhHXbSpeedrack is trivial to set up and administer. It runs well on one node. It's a good bad solution.rr}r(h,jh-jubaubj\)r}r(h,X$.. _Celery: http://celeryproject.orgj_Kh-jxh.h1h3j`h5}r(hjh:]rhah9]h7]h8]h<]rhauh>K/h?hh']ubj\)r}r(h,X!.. _RQ: http://nvie.github.com/rqj_Kh-jxh.h1h3j`h5}r(hjh:]rhah9]h7]h8]h<]rhauh>K0h?hh']ubeubeh,UU transformerrNU footnote_refsr}rUrefnamesr}r(Xtwitter bootstrap]rhaXrq]rjaXflask]r(hjReXcelery]rjaX apscheduler]rhaXpydog]rjGaXandrew roberts]rj4auUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh?hU current_linerNUtransform_messagesr]rUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhENUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8r U source_urlr NUinput_encodingr U utf-8-sigr U_disable_configr NU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerU@/var/build/user_builds/speedrack/checkouts/latest/docs/about.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesr NU _config_filesr!]Ufile_insertion_enabledr"KU raw_enabledr#KU dump_settingsr$NubUsymbol_footnote_startr%KUidsr&}r'(hjhh*h!j]hhrhjih jxh%jsh"hh#jnh$jdh&jhjuUsubstitution_namesr(}r)h3h?h5}r*(h7]h:]h9]Usourceh1h8]h<]uU footnotesr+]r,Urefidsr-}r.ub.PKI"DZ&EE(speedrack-latest/.doctrees/setup.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XrunningqNXapplication settingsqNXinstallation and demo modeqNXsub-path supportq NXgeventq X configurationq NXtask definitions and behaviorq NuUsubstitution_defsq }qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUrunningqhUapplication-settingsqhUinstallation-and-demo-modeqh Usub-path-supportqh Ugeventqh U configurationqh Utask-definitions-and-behaviorquUchildrenq]q(cdocutils.nodes section q)q }q!(U rawsourceq"UUparentq#hUsourceq$cdocutils.nodes reprunicode q%X@/var/build/user_builds/speedrack/checkouts/latest/docs/setup.rstq&q'}q(bUtagnameq)Usectionq*U attributesq+}q,(Udupnamesq-]Uclassesq.]Ubackrefsq/]Uidsq0]q1haUnamesq2]q3hauUlineq4KUdocumentq5hh]q6(cdocutils.nodes title q7)q8}q9(h"XInstallation and Demo Modeq:h#h h$h'h)Utitleq;h+}q<(h-]h.]h/]h0]h2]uh4Kh5hh]q=cdocutils.nodes Text q>XInstallation and Demo Modeq?q@}qA(h"h:h#h8ubaubcdocutils.nodes paragraph qB)qC}qD(h"XASpeedrack requires *Python 2.6+*. Python comes with easy_install.qEh#h h$h'h)U paragraphqFh+}qG(h-]h.]h/]h0]h2]uh4Kh5hh]qH(h>XSpeedrack requires qIqJ}qK(h"XSpeedrack requires h#hCubcdocutils.nodes emphasis qL)qM}qN(h"X *Python 2.6+*h+}qO(h-]h.]h/]h0]h2]uh#hCh]qPh>X Python 2.6+qQqR}qS(h"Uh#hMubah)UemphasisqTubh>X!. Python comes with easy_install.qUqV}qW(h"X!. Python comes with easy_install.h#hCubeubhB)qX}qY(h"XZ(If you don't have ``pip``, prepend the following instructions with: ``easy_install pip``)qZh#h h$h'h)hFh+}q[(h-]h.]h/]h0]h2]uh4Kh5hh]q\(h>X(If you don't have q]q^}q_(h"X(If you don't have h#hXubcdocutils.nodes literal q`)qa}qb(h"X``pip``h+}qc(h-]h.]h/]h0]h2]uh#hXh]qdh>Xpipqeqf}qg(h"Uh#haubah)Uliteralqhubh>X+, prepend the following instructions with: qiqj}qk(h"X+, prepend the following instructions with: h#hXubh`)ql}qm(h"X``easy_install pip``h+}qn(h-]h.]h/]h0]h2]uh#hXh]qoh>Xeasy_install pipqpqq}qr(h"Uh#hlubah)hhubh>X)qs}qt(h"X)h#hXubeubcdocutils.nodes literal_block qu)qv}qw(h"X#pip install speedrack speedrack runh#h h$h'h)U literal_blockqxh+}qy(U xml:spaceqzUpreserveq{h0]h/]h-]h.]h2]uh4K h5hh]q|h>X#pip install speedrack speedrack runq}q~}q(h"Uh#hvubaubhB)q}q(h"XOpen a browser at ``http://localhost:8118``, see the demo tasks churning (can take a minute). Note that some of the test tasks are designed to fail (and often), to illustrate what failure would look like. Likewise with misconfigured tasks, and so on.qh#h h$h'h)hFh+}q(h-]h.]h/]h0]h2]uh4K h5hh]q(h>XOpen a browser at qq}q(h"XOpen a browser at h#hubh`)q}q(h"X``http://localhost:8118``h+}q(h-]h.]h/]h0]h2]uh#hh]qh>Xhttp://localhost:8118qq}q(h"Uh#hubah)hhubh>X, see the demo tasks churning (can take a minute). Note that some of the test tasks are designed to fail (and often), to illustrate what failure would look like. Likewise with misconfigured tasks, and so on.qq}q(h"X, see the demo tasks churning (can take a minute). Note that some of the test tasks are designed to fail (and often), to illustrate what failure would look like. Likewise with misconfigured tasks, and so on.h#hubeubhB)q}q(h"XIDon't expose this to the internet; **it's not even trying for security**.qh#h h$h'h)hFh+}q(h-]h.]h/]h0]h2]uh4Kh5hh]q(h>X#Don't expose this to the internet; qq}q(h"X#Don't expose this to the internet; h#hubcdocutils.nodes strong q)q}q(h"X%**it's not even trying for security**h+}q(h-]h.]h/]h0]h2]uh#hh]qh>X!it's not even trying for securityqq}q(h"Uh#hubah)Ustrongqubh>X.q}q(h"X.h#hubeubhB)q}q(h"Xp(If you have have libevent/`gevent`_ installed, Speedrack will run using that. Flask's dev server is fine, too.)qh#h h$h'h)hFh+}q(h-]h.]h/]h0]h2]uh4Kh5hh]q(h>X(If you have have libevent/qq}q(h"X(If you have have libevent/h#hubcdocutils.nodes reference q)q}q(h"X `gevent`_UresolvedqKh#hh)U referenceqh+}q(UnameXgeventqUrefuriqXhttp://www.gevent.orgqh0]h/]h-]h.]h2]uh]qh>Xgeventqq}q(h"Uh#hubaubh>XL installed, Speedrack will run using that. Flask's dev server is fine, too.)qq}q(h"XL installed, Speedrack will run using that. Flask's dev server is fine, too.)h#hubeubcdocutils.nodes target q)q}q(h"X!.. _gevent: http://www.gevent.orgU referencedqKh#h h$h'h)Utargetqh+}q(hhh0]qhah/]h-]h.]h2]qh auh4Kh5hh]ubeubh)q}q(h"Uh#hh$h'h)h*h+}q(h-]h.]h/]h0]qhah2]qh auh4Kh5hh]q(h7)q}q(h"X Configurationqh#hh$h'h)h;h+}q(h-]h.]h/]h0]h2]uh4Kh5hh]qh>X ConfigurationqЅq}q(h"hh#hubaubhu)q}q(h"X!speedrack init h#hh$h'h)hxh+}q(hzh{h0]h/]h-]h.]h2]uh4Kh5hh]qh>X!speedrack init qׅq}q(h"Uh#hubaubhB)q}q(h"XThis will write two files to the target directory: ``speedrack_settings.py`` and ``speedrack_tasks.yaml``. They're the settings from the demo mode and are useful to build your tasks from.qh#hh$h'h)hFh+}q(h-]h.]h/]h0]h2]uh4Kh5hh]q(h>X3This will write two files to the target directory: q߅q}q(h"X3This will write two files to the target directory: h#hubh`)q}q(h"X``speedrack_settings.py``h+}q(h-]h.]h/]h0]h2]uh#hh]qh>Xspeedrack_settings.pyq慁q}q(h"Uh#hubah)hhubh>X and q酁q}q(h"X and h#hubh`)q}q(h"X``speedrack_tasks.yaml``h+}q(h-]h.]h/]h0]h2]uh#hh]qh>Xspeedrack_tasks.yamlqq}q(h"Uh#hubah)hhubh>XR. They're the settings from the demo mode and are useful to build your tasks from.qq}q(h"XR. They're the settings from the demo mode and are useful to build your tasks from.h#hubeubh)q}q(h"Uh#hh$h'h)h*h+}q(h-]h.]h/]h0]qhah2]qhauh4Kh5hh]q(h7)q}q(h"XApplication settingsqh#hh$h'h)h;h+}q(h-]h.]h/]h0]h2]uh4Kh5hh]rh>XApplication settingsrr}r(h"hh#hubaubhB)r}r(h"X``speedrack_settings.py`` contains *application behavior*: your application name, mail server settings, and so on. You won't need them all. If you're not familiar with python, you don't need to learn it to administer this application — just stick with the simple declarative syntax.rh#hh$h'h)hFh+}r(h-]h.]h/]h0]h2]uh4K!h5hh]r(h`)r }r (h"X``speedrack_settings.py``h+}r (h-]h.]h/]h0]h2]uh#jh]r h>Xspeedrack_settings.pyr r}r(h"Uh#j ubah)hhubh>X contains rr}r(h"X contains h#jubhL)r}r(h"X*application behavior*h+}r(h-]h.]h/]h0]h2]uh#jh]rh>Xapplication behaviorrr}r(h"Uh#jubah)hTubh>X: your application name, mail server settings, and so on. You won't need them all. If you're not familiar with python, you don't need to learn it to administer this application — just stick with the simple declarative syntax.rr}r(h"X: your application name, mail server settings, and so on. You won't need them all. If you're not familiar with python, you don't need to learn it to administer this application — just stick with the simple declarative syntax.h#jubeubeubeubh)r}r(h"Uh#hh$h'h)h*h+}r(h-]h.]h/]h0]r hah2]r!h auh4K$h5hh]r"(h7)r#}r$(h"XSub-path supportr%h#jh$h'h)h;h+}r&(h-]h.]h/]h0]h2]uh4K$h5hh]r'h>XSub-path supportr(r)}r*(h"j%h#j#ubaubhB)r+}r,(h"XIf Speedrack is running at a non-root location on a domain (e.g., http://www.example.com/speedrack/ resolves to the application root view), then you'll need to let Speedrack know to modify the URLs it makes appropriately. In your configuration file, set the variable ``SCRIPT_NAME`` to whatever path prefix points to the Speedrack index (in this case, ``SCRIPT_NAME = '/speedrack'``).r-h#jh$h'h)hFh+}r.(h-]h.]h/]h0]h2]uh4K&h5hh]r/(h>XBIf Speedrack is running at a non-root location on a domain (e.g., r0r1}r2(h"XBIf Speedrack is running at a non-root location on a domain (e.g., h#j+ubh)r3}r4(h"X!http://www.example.com/speedrack/r5h+}r6(Urefurij5h0]h/]h-]h.]h2]uh#j+h]r7h>X!http://www.example.com/speedrack/r8r9}r:(h"Uh#j3ubah)hubh>X resolves to the application root view), then you'll need to let Speedrack know to modify the URLs it makes appropriately. In your configuration file, set the variable r;r<}r=(h"X resolves to the application root view), then you'll need to let Speedrack know to modify the URLs it makes appropriately. In your configuration file, set the variable h#j+ubh`)r>}r?(h"X``SCRIPT_NAME``h+}r@(h-]h.]h/]h0]h2]uh#j+h]rAh>X SCRIPT_NAMErBrC}rD(h"Uh#j>ubah)hhubh>XF to whatever path prefix points to the Speedrack index (in this case, rErF}rG(h"XF to whatever path prefix points to the Speedrack index (in this case, h#j+ubh`)rH}rI(h"X``SCRIPT_NAME = '/speedrack'``h+}rJ(h-]h.]h/]h0]h2]uh#j+h]rKh>XSCRIPT_NAME = '/speedrack'rLrM}rN(h"Uh#jHubah)hhubh>X).rOrP}rQ(h"X).h#j+ubeubcdocutils.nodes note rR)rS}rT(h"XNThis setting alone does not actually change how Speedrack **parses** requests. Rather, this tells Speedrack that when it **generates** a URL, it should prefix it with the provided string. This means that when the client clicks a link or requests a stylesheet in the original response, the new request is pointed at the right location.rUh#jh$h'h)UnoterVh+}rW(h-]h.]h/]h0]h2]uh4Nh5hh]rXhB)rY}rZ(h"jUh#jSh$h'h)hFh+}r[(h-]h.]h/]h0]h2]uh4K(h]r\(h>X:This setting alone does not actually change how Speedrack r]r^}r_(h"X:This setting alone does not actually change how Speedrack h#jYubh)r`}ra(h"X **parses**h+}rb(h-]h.]h/]h0]h2]uh#jYh]rch>Xparsesrdre}rf(h"Uh#j`ubah)hubh>X5 requests. Rather, this tells Speedrack that when it rgrh}ri(h"X5 requests. Rather, this tells Speedrack that when it h#jYubh)rj}rk(h"X **generates**h+}rl(h-]h.]h/]h0]h2]uh#jYh]rmh>X generatesrnro}rp(h"Uh#jjubah)hubh>X a URL, it should prefix it with the provided string. This means that when the client clicks a link or requests a stylesheet in the original response, the new request is pointed at the right location.rqrr}rs(h"X a URL, it should prefix it with the provided string. This means that when the client clicks a link or requests a stylesheet in the original response, the new request is pointed at the right location.h#jYubeubaubhB)rt}ru(h"XSpeedrack also needs to be told where the URLs it generates in the emails it sends should point. The variable ``EMAIL_URL_PREFIX`` should be set to the external root URL of the application (no trailing slash), and then links will be relative to that root URL.rvh#jh$h'h)hFh+}rw(h-]h.]h/]h0]h2]uh4K*h5hh]rx(h>XnSpeedrack also needs to be told where the URLs it generates in the emails it sends should point. The variable ryrz}r{(h"XnSpeedrack also needs to be told where the URLs it generates in the emails it sends should point. The variable h#jtubh`)r|}r}(h"X``EMAIL_URL_PREFIX``h+}r~(h-]h.]h/]h0]h2]uh#jth]rh>XEMAIL_URL_PREFIXrr}r(h"Uh#j|ubah)hhubh>X should be set to the external root URL of the application (no trailing slash), and then links will be relative to that root URL.rr}r(h"X should be set to the external root URL of the application (no trailing slash), and then links will be relative to that root URL.h#jtubeubh)r}r(h"Uh#jh$h'h)h*h+}r(h-]h.]h/]h0]rhah2]rh auh4K-h5hh]r(h7)r}r(h"XTask definitions and behaviorrh#jh$h'h)h;h+}r(h-]h.]h/]h0]h2]uh4K-h5hh]rh>XTask definitions and behaviorrr}r(h"jh#jubaubhB)r}r(h"X``speedrack_tasks.yaml`` defines each *task*: a shell command and schedule of execution. The sample file contains the tasks used for the demo you started with.rh#jh$h'h)hFh+}r(h-]h.]h/]h0]h2]uh4K/h5hh]r(h`)r}r(h"X``speedrack_tasks.yaml``h+}r(h-]h.]h/]h0]h2]uh#jh]rh>Xspeedrack_tasks.yamlrr}r(h"Uh#jubah)hhubh>X defines each rr}r(h"X defines each h#jubhL)r}r(h"X*task*h+}r(h-]h.]h/]h0]h2]uh#jh]rh>Xtaskrr}r(h"Uh#jubah)hTubh>Xs: a shell command and schedule of execution. The sample file contains the tasks used for the demo you started with.rr}r(h"Xs: a shell command and schedule of execution. The sample file contains the tasks used for the demo you started with.h#jubeubcdocutils.nodes warning r)r}r(h"X **Restrict access to this file.** Speedrack reads this file and executes the commands therein, *as the user who launched speedrack*. ``speedrack init`` gets the basic settings correct, but if you build your own, you should remove global write (and group, if necessary).rh#jh$h'h)Uwarningrh+}r(h-]h.]h/]h0]h2]uh4Nh5hh]rhB)r}r(h"jh#jh$h'h)hFh+}r(h-]h.]h/]h0]h2]uh4K1h]r(h)r}r(h"X!**Restrict access to this file.**h+}r(h-]h.]h/]h0]h2]uh#jh]rh>XRestrict access to this file.rr}r(h"Uh#jubah)hubh>X> Speedrack reads this file and executes the commands therein, rr}r(h"X> Speedrack reads this file and executes the commands therein, h#jubhL)r}r(h"X$*as the user who launched speedrack*h+}r(h-]h.]h/]h0]h2]uh#jh]rh>X"as the user who launched speedrackrr}r(h"Uh#jubah)hTubh>X. rr}r(h"X. h#jubh`)r}r(h"X``speedrack init``h+}r(h-]h.]h/]h0]h2]uh#jh]rh>Xspeedrack initrr}r(h"Uh#jubah)hhubh>Xv gets the basic settings correct, but if you build your own, you should remove global write (and group, if necessary).rr}r(h"Xv gets the basic settings correct, but if you build your own, you should remove global write (and group, if necessary).h#jubeubaubeubeubh)r}r(h"Uh#hh$h'h)h*h+}r(h-]h.]h/]h0]rhah2]rhauh4K4h5hh]r(h7)r}r(h"XRunningrh#jh$h'h)h;h+}r(h-]h.]h/]h0]h2]uh4K4h5hh]rh>XRunningrr}r(h"jh#jubaubhB)r}r(h"X1Once you've got your settings and tasks in place:rh#jh$h'h)hFh+}r(h-]h.]h/]h0]h2]uh4K6h5hh]rh>X1Once you've got your settings and tasks in place:rr}r(h"jh#jubaubhu)r}r(h"XKspeedrack run --settings speedrack_settings.py --tasks speedrack_tasks.yamlh#jh$h'h)hxh+}r(hzh{h0]h/]h-]h.]h2]uh4K:h5hh]rh>XKspeedrack run --settings speedrack_settings.py --tasks speedrack_tasks.yamlrr}r(h"Uh#jubaubhB)r}r(h"XWBrowse ``http://localhost:8118/config`` to check your active configuration at any time.rh#jh$h'h)hFh+}r(h-]h.]h/]h0]h2]uh4KXBrowse rr}r(h"XBrowse h#jubh`)r}r(h"X ``http://localhost:8118/config``h+}r(h-]h.]h/]h0]h2]uh#jh]rh>Xhttp://localhost:8118/configrr}r(h"Uh#jubah)hhubh>X0 to check your active configuration at any time.rr}r(h"X0 to check your active configuration at any time.h#jubeubeubeh"UU transformerrNU footnote_refsr}rUrefnamesr}r h]r hasUsymbol_footnotesr ]r Uautofootnote_refsr ]rUsymbol_footnote_refsr]rU citationsr]rh5hU current_linerNUtransform_messagesr]rUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror }r!(Ufootnote_backlinksr"KUrecord_dependenciesr#NU rfc_base_urlr$Uhttp://tools.ietf.org/html/r%U tracebackr&Upep_referencesr'NUstrip_commentsr(NU toc_backlinksr)Uentryr*U language_coder+Uenr,U datestampr-NU report_levelr.KU _destinationr/NU halt_levelr0KU strip_classesr1Nh;NUerror_encoding_error_handlerr2Ubackslashreplacer3Udebugr4NUembed_stylesheetr5Uoutput_encoding_error_handlerr6Ustrictr7U sectnum_xformr8KUdump_transformsr9NU docinfo_xformr:KUwarning_streamr;NUpep_file_url_templater<Upep-%04dr=Uexit_status_levelr>KUconfigr?NUstrict_visitorr@NUcloak_email_addressesrAUtrim_footnote_reference_spacerBUenvrCNUdump_pseudo_xmlrDNUexpose_internalsrENUsectsubtitle_xformrFU source_linkrGNUrfc_referencesrHNUoutput_encodingrIUutf-8rJU source_urlrKNUinput_encodingrLU utf-8-sigrMU_disable_configrNNU id_prefixrOUU tab_widthrPKUerror_encodingrQUUTF-8rRU_sourcerSU@/var/build/user_builds/speedrack/checkouts/latest/docs/setup.rstrTUgettext_compactrUU generatorrVNUdump_internalsrWNU smart_quotesrXU pep_base_urlrYUhttp://www.python.org/dev/peps/rZUsyntax_highlightr[Ulongr\Uinput_encoding_error_handlerr]j7Uauto_id_prefixr^Uidr_Udoctitle_xformr`Ustrip_elements_with_classesraNU _config_filesrb]rcUfile_insertion_enabledrdKU raw_enabledreKU dump_settingsrfNubUsymbol_footnote_startrgKUidsrh}ri(hhhjhjhhhjhh hhuUsubstitution_namesrj}rkh)h5h+}rl(h-]h0]h/]Usourceh'h.]h2]uU footnotesrm]rnUrefidsro}rpub.PKI"D9Z}}'speedrack-latest/.doctrees/todo.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X1.0qNXfutureqNXtodoqNuUsubstitution_defsq }q Uparse_messagesq ]q Ucurrent_sourceq NU decorationqNUautofootnote_startqKUnameidsq}q(hUid1qhUfutureqhUtodoquUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qX?/var/build/user_builds/speedrack/checkouts/latest/docs/todo.rstqq}q bUtagnameq!Usectionq"U attributesq#}q$(Udupnamesq%]Uclassesq&]Ubackrefsq']Uidsq(]q)haUnamesq*]q+hauUlineq,KUdocumentq-hh]q.(cdocutils.nodes title q/)q0}q1(hXTodoq2hhhhh!Utitleq3h#}q4(h%]h&]h']h(]h*]uh,Kh-hh]q5cdocutils.nodes Text q6XTodoq7q8}q9(hh2hh0ubaubh)q:}q;(hUhhhhh!h"h#}q<(h%]h&]h']h(]q=hah*]q>hauh,Kh-hh]q?(h/)q@}qA(hX1.0qBhh:hhh!h3h#}qC(h%]h&]h']h(]h*]uh,Kh-hh]qDh6X1.0qEqF}qG(hhBhh@ubaubcdocutils.nodes bullet_list qH)qI}qJ(hUhh:hhh!U bullet_listqKh#}qL(UbulletqMX-h(]h']h%]h&]h*]uh,Kh-hh]qN(cdocutils.nodes list_item qO)qP}qQ(hX more testsqRhhIhhh!U list_itemqSh#}qT(h%]h&]h']h(]h*]uh,Nh-hh]qUcdocutils.nodes paragraph qV)qW}qX(hhRhhPhhh!U paragraphqYh#}qZ(h%]h&]h']h(]h*]uh,Kh]q[h6X more testsq\q]}q^(hhRhhWubaubaubhO)q_}q`(hX4refactor models.Executor / Task / aps.executor_func hhIhhh!hSh#}qa(h%]h&]h']h(]h*]uh,Nh-hh]qbhV)qc}qd(hX3refactor models.Executor / Task / aps.executor_funcqehh_hhh!hYh#}qf(h%]h&]h']h(]h*]uh,K h]qgh6X3refactor models.Executor / Task / aps.executor_funcqhqi}qj(hhehhcubaubaubeubeubh)qk}ql(hUhhhhh!h"h#}qm(h%]h&]h']h(]qnhah*]qohauh,K h-hh]qp(h/)qq}qr(hXFutureqshhkhhh!h3h#}qt(h%]h&]h']h(]h*]uh,K h-hh]quh6XFutureqvqw}qx(hhshhqubaubhH)qy}qz(hUhhkhhh!hKh#}q{(hMX-h(]h']h%]h&]h*]uh,Kh-hh]q|(hO)q}}q~(hXCdetect sanity of config variables to ensure no weird write failuresqhhyhhh!hSh#}q(h%]h&]h']h(]h*]uh,Nh-hh]qhV)q}q(hhhh}hhh!hYh#}q(h%]h&]h']h(]h*]uh,Kh]qh6XCdetect sanity of config variables to ensure no weird write failuresqq}q(hhhhubaubaubhO)q}q(hX^"retain X previous failures", to prevent issues from being flushed out by successes in displayqhhyhhh!hSh#}q(h%]h&]h']h(]h*]uh,Nh-hh]qhV)q}q(hhhhhhh!hYh#}q(h%]h&]h']h(]h*]uh,Kh]qh6X^"retain X previous failures", to prevent issues from being flushed out by successes in displayqq}q(hhhhubaubaubhO)q}q(hXNadd ability to list all jobs (or what, 100?) if asked instead of pithy messageqhhyhhh!hSh#}q(h%]h&]h']h(]h*]uh,Nh-hh]qhV)q}q(hhhhhhh!hYh#}q(h%]h&]h']h(]h*]uh,Kh]qh6XNadd ability to list all jobs (or what, 100?) if asked instead of pithy messageqq}q(hhhhubaubaubhO)q}q(hX0add users - no auth, just cookie for attributionqhhyhhh!hSh#}q(h%]h&]h']h(]h*]uh,Nh-hh]qhV)q}q(hhhhhhh!hYh#}q(h%]h&]h']h(]h*]uh,Kh]qh6X0add users - no auth, just cookie for attributionqq}q(hhhhubaubaubhO)q}q(hX`run now improvements - store "manual execution" in job history / display? / store "executed by"?hhyhhh!hSh#}q(h%]h&]h']h(]h*]uh,Nh-hh]qhV)q}q(hX`run now improvements - store "manual execution" in job history / display? / store "executed by"?qhhhhh!hYh#}q(h%]h&]h']h(]h*]uh,Kh]qh6X`run now improvements - store "manual execution" in job history / display? / store "executed by"?qq}q(hhhhubaubaubhO)q}q(hX%failure notification - raven / sentryhhyhhh!hSh#}q(h%]h&]h']h(]h*]uh,Nh-hh]qhV)q}q(hX%failure notification - raven / sentryqhhhhh!hYh#}q(h%]h&]h']h(]h*]uh,Kh]qh6X%failure notification - raven / sentryq…q}q(hhhhubaubaubhO)q}q(hX+live update of page? via pjax - 5s intervalhhyhhh!hSh#}q(h%]h&]h']h(]h*]uh,Nh-hh]qhV)q}q(hX+live update of page? via pjax - 5s intervalqhhhhh!hYh#}q(h%]h&]h']h(]h*]uh,Kh]qh6X+live update of page? via pjax - 5s intervalq΅q}q(hhhhubaubaubeubeubeubahUU transformerqNU footnote_refsq}qUrefnamesq}qUsymbol_footnotesq]qUautofootnote_refsq]qUsymbol_footnote_refsq]qU citationsq]qh-hU current_lineqNUtransform_messagesq]qUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh3NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelr KUconfigr NUstrict_visitorr NUcloak_email_addressesr Utrim_footnote_reference_spacer UenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerU?/var/build/user_builds/speedrack/checkouts/latest/docs/todo.rstrUgettext_compactr U generatorr!NUdump_internalsr"NU smart_quotesr#U pep_base_urlr$Uhttp://www.python.org/dev/peps/r%Usyntax_highlightr&Ulongr'Uinput_encoding_error_handlerr(jUauto_id_prefixr)Uidr*Udoctitle_xformr+Ustrip_elements_with_classesr,NU _config_filesr-]r.Ufile_insertion_enabledr/KU raw_enabledr0KU dump_settingsr1NubUsymbol_footnote_startr2KUidsr3}r4(hhkhhhh:uUsubstitution_namesr5}r6h!h-h#}r7(h%]h(]h']Usourcehh&]h*]uU footnotesr8]r9Urefidsr:}r;ub.PKI"DG""1speedrack-latest/.doctrees/task execution.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xconfig reloadingqNX add_cron_jobqXtask executionqNX sudo controlq NXsuccess / failureq NX schedulingq NuUsubstitution_defsq }q Uparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUconfig-reloadingqhU add-cron-jobqhUtask-executionqh U sudo-controlqh Usuccess-failureqh U schedulingquUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceq UUparentq!hUsourceq"cdocutils.nodes reprunicode q#XI/var/build/user_builds/speedrack/checkouts/latest/docs/task execution.rstq$q%}q&bUtagnameq'Usectionq(U attributesq)}q*(Udupnamesq+]Uclassesq,]Ubackrefsq-]Uidsq.]q/haUnamesq0]q1hauUlineq2KUdocumentq3hh]q4(cdocutils.nodes title q5)q6}q7(h XTask Executionq8h!hh"h%h'Utitleq9h)}q:(h+]h,]h-]h.]h0]uh2Kh3hh]q;cdocutils.nodes Text q}q?(h h8h!h6ubaubh)q@}qA(h Uh!hh"h%h'h(h)}qB(h+]h,]h-]h.]qChah0]qDh auh2Kh3hh]qE(h5)qF}qG(h X SchedulingqHh!h@h"h%h'h9h)}qI(h+]h,]h-]h.]h0]uh2Kh3hh]qJhU datestampr?NU report_levelr@KU _destinationrANU halt_levelrBKU strip_classesrCNh9NUerror_encoding_error_handlerrDUbackslashreplacerEUdebugrFNUembed_stylesheetrGUoutput_encoding_error_handlerrHUstrictrIU sectnum_xformrJKUdump_transformsrKNU docinfo_xformrLKUwarning_streamrMNUpep_file_url_templaterNUpep-%04drOUexit_status_levelrPKUconfigrQNUstrict_visitorrRNUcloak_email_addressesrSUtrim_footnote_reference_spacerTUenvrUNUdump_pseudo_xmlrVNUexpose_internalsrWNUsectsubtitle_xformrXU source_linkrYNUrfc_referencesrZNUoutput_encodingr[Uutf-8r\U source_urlr]NUinput_encodingr^U utf-8-sigr_U_disable_configr`NU id_prefixraUU tab_widthrbKUerror_encodingrcUUTF-8rdU_sourcereUI/var/build/user_builds/speedrack/checkouts/latest/docs/task execution.rstrfUgettext_compactrgU generatorrhNUdump_internalsriNU smart_quotesrjU pep_base_urlrkUhttp://www.python.org/dev/peps/rlUsyntax_highlightrmUlongrnUinput_encoding_error_handlerrojIUauto_id_prefixrpUidrqUdoctitle_xformrrUstrip_elements_with_classesrsNU _config_filesrt]Ufile_insertion_enabledruKU raw_enabledrvKU dump_settingsrwNubUsymbol_footnote_startrxKUidsry}rz(hhhhhjhhhhhh@uUsubstitution_namesr{}r|h'h3h)}r}(h+]h.]h-]Usourceh%h,]h0]uU footnotesr~]rUrefidsr}rub.PKVCa!speedrack-latest/_static/plus.pngPNG  IHDR &q pHYs  tIME 1l9tEXtComment̖RIDATcz(BpipPc |IENDB`PKI"Dkl\\%speedrack-latest/_static/pygments.css.highlight .hll { background-color: #ffffcc } .highlight { background: #eeffcc; } .highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */ .highlight .o { color: #666666 } /* Operator */ .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #007020 } /* Comment.Preproc */ .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .go { color: #333333 } /* Generic.Output */ .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #0044DD } /* Generic.Traceback */ .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #007020 } /* Keyword.Pseudo */ .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #902000 } /* Keyword.Type */ .highlight .m { color: #208050 } /* Literal.Number */ .highlight .s { color: #4070a0 } /* Literal.String */ .highlight .na { color: #4070a0 } /* Name.Attribute */ .highlight .nb { color: #007020 } /* Name.Builtin */ .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ .highlight .no { color: #60add5 } /* Name.Constant */ .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ .highlight .ne { color: #007020 } /* Name.Exception */ .highlight .nf { color: #06287e } /* Name.Function */ .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #bb60d5 } /* Name.Variable */ .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mf { color: #208050 } /* Literal.Number.Float */ .highlight .mh { color: #208050 } /* Literal.Number.Hex */ .highlight .mi { color: #208050 } /* Literal.Number.Integer */ .highlight .mo { color: #208050 } /* Literal.Number.Oct */ .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ .highlight .sc { color: #4070a0 } /* Literal.String.Char */ .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ .highlight .sx { color: #c65d09 } /* Literal.String.Other */ .highlight .sr { color: #235388 } /* Literal.String.Regex */ .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ .highlight .ss { color: #517918 } /* Literal.String.Symbol */ .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */PKVCDUkkspeedrack-latest/_static/up.pngPNG  IHDRasRGBbKGDC pHYs B(xtIME!.<̓EIDAT8͓NABP\EG{%<|xc  cr6@t;b$;3&)h1!﫳Hzz@=)p 3۵e2/ߴ ( %^ND^ }3H1DoǪISFұ?, G`{v^X[b]&HC3{:sO& ?,[eL#IENDB`PKBFCVR>> speedrack-latest/_static/rtd.css/* * rtd.css * ~~~~~~~~~~~~~~~ * * Sphinx stylesheet -- sphinxdoc theme. Originally created by * Armin Ronacher for Werkzeug. * * Customized for ReadTheDocs by Eric Pierce & Eric Holscher * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* RTD colors * light blue: #e8ecef * medium blue: #8ca1af * dark blue: #465158 * dark grey: #444444 * * white hover: #d1d9df; * medium blue hover: #697983; * green highlight: #8ecc4c * light blue (project bar): #e8ecef */ @import url("basic.css"); /* PAGE LAYOUT -------------------------------------------------------------- */ body { font: 100%/1.5 "ff-meta-web-pro-1","ff-meta-web-pro-2",Arial,"Helvetica Neue",sans-serif; text-align: center; color: black; background-color: #465158; padding: 0; margin: 0; } div.document { text-align: left; background-color: #e8ecef; } div.bodywrapper { background-color: #ffffff; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; margin: 0 0 0 16em; } div.body { margin: 0; padding: 0.5em 1.3em; min-width: 20em; } div.related { font-size: 1em; background-color: #465158; } div.documentwrapper { float: left; width: 100%; background-color: #e8ecef; } /* HEADINGS --------------------------------------------------------------- */ h1 { margin: 0; padding: 0.7em 0 0.3em 0; font-size: 1.5em; line-height: 1.15; color: #111; clear: both; } h2 { margin: 2em 0 0.2em 0; font-size: 1.35em; padding: 0; color: #465158; } h3 { margin: 1em 0 -0.3em 0; font-size: 1.2em; color: #6c818f; } div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { color: black; } h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor { display: none; margin: 0 0 0 0.3em; padding: 0 0.2em 0 0.2em; color: #aaa !important; } h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { display: inline; } h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, h5 a.anchor:hover, h6 a.anchor:hover { color: #777; background-color: #eee; } /* LINKS ------------------------------------------------------------------ */ /* Normal links get a pseudo-underline */ a { color: #444; text-decoration: none; border-bottom: 1px solid #ccc; } /* Links in sidebar, TOC, index trees and tables have no underline */ .sphinxsidebar a, .toctree-wrapper a, .indextable a, #indices-and-tables a { color: #444; text-decoration: none; /* border-bottom: none; */ } /* Search box size */ div.sphinxsidebar #searchbox input[type="submit"] { width: 50px; } /* Most links get an underline-effect when hovered */ a:hover, div.toctree-wrapper a:hover, .indextable a:hover, #indices-and-tables a:hover { color: #111; text-decoration: none; border-bottom: 1px solid #111; } /* Footer links */ div.footer a { color: #86989B; text-decoration: none; border: none; } div.footer a:hover { color: #a6b8bb; text-decoration: underline; border: none; } /* Permalink anchor (subtle grey with a red hover) */ div.body a.headerlink { color: #ccc; font-size: 1em; margin-left: 6px; padding: 0 4px 0 4px; text-decoration: none; border: none; } div.body a.headerlink:hover { color: #c60f0f; border: none; } /* NAVIGATION BAR --------------------------------------------------------- */ div.related ul { height: 2.5em; } div.related ul li { margin: 0; padding: 0.65em 0; float: left; display: block; color: white; /* For the >> separators */ font-size: 0.8em; } div.related ul li.right { float: right; margin-right: 5px; color: transparent; /* Hide the | separators */ } /* "Breadcrumb" links in nav bar */ div.related ul li a { order: none; background-color: inherit; font-weight: bold; margin: 6px 0 6px 4px; line-height: 1.75em; color: #ffffff; padding: 0.4em 0.8em; border: none; border-radius: 3px; } /* previous / next / modules / index links look more like buttons */ div.related ul li.right a { margin: 0.375em 0; background-color: #697983; text-shadow: 0 1px rgba(0, 0, 0, 0.5); border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; } /* All navbar links light up as buttons when hovered */ div.related ul li a:hover { background-color: #8ca1af; color: #ffffff; text-decoration: none; border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; } /* Take extra precautions for tt within links */ a tt, div.related ul li a tt { background: inherit !important; color: inherit !important; } /* SIDEBAR ---------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 0; } div.sphinxsidebar { margin: 0; margin-left: -100%; float: left; top: 3em; left: 0; padding: 0 1em; width: 14em; font-size: 1em; text-align: left; background-color: #e8ecef; } div.sphinxsidebar img { max-width: 12em; } div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p.logo { margin: 1.2em 0 0.3em 0; font-size: 1em; padding: 0; color: #222222; font-family: "ff-meta-web-pro-1", "ff-meta-web-pro-2", "Arial", "Helvetica Neue", sans-serif; } div.sphinxsidebar h3 a { color: #444444; } div.sphinxsidebar ul, div.sphinxsidebar p { margin-top: 0; padding-left: 0; line-height: 130%; background-color: #e8ecef; } /* No bullets for nested lists, but a little extra indentation */ div.sphinxsidebar ul ul { list-style-type: none; margin-left: 1.5em; padding: 0; } /* A little top/bottom padding to prevent adjacent links' borders * from overlapping each other */ div.sphinxsidebar ul li { padding: 1px 0; } /* A little left-padding to make these align with the ULs */ div.sphinxsidebar p.topless { padding-left: 0 0 0 1em; } /* Make these into hidden one-liners */ div.sphinxsidebar ul li, div.sphinxsidebar p.topless { white-space: nowrap; overflow: hidden; } /* ...which become visible when hovered */ div.sphinxsidebar ul li:hover, div.sphinxsidebar p.topless:hover { overflow: visible; } /* Search text box and "Go" button */ #searchbox { margin-top: 2em; margin-bottom: 1em; background: #ddd; padding: 0.5em; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; } #searchbox h3 { margin-top: 0; } /* Make search box and button abut and have a border */ input, div.sphinxsidebar input { border: 1px solid #999; float: left; } /* Search textbox */ input[type="text"] { margin: 0; padding: 0 3px; height: 20px; width: 144px; border-top-left-radius: 3px; border-bottom-left-radius: 3px; -moz-border-radius-topleft: 3px; -moz-border-radius-bottomleft: 3px; -webkit-border-top-left-radius: 3px; -webkit-border-bottom-left-radius: 3px; } /* Search button */ input[type="submit"] { margin: 0 0 0 -1px; /* -1px prevents a double-border with textbox */ height: 22px; color: #444; background-color: #e8ecef; padding: 1px 4px; font-weight: bold; border-top-right-radius: 3px; border-bottom-right-radius: 3px; -moz-border-radius-topright: 3px; -moz-border-radius-bottomright: 3px; -webkit-border-top-right-radius: 3px; -webkit-border-bottom-right-radius: 3px; } input[type="submit"]:hover { color: #ffffff; background-color: #8ecc4c; } div.sphinxsidebar p.searchtip { clear: both; padding: 0.5em 0 0 0; background: #ddd; color: #666; font-size: 0.9em; } /* Sidebar links are unusual */ div.sphinxsidebar li a, div.sphinxsidebar p a { background: #e8ecef; /* In case links overlap main content */ border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border: 1px solid transparent; /* To prevent things jumping around on hover */ padding: 0 5px 0 5px; } div.sphinxsidebar li a:hover, div.sphinxsidebar p a:hover { color: #111; text-decoration: none; border: 1px solid #888; } div.sphinxsidebar p.logo a { border: 0; } /* Tweak any link appearing in a heading */ div.sphinxsidebar h3 a { } /* OTHER STUFF ------------------------------------------------------------ */ cite, code, tt { font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.95em; letter-spacing: 0.01em; } tt { background-color: #f2f2f2; color: #444; } tt.descname, tt.descclassname, tt.xref { border: 0; } hr { border: 1px solid #abc; margin: 2em; } pre, #_fontwidthtest { font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; margin: 1em 2em; font-size: 0.95em; letter-spacing: 0.015em; line-height: 120%; padding: 0.5em; border: 1px solid #ccc; background-color: #eee; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; } pre a { color: inherit; text-decoration: underline; } td.linenos pre { margin: 1em 0em; } td.code pre { margin: 1em 0em; } div.quotebar { background-color: #f8f8f8; max-width: 250px; float: right; padding: 2px 7px; border: 1px solid #ccc; } div.topic { background-color: #f8f8f8; } table { border-collapse: collapse; margin: 0 -0.5em 0 -0.5em; } table td, table th { padding: 0.2em 0.5em 0.2em 0.5em; } /* ADMONITIONS AND WARNINGS ------------------------------------------------- */ /* Shared by admonitions, warnings and sidebars */ div.admonition, div.warning, div.sidebar { font-size: 0.9em; margin: 2em; padding: 0; /* border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; */ } div.admonition p, div.warning p, div.sidebar p { margin: 0.5em 1em 0.5em 1em; padding: 0; } div.admonition pre, div.warning pre, div.sidebar pre { margin: 0.4em 1em 0.4em 1em; } div.admonition p.admonition-title, div.warning p.admonition-title, div.sidebar p.sidebar-title { margin: 0; padding: 0.1em 0 0.1em 0.5em; color: white; font-weight: bold; font-size: 1.1em; text-shadow: 0 1px rgba(0, 0, 0, 0.5); } div.admonition ul, div.admonition ol, div.warning ul, div.warning ol, div.sidebar ul, div.sidebar ol { margin: 0.1em 0.5em 0.5em 3em; padding: 0; } /* Admonitions and sidebars only */ div.admonition, div.sidebar { border: 1px solid #609060; background-color: #e9ffe9; } div.admonition p.admonition-title, div.sidebar p.sidebar-title { background-color: #70A070; border-bottom: 1px solid #609060; } /* Warnings only */ div.warning { border: 1px solid #900000; background-color: #ffe9e9; } div.warning p.admonition-title { background-color: #b04040; border-bottom: 1px solid #900000; } /* Sidebars only */ div.sidebar { max-width: 30%; } div.versioninfo { margin: 1em 0 0 0; border: 1px solid #ccc; background-color: #DDEAF0; padding: 8px; line-height: 1.3em; font-size: 0.9em; } .viewcode-back { font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; } dl { margin: 1em 0 2.5em 0; } dl dt { font-style: italic; } dl dd { color: rgb(68, 68, 68); font-size: 0.95em; } /* Highlight target when you click an internal link */ dt:target { background: #ffe080; } /* Don't highlight whole divs */ div.highlight { background: transparent; } /* But do highlight spans (so search results can be highlighted) */ span.highlight { background: #ffe080; } div.footer { background-color: #465158; color: #eeeeee; padding: 0 2em 2em 2em; clear: both; font-size: 0.8em; text-align: center; } p { margin: 0.8em 0 0.5em 0; } .section p img.math { margin: 0; } .section p img { margin: 1em 2em; } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; } /* MOBILE LAYOUT -------------------------------------------------------------- */ @media screen and (max-width: 600px) { h1, h2, h3, h4, h5 { position: relative; } ul { padding-left: 1.25em; } div.bodywrapper a.headerlink, #indices-and-tables h1 a { color: #e6e6e6; font-size: 80%; float: right; line-height: 1.8; position: absolute; right: -0.7em; visibility: inherit; } div.bodywrapper h1 a.headerlink, #indices-and-tables h1 a { line-height: 1.5; } pre { font-size: 0.7em; overflow: auto; word-wrap: break-word; white-space: pre-wrap; } div.related ul { height: 2.5em; padding: 0; text-align: left; } div.related ul li { clear: both; color: #465158; padding: 0.2em 0; } div.related ul li:last-child { border-bottom: 1px dotted #8ca1af; padding-bottom: 0.4em; margin-bottom: 1em; width: 100%; } div.related ul li a { color: #465158; padding-right: 0; } div.related ul li a:hover { background: inherit; color: inherit; } div.related ul li.right { clear: none; padding: 0.65em 0; margin-bottom: 0.5em; } div.related ul li.right a { color: #fff; padding-right: 0.8em; } div.related ul li.right a:hover { background-color: #8ca1af; } div.body { clear: both; min-width: 0; word-wrap: break-word; } div.bodywrapper { margin: 0 0 0 0; } div.sphinxsidebar { float: none; margin: 0; width: auto; } div.sphinxsidebar input[type="text"] { height: 2em; line-height: 2em; width: 70%; } div.sphinxsidebar input[type="submit"] { height: 2em; margin-left: 0.5em; width: 20%; } div.sphinxsidebar p.searchtip { background: inherit; margin-bottom: 1em; } div.sphinxsidebar ul li, div.sphinxsidebar p.topless { white-space: normal; } .bodywrapper img { display: block; margin-left: auto; margin-right: auto; max-width: 100%; } div.documentwrapper { float: none; } div.admonition, div.warning, pre, blockquote { margin-left: 0em; margin-right: 0em; } .body p img { margin: 0; } #searchbox { background: transparent; } .related:not(:first-child) li { display: none; } .related:not(:first-child) li.right { display: block; } div.footer { padding: 1em; } .rtd_doc_footer .rtd-badge { float: none; margin: 1em auto; position: static; } .rtd_doc_footer .rtd-badge.revsys-inline { margin-right: auto; margin-bottom: 2em; } table.indextable { display: block; width: auto; } .indextable tr { display: block; } .indextable td { display: block; padding: 0; width: auto !important; } .indextable td dt { margin: 1em 0; } ul.search { margin-left: 0.25em; } ul.search li div.context { font-size: 90%; line-height: 1.1; margin-bottom: 1; margin-left: 0; } } PKVC2,~~!~!&speedrack-latest/_static/underscore.js// Underscore.js 0.5.5 // (c) 2009 Jeremy Ashkenas, DocumentCloud Inc. // Underscore is freely distributable under the terms of the MIT license. // Portions of Underscore are inspired by or borrowed from Prototype.js, // Oliver Steele's Functional, and John Resig's Micro-Templating. // For all details and documentation: // http://documentcloud.github.com/underscore/ (function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;gf?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)}); return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length); var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false; if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length== 0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&& a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g, " ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments); o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})(); PKI"Dq+speedrack-latest/_static/readthedocs-ext.js // Intenionally left blank PKVC<>(speedrack-latest/_static/ajax-loader.gifGIF89aU|NU|l!Created with ajaxload.info! ! NETSCAPE2.0,30Ikc:Nf E1º.`q-[9ݦ9 JkH! ,4N!  DqBQT`1 `LE[|ua C%$*! ,62#+AȐ̔V/cNIBap ̳ƨ+Y2d! ,3b%+2V_ ! 1DaFbR]=08,Ȥr9L! ,2r'+JdL &v`\bThYB)@<&,ȤR! ,3 9tڞ0!.BW1  sa50 m)J! ,2 ٜU]qp`a4AF0` @1Α! ,20IeBԜ) q10ʰPaVڥ ub[;PKVCPu u $speedrack-latest/_static/comment.pngPNG  IHDRa OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME 1;VIDAT8ukU?sg4h`G1 RQܸp%Bn"bЍXJ .4V iZ##T;m!4bP~7r>ιbwc;m;oӍAΆ ζZ^/|s{;yR=9(rtVoG1w#_ө{*E&!(LVuoᲵ‘D PG4 :&~*ݳreu: S-,U^E&JY[P!RB ŖޞʖR@_ȐdBfNvHf"2T]R j'B1ddAak/DIJD D2H&L`&L $Ex,6|~_\P $MH`I=@Z||ttvgcЕWTZ'3rje"ܵx9W> mb|byfFRx{w%DZC$wdցHmWnta(M<~;9]C/_;Տ#}o`zSڷ_>:;x컓?yݩ|}~wam-/7=0S5RP"*֯ IENDB`PKVChkk!speedrack-latest/_static/down.pngPNG  IHDRasRGBbKGDC pHYs B(xtIME"U{IDAT8ҡNCAJ, ++@4>/U^,~T&3M^^^PM6ٹs*RJa)eG*W<"F Fg78G>q OIp:sAj5GنyD^+yU:p_%G@D|aOs(yM,"msx:.b@D|`Vٟ۲иeKſ/G!IENDB`PKVC+0!speedrack-latest/_static/file.pngPNG  IHDRabKGD pHYs  tIME  )TIDAT8˭J@Ir('[ "&xYZ X0!i|_@tD] #xjv YNaEi(əy@D&`6PZk$)5%"z.NA#Aba`Vs_3c,2mj [klvy|!Iմy;v "߮a?A7`c^nk?Bg}TЙD# "RD1yER*6MJ3K_Ut8F~IENDB`PKVC[{gtt'speedrack-latest/_static/up-pressed.pngPNG  IHDRasRGBbKGDC pHYs B(xtIME ,ZeIDAT8͓jA*WKk-,By@- و/`cXYh!6jf GrOlXvvfk2!p!GOOԲ &zf 6|M~%`]* ΛM]K ZĆ1Er%ȶcm1`= 0 && !jQuery(node.parentNode).hasClass(className)) { var span = document.createElement("span"); span.className = className; span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this); }); } } return this.each(function() { highlight(this); }); }; /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated == 'undefined') return string; return (typeof translated == 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated == 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); }, /** * workaround a firefox stupidity */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('') .appendTo($('#searchbox')); } }, /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) == 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, /** * make the url absolute */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, /** * get the current relative url */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this == '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); } }; // quick alias for translations _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); }); PKI"D:>>>'speedrack-latest/_static/searchtools.js/* * searchtools.js_t * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilties for the full-text search. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /** * helper function to return a node containing the * search summary for a given text. keywords is a list * of stemmed words, hlwords is the list of normal, unstemmed * words. the first one is used to find the occurance, the * latter for highlighting it. */ jQuery.makeSearchSummary = function(text, keywords, hlwords) { var textLower = text.toLowerCase(); var start = 0; $.each(keywords, function() { var i = textLower.indexOf(this.toLowerCase()); if (i > -1) start = i; }); start = Math.max(start - 120, 0); var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); var rv = $('
').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); return rv; } /** * Porter Stemmer */ var Stemmer = function() { var step2list = { ational: 'ate', tional: 'tion', enci: 'ence', anci: 'ance', izer: 'ize', bli: 'ble', alli: 'al', entli: 'ent', eli: 'e', ousli: 'ous', ization: 'ize', ation: 'ate', ator: 'ate', alism: 'al', iveness: 'ive', fulness: 'ful', ousness: 'ous', aliti: 'al', iviti: 'ive', biliti: 'ble', logi: 'log' }; var step3list = { icate: 'ic', ative: '', alize: 'al', iciti: 'ic', ical: 'ic', ful: '', ness: '' }; var c = "[^aeiou]"; // consonant var v = "[aeiouy]"; // vowel var C = c + "[^aeiouy]*"; // consonant sequence var V = v + "[aeiou]*"; // vowel sequence var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 var s_v = "^(" + C + ")?" + v; // vowel in stem this.stemWord = function (w) { var stem; var suffix; var firstch; var origword = w; if (w.length < 3) return w; var re; var re2; var re3; var re4; firstch = w.substr(0,1); if (firstch == "y") w = firstch.toUpperCase() + w.substr(1); // Step 1a re = /^(.+?)(ss|i)es$/; re2 = /^(.+?)([^s])s$/; if (re.test(w)) w = w.replace(re,"$1$2"); else if (re2.test(w)) w = w.replace(re2,"$1$2"); // Step 1b re = /^(.+?)eed$/; re2 = /^(.+?)(ed|ing)$/; if (re.test(w)) { var fp = re.exec(w); re = new RegExp(mgr0); if (re.test(fp[1])) { re = /.$/; w = w.replace(re,""); } } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1]; re2 = new RegExp(s_v); if (re2.test(stem)) { w = stem; re2 = /(at|bl|iz)$/; re3 = new RegExp("([^aeiouylsz])\\1$"); re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re2.test(w)) w = w + "e"; else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); } else if (re4.test(w)) w = w + "e"; } } // Step 1c re = /^(.+?)y$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(s_v); if (re.test(stem)) w = stem + "i"; } // Step 2 re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step2list[suffix]; } // Step 3 re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step3list[suffix]; } // Step 4 re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; re2 = /^(.+?)(s|t)(ion)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); if (re.test(stem)) w = stem; } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1] + fp[2]; re2 = new RegExp(mgr1); if (re2.test(stem)) w = stem; } // Step 5 re = /^(.+?)e$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); re2 = new RegExp(meq1); re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) w = stem; } re = /ll$/; re2 = new RegExp(mgr1); if (re.test(w) && re2.test(w)) { re = /.$/; w = w.replace(re,""); } // and turn initial Y back to y if (firstch == "y") w = firstch.toLowerCase() + w.substr(1); return w; } } /** * Search Module */ var Search = { _index : null, _queued_query : null, _pulse_status : -1, init : function() { var params = $.getQueryParameters(); if (params.q) { var query = params.q[0]; $('input[name="q"]')[0].value = query; this.performSearch(query); } }, loadIndex : function(url) { $.ajax({type: "GET", url: url, data: null, success: null, dataType: "script", cache: true}); }, setIndex : function(index) { var q; this._index = index; if ((q = this._queued_query) !== null) { this._queued_query = null; Search.query(q); } }, hasIndex : function() { return this._index !== null; }, deferQuery : function(query) { this._queued_query = query; }, stopPulse : function() { this._pulse_status = 0; }, startPulse : function() { if (this._pulse_status >= 0) return; function pulse() { Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; for (var i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); }; pulse(); }, /** * perform a search for something */ performSearch : function(query) { // create the required interface elements this.out = $('#search-results'); this.title = $('

' + _('Searching') + '

').appendTo(this.out); this.dots = $('').appendTo(this.title); this.status = $('

').appendTo(this.out); this.output = $('