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.)
As it currently stands the API consists of the following requests.
First you'll need a snapshot. You can use one created with gen-snapshot.py or obtain one via the API:
Returns a snapshot
req=evaluate pso=snapshot string source=string of code to evaluate
Returns a snapshot
req=dictionary pso=snapshot string
Returns a JSON data with keys: names, pointers.
req=stack pso=snapshot string
Returns a JSON data with keys: values, types.
req=dictionary_names pso=snapshot string
Returns a comma separated list of names in the dictionary
req=dictionary_map pso=snapshot string
Returns a comma separated list of pointers in the dictionary
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.
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.
req=errors pso=snapshot string
Returns a comma separated list of error messages. Use clear_errors to empty the error log.
req=clear_errors pso=snapshot string
Returns a snapshot.
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.
req=get_types pso=snapshot string s=slice number
Return the type constants for the values in a given slice.
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.