Package: prestoplot
PrestoPlotA library and tool for text generation, inspired by Tracery.PrestoPlot is a tool for idea generation, name generation, and other tomfoolery
when you should otherwise be writing.Goes best with the oracles from thePrestoPlot Oracles repository.InstallPrestoPlot is available from PyPI:pip install prestoplotUsagePrestoPlot may be invoked with theprestoCLI script:presto --helpThe “oracle” consulted directly must include aBegin:stanza:$ cat names.yaml
Begin:
  - "{Name}"

Name:
  - George
  - Martha

$ presto run names.yaml
GeorgeGenerative GrammarsThe main feature right now is a generative grammar that uses a simple YAML-based
language andPython f-string syntaxto create“oracles”for idea generation.The best way to learn the grammar is to look at examples. We’ll consider theYAML for generating a Pirate story, which begins like this:include:
  - setup

Begin:
  - "{PiratesOracle}"There is theBegin:stanza that we require to directly consult an oracle.
This contains a list of strings that may be chosen from by the random generator.
In this case, we have an f-string template that invokesPiratesOracle. We
find that below:PiratesOracle:
  - |
    {Setup}
    - {Letters.One}
    - {Letters.Two}
    - {Letters.Three}
    - {Letters.Four}
  - |
    {Setup}
    - {CutlassDagger.One}
    - {CutlassDagger.Two}
    - {CutlassDagger.Three}
    - {CutlassDagger.Four}We see another list of strings.|followed by an indented new line means to
treat what follows at that indentation level as a literal string, instead of
YAML:{Setup}
  - {Letters.One}
  - {Letters.Two}
  - {Letters.Three}
  - {Letters.Four}So this is a string with a Markdown-style list, instead of a YAML list, all
because of the|.So here we seeSetupinvoked, and thenLettersinvoked four times.Lettersis defined below:Letters:
  - mode: pick
  - "Betrayal and treachery!"
  - "Captured {Nationality} charts, carefully copied, and used by the Royal Navy."
  - "Dolphins, seen frolicking in the bow-wake of a ship, perhaps leading it toward its goal."
  - "Flotsam and jetsam, washed ashore after a sea-battle."
  - "Fo’c’sle gossip blaming the ship’s misfortunes on a crewman who killed an albatross."
  - "Forged documents, implying that their bearer speaks for the Crown."
  - "Hidden reefs, which at low tide endanger any ship that passes over them."We have another list, containing piratical thematic elements.mode: picktells the generator to randomly pick from among them, then remove that option
from consideration for future picks. The normal mode isreusewhich allows
list items to be re-used by the generator. Another mode,markov, tells the
generator to build a Markov chain from the list, as withthese name lists.Going back toPiratesOracle, we see thatLettersis invoked four times,
each time with a newkey. The values of the keys are important only to the
reader. Each new key acts as a fresh seed for the random generator when working
inside that stanza. For instance, if{Letters.One}picked the element"Captured {Nationality} charts, carefully copied, and used by the Royal Navy.", the valueOneprovides the seed for picking aNationality,
say,English. Later, if{Letters.Two}encounters another element
containing{Nationality}, the keyTwowill provide a different seed for
picking a nationality the second time.The plot thickens when we examine theincludestanza, which includes thesetup.yamlfilenext door. This file includes more files. We will next examinecharacters.yaml.Inside ofcharacters.yamlwe find this fascinating set of stanzas:Sex:
  - male
  - female

He:
  - >
    {'She' if Sex[key] == 'female' else 'He'}
his:
  - >
    {'her' if Sex[key] == 'female' else 'his'}
His:
  - >
    {'Her' if Sex[key] == 'female' else 'His'}
hero:
  - "{'heroine' if Sex[key] == 'female' else 'hero'}"With this set of tools, we could write the following string:That {hero.protag}! {He.protag} sure loves {his.protag} mom.The long and short of it is that, depending on the sex of the protagonist, this
will render either:That heroine! She sure loves her mom.or:That hero! He sure loves his mom.So here we see that inside of f-string syntax, we can use pythonic expressions,
and the variablekeycontains the key from the outer scope:{He.protag}assigns the value"protag"tokey.{Sex[key]}will reliably produce
the same result for the same key (assuming the same initial seed).Everything else is just YAML syntax and Python f-string expressions.AboutI wrote PrestoPlot to support idea generation and name generation for my
pulp-inspired science fiction space opera series,Salvage of Empire:When his brother-in-law threatens to reveal his terrible secret, Director Kolteo
Ais must sacrifice everything he has worked for to save the Galactic Empire—and
his marriage—from utter ruin.CHANGES0.5Allow instances ofrandom.Random()as seeds.RenameChangeLogtoCHANGELOG.rst, include inlong_description.Changelog is now manually written, instead of derived from git logs.0.4Fixed major instability of markov generator in the presence of a seed.0.3.4Update packaging and requirements0.3.3Improved badgeUpdate README w/ build status and better ledeUpdate dev and test requirementsAllow customization of start key when rendering storyAdd python 3.8 to tests0.3.2Remove more debug logging0.3.1Remove debug loggingAdd extra whitespaceAdd known third parties to isort cfgAdd twine dev dependency0.3Add msgpack-compiled test dataAdd new more efficient storagesImprove runtests invocationTailor flake8 exclusionsPin versions; add msgpackAdd some debug loggingAdd pyyaml requirementRevert “Use strictyaml instead of yaml”Add dev and test requirementsMove prestplot package into src/Add Travis CI integrationAdd .isort.cfgUse collections.abc in prep for python 3.8Use strictyaml instead of yamlAdd requirements.txtUse longer python environ specifiers for tox.iniAdd project URLs0.2A whole bunch of refactoringImprove dev and test harness w/ dev requirements and test scripts0.1.3Add extended documentation on generative grammar syntaxFurther README improvements0.1.2Improve README0.1.1Add--seedoption to CLI for pre-seeding oraclesAdd install/usage documentation to READMEAdd documentation to CLI0.1Add basic test to exercise render_story()Fix email, summaryRemove future features from setup.cfgFinish writing READMEFix link in READMEInitial commit