0.86.00
=======

print table: add support for records being in columns instead of rows

backwards-incompatible change:
- Exit enumeration returns to normal boolean evaluation, i.e.
  - Exit.Success, value 0, boolean False
  - Exit.UnknownError, value 1, boolean True


0.85.03
=======

- Job: add input_delay - default is 2.5 seconds


0.85.02
=======

- add "Error" to appropriate Exit enum member names
- return Exit.Success if subcommand returns None
- Execute: print stdout/stderr if broken pipe error encountered


0.85.01
=======

- fix bug with non-options following a force_default option


0.85.00
=======

- table_display() added to handle table printing

- print() table format accepts `display_none` keyword to change what get
  displayed when None is encountered as cell data

backwards-incompatible change:
- box() now accepts a `width` parameter before the `style` parameter


0.84.03
=======

- print() table format: a row that is a string instead of a tuple/list will
  fill the entire row without column breaks
- print() no longer abort()s, but raises appropriate exceptions


0.84.02
=======

- OrmFile: allow comment to be specified when creating OrmSection
- OrmFile: maintain insertion order
- do not show _commands to user (use an @Alias to expose command
  with a different name)
- expand support for choices to MULTI and MULTIREQ
- Spec: choices can be a space-delimited string
- print: fix "table" border so multiple internal lines print correctly


0.84.01
=======

- add Exit.UserCancelled for <ctrl-c>
- Run() now exits with returnncode (used be Main() only)
- ensure stdout/stderr are not ASCII, and will not raise Unicode exceptions
  if not set for UTF-8
- deprecate ProgressView in favor of ViewProgress
  (check argument order when switching)
- add list, tuple, and dict support to OrmFile
- support saving OrmFile objects back to disk


0.84.00
=======

- fix `bool(Trivalent.unknown)` (Python 2.7 only)
- `Job`: wait for passwords to be written
- add Sentinal: generates unique objects with helpful __repr__s
- add Singleton: used to turn a class into a single instance of that class
- add Var: := for Python's less than 3.8

backwards-incompatible change:
- Job now raises TimeoutError instead of stuffing it into stderr


0.83.03
=======

internal improvements


0.83.02
=======

print(..., border='table') now supports int/long/datetime.*/bool and
aligns accordingly


0.83.01
=======

emit "--no-[flag]" instead of "--[flag]" when force_default is True
use .wait() for sub-process based Execute/Job to avoid zombie processes


0.83.00
=======

parameters:
- ignore equals while processing positional arguments

utilities:
- add table printing capability to print()
- check for active process before checking terminal status (Job)


0.82.0
======

support "-a=..."

add radio option to parameters: if specified, only one parameter from each
radio group may be used

get_response() renamed to input(), now acts like input by default

backwards-incompatible change:
- undo change made in 0.80.0  args after a vararg no longer treated as varargs


0.81.10
=======

ProgressView iterator/wrapper now accepts 'none' as a view mode, but always
displays at least the message (if any).


0.81.9
======

exit gracefully on ctrl-c
support rulebreaks in box()
make style an optional positional argument in box()
smartly truncate top/bottom lines in box() that are longer than content
add border keyword to print that auto-calls box()


0.81.8
======

ProgressView only prints message if stdout is redirected
make separator between message and total customizable
add box() for prettifying output


0.81.7
======

add more debugging info
check for choices membership for options (was only checking for required)


0.81.5
======

fixed Color Flag


0.81.4
======

make DocEnums hashable

strip angle-brackets (<>) from email addresses when discerning mail server

change ProgressView's view_type from 'bar' when verbose level is 2 or higher

add Color enum for ansi color sequences, and ColorTemplate for line-oriented,
colored output

stop vendoring-in aenum


0.81.3
======

Execute
-------
Really fixed password writing to child processes (unicode passwords now
correctly sent)


0.81.2
======

add MULTIREQ -- required parameter that accepts multiple, comma-seperated
values

Execute
-------
fix password and input writing to child processes


0.81.1
======

Execute
-------
always send first kill signal before checking for life


0.81.0
======

Execute
-------
if using pty raise exception when password is requested and no more passwords
remain;

Exit
----
Exit enumeration no longer exported to the global namespace (must be accessed
as Exit.Xxx)


0.80.8
======

OrmFile
-------
selecting a section with subsections now shows the subsections


0.80.7
======

OrmFile
-------
support nested headers, e.g.:

    [postgres]
    some_value = "a value"
    [postgres.v903]
    another_value = "a value"


0.80.6
======

support SCRIPTION_VERBOSITY and SCRIPTION_DEBUG as environment variables

OrmFile
-------
- convert 'none' to None
- convert dumb ini files (types restricted to str, int, float, bool, and None)


0.80.5
======

Job/Execute: yield control to subprocess so it can finish closing its job


0.80.4
======

properly handle end-of-data in ProgressView


0.80.2
======

improve return code handling


0.80.1
======

ProgressView now supports directly wrapping an iterable
add info and debug wrappers to print which default verbose level to 1 and 2
add NameSpace to API
add nice reprs to NameSpace and OrmFile
add iteration support to NameSpace and OrmFile


0.80.0
======

allow flags to be used option-style (e.g. --flag=on)
cast envvar values to the correct type

