## Apologue and Parable as a Service Up to this point Apologue has used a simple custom backend. This has worked, but has some limitations that are annoying to me. * Each evaluation is done in a completely new session * The results sets are pretty big * It's all or nothing: if anything goes wrong, you're stuck with a broken JSON document at best or garbage at worst * Small changes to output can break Apologue Parable as a Service (begun with the 2016.02 release) will become very important as a means of resolving these issues. It already resolves my biggest issues: * Snapshot based, so allows for incremental compilations/evaluations * Results are much smaller: snapshots are compressed, and other requests return smaller, specific pieces of data * Each request returns specifically requested data only, not the entire result space * I'll be able to add new features and improve existing ones with less impact to front ends using the API Currently the only thing using PaaS is *netlistener*. This is currently slow, but should improve as the offline support code is written / fleshed out and fewer network requests are required. PaaS will be a big part of the initial work done for Parable 2016.04 (work on this starts next week). Part of what I've been waiting on is the opportunity to switch to Python 3 only. This is finally on the horizon (I was holding off due to Pythonista on iOS; there's now a beta with Python 3 support. It works fine for my uses, and I'm hopeful that it'll be publically released in the next couple of months.) ## The API As it currently stands the API consists of the following requests. ### getpso First you'll need a snapshot. You can use one created with *gen-snapshot.py* or obtain one via the API: req=getpso Returns a snapshot ### evaluate req=evaluate pso=snapshot string source=string of code to evaluate Returns a snapshot ### dictionary req=dictionary pso=snapshot string Returns a JSON data with keys: names, pointers. ### stack req=stack pso=snapshot string Returns a JSON data with keys: values, types. ### dictionary_names req=dictionary_names pso=snapshot string Returns a comma separated list of names in the dictionary ### dictionary_map req=dictionary_map pso=snapshot string Returns a comma separated list of pointers in the dictionary ### stack_values req=stack_values pso=snapshot string Returns a comma separated list of values on the stack. These are raw numbers: use the stack_types to help map these to human readable data. ### stack_types req=stack_types pso=snapshot string Returns a comma separated list of type constants for values on the stack. Pair with stack_values to help create human readable data. ### errors req=errors pso=snapshot string Returns a comma separated list of error messages. Use clear_errors to empty the error log. ### clear_errors req=clear_errors pso=snapshot string Returns a snapshot. ### get_slice req=get_slice pso=snapshot string s=slice number Returns the memory values in a given slice. These are the raw values without type information. ## Future API Additions At a minimum I need to implement the following to round out the core functionality. ### get_types req=get_types pso=snapshot string s=slice number Return the type constants for the values in a given slice. ### get_dependencies req=get_dependencies pso=snapshot string s=slice number Return a comma separate list of slices that are needed for execution of a specified slice.