backwards-incompatible change:
- once a vararg is encountered, all remaining args are also treated as varargs


0.79.3
======

include FailedPassword and TimeoutError in __all__


0.79.2
======

fix negative option handling (i.e. --no-option)


0.79.1
======

correctly set scription_command_name


0.79.0
======

add 'b' and 'u' compatibility shims
improvements in Job
add test switch to skip slow tests
add injected variables to __all__

backwards-incompatible change:
- defaults in function header are always used
- defaults in Script or Command decorators are only used if option is selected


0.78.1
======

include traceback in thread exceptions
guard entire communicate function with try/except


0.78.0
======

rework thread support
fix input for Execute
add tests for thread control


0.77.4
======

properly shutdown and close IO threads and handles
always close comm channels
do not block on write when shutting down child


0.77.3
======

fix closing stdin


0.77.2
======

only do passwords and writes if child process is still alive
terminate stdin thread when child jobs finishes
add ProgressView to display either a bar graph or an increasing numeric


0.77.1
======

OrmFile
- keys are case-insensitive
- fall-through type is now str (was int)

use `aenum` for Enumerations instead of `enum34`
add ReturnCode Enumeration
multiple abbreviations allowed for switches
environment variables supported for argument values
pocket returns single item for single item, tuple for multiple items
add `script_fullname` which contains path and script name


0.77.0
======

backwards-incompatible change:  Truth -> Truthy, Falsth -> Falsey


0.76.0
======

add Trivalent, a three-valued logic class, with singletons of
Truth, Unknown, and False (+1, 0, -1)

return value of commands is now the returncode of the script


0.75.5
======

fix default validator in get_response


0.75.4
======

message in abort() is now optional
add error() alias to print to stderr
add support for wheels
improve get_response


0.75.3
======

support new envs and/or env vars
change method of killing timed-out jobs
suppress warnings about inspect.getargspec


0.75.2
======

redo Execute while loop


0.75.1
======

flush output


0.75.0
======

Execute
-------

- use timer loop to drive both subprocess and pty instead of signals
- do not strip any output before passwords
- keep Execute as convenience function; actual class changed to Job


0.74.41
=======

change Execute pty default back to False as I encountered issues with
forked processes forking other processes

use signal to provide timeout when pty is False on non-Windows systems;
(Windows systems are out of luck until Python 3.3)


0.74.40
=======

If Execute times out, modify resulting object instead of raising


0.74.38
=======

change Execute pty default on non-Windows systems to True


0.74.35
=======

allow other scriptionified modules to be imported
remove ability for Script to be used as a plain function


0.74.34
=======

arguments to Execute passed as a list no longer get quotes around them
reenable -h for help
do not show command name as a list in --help


0.74.33
=======

enhance Execute pty support
allow multiple passwords / raise if no password available


0.74.31
=======

--version now recognizes 'version', '__version__', 'VERSION', and
'__VERSION__'


0.74.30
=======

do not strip leading/trailing whitespace from Execute output


0.74.29
=======

-v only means 'verbose' if v has not been used as an abbreviation for some
other argument
remove whitespace from script __doc__ when printing help


0.74.28
=======

Execute: new 'interactive' paramater:
  False  -> only store output
  'echo' -> echo output as soon as feasible (and store)


0.74.26
=======

Execute: raise ExecuteTimeoutError when pty is True and timeout is exceeded;
all Execute*Error now have an attribute, process, that contains the Execute
attempt


0.74.25
=======

Execute: close error pipe when done reading (avoids resource leakage in long-
running processes)


0.74.24
=======

change mail() to not require a server (will attempt to use the server in the
recipients' address) or the port (defaults to 25); also, if message is a
string it will have its To, Cc, and Bcc fields split on comma to determine
recipients; finally, it will return a dictionary of recipients and error
information (if any) -- an empty dict means mail went to everyone


0.74.23
=======

better usage of docstrings in help output


0.74.21
=======

use 'help()' instead of raising exceptions for user errors
quote args that contain white space
fix writing error output from child


0.74.20
=======

inject script_verbosity


0.74.17
=======

use None as default for a MULTI option when specified in header (not
(None, ) )


0.74.16
=======

fix regression: parameter type from def will be used if none in Spec
fix regression: show script name in help output
fix help display when Scription has no function
show module __doc__ with help display
change global help to show commands and their doc strings; specific
command help will show details
always inject 'script_name' and 'script_command_name'
fix CHANGES file (not at 0.75 yet!)


0.74.15
=======

allow _params in commands to not be annotated
treat underscore and dash the same in command names


0.74.13
=======

allow returncode to be specified when using abort() or help()


0.74.12
=======

inject 'script_name' in to script's globals
add script_name to abort() and help() output
list all subcommands when --help is requested


0.74.10
=======

add wait_and_check(seconds, period=1): is True until <seconds> have elapsed,
and waits <period> seconds each check


0.73.08
=======

decode OrmFile (default is utf-8)


0.74.06
=======

decode command-line to unicode under Python2 (Python3 does this for us)


0.74.03
=======

add --version and --all-versions as scription built-ins


0.74.00
=======

add --verbose as a built-in


0.73.00
=======

converted from modules to package
added CHANGES and LICENSE files
