All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Logging Initialization
- a run-once
initialize
method takes care of it all - removed
set_width
,set_coloring
,set_graphics
- the env-var
TERM_COLOR_SUPPORT
is no longer checked - the env-var
EASYPY_LOG_INDENTATION
is no longer checked
- a run-once
- DataSize - return 'byte' and 'MiB' instead of '1 byte' and '1 MiB', except in
.render(humanize=True)
- logging: support for
logbook
as the underlying logging framework - logging: auto-initialize via env-var
EASYPY_AUTO_PATCH_LOGGING=logging|logbook
- logging: env-vars for configuring logging -
EASYPY_AUTO_GRAPHICAL_LOGGING
,EASYPY_AUTO_COLORED_LOGGING
- gevent: auto-patch via env-var
EASYPY_AUTO_PATCH_GEVENT=yes
- resilience: support returning exceptions captured by
resilient
decorator - Examples
- a skeleton for initializing logging with easypy
- collections: make
separate
,grouped
,chunkify
andtakesome
methods of the ObjectCollection classes
- support for gevent 1.5
ensure_same_defaults
decorator for setting one function's defaults as source of truth for other function- contexts: added
breakable_section()
, which allows breaking out of a context manager as if it were a loop - gevent: use gevent's native-threads instead of easypy's
- aliasing: Improve
RecursionError
for aliasing-induced infinite recursion - concurrency: don't swallow
KeyboardInterrupt
when running under gevent - colors: bug fix in handling markups with no text
- units: fix
__rfloordiv__
handling of unsupported operands
Project renamed as 'real-easypy'
- units: DataSize - return 'byte' and 'MiB' instead of '1 byte' and '1 MiB'
- units: Duration(inf) is now 'Eternity' instead of 'Never'
- timing: The Timer class now renders the duration using the Duration's repr, instead of as a float
- aliasing: Improved
RecursionError
for aliasing-induced infinite recursion
- CLI: expose 'colorize' and 'ziplog' as clis
- units: Added a
Percentage
class - timing: Added a
TimeInterval
class, for use for timestamp comparisons. Can be converted to/from theTimer
class - colors: Added '@[..]@' as coloring markup delimiter
- concurrency: Add parent's name to new thread's name, to show hierarchy
- concurrency: Add
done()
function toconcurrent
to check if the thread is finished. - collections: Add
.menu()
toObjectCollectionBase
, integrating withtermenu
- semver: Added a module and class for parsing and comparing semver-styled version strings
- random: Added 'perchance', for a common random use-case
- bunch: Added
.render()
to render the data cleanly - exceptions: support pickling
- CI: Add python 3.7 and 3.8
- sync: prevent an import cycle
- colors/ziplog: swallow BrokenPipeError when parsing from cmdline
- aliasing: bug fix for 'Cannot create a consistent method resolution', add unittest
- collections: workaround python bug (3.6.8+) importing 'test.support'
- Logging Initialization
- a run-once
initialize
method takes care of it all - removed
set_width
,set_coloring
,set_graphics
- the env-var
TERM_COLOR_SUPPORT
is no longer checked - the env-var
EASYPY_LOG_INDENTATION
is no longer checked
- a run-once
- ci: run tests in random order
- collections: added unittest
- sync: Don't release unacquired lock
- caching: Don't leak open db, as it is concurrent access which has undefined behavior
- concurrency
- refactor to fix stalling of main-thread after Futures.executor breaks on exception
- Update max number of threads
- logging: set default host in thread logging context
- resilience: match
retry
andretrying
function signature
- Support for suppressing and soloing logging to console per thread.
TypedStruct
: Support for inheritance.EasyMeta
: thebefore_subclass_init
hook.wait
anditer_wait
supportlog_interval
andlog_level
for printing the thrownPredicateNotSatisfied
to the log.takesome
: a new generator that partially yields a sequencerepr
andhash
to typed struct fields.PersistentCache
: allow disabling persistence via env-var (DISABLE_CACHING_PERSISTENCE
)- collections: raising user-friendly exceptions for failed object queries (too many, too few)
ExponentialBackoff
: return the value before the incrementation.concurrent
: captureKeyboardInterrupt
exceptions like any other.- doctests in various functions and classes.
SynchronizedSingleton
oncontextmanager
deadlock when some (but not all) of the CMs throw.resilient
betweentimecache
s bug.FilterCollection
: deal with missing attributes on objects (#163)PersistentCache
: don't clear old version when changing cache version- concurrency: documentation
SynchronizedSingleton
: deadlock condition when used withcontextmanager
(#150)- concurrency: make 'async' available only in python < 3.7, where it became reserved
- Reorganization:
- Moved tokens to a proper module.
- Moved function from
easypy.concurrency
andeasypy.timing
to new moduleeasypy.sync
- Moved
throttled
fromeasypy.concurrency
toeasypy.timing
.
easypy.signals
: Async handlers are invoked first, then the sequential handlers.async
->asynchronous
: to support python 3.7, where this word is reservedconcurrency.concurrent
:.result
property changed into method.result()
, which also waits on the threadeasypy.colors
: clean-up, documentation, and reverse-parsing from ansi to markup
Bunch
: The rigidKEYS
feature.synchronized_on_first_call
.ExponentialBackoff
: The unusediteration
argument.easypy.cartesian
easypy.selective_queue
easypy.timezone
locking_lru_cache
.
- Add the
easypy.aliasing
module. - Add the
easypy.bunch
module. - Add the
easypy.caching
module. - Add the
easypy.cartesian
module. - Add the
easypy.collections
module. - Add the
easypy.colors
module. - Add the
easypy.concurrency
module. - Add the
easypy.contexts
module. - Add the
easypy.decorations
module. - Add the
easypy.exceptions
module. - Add the
easypy.fixtures
module. - Add the
easypy.gevent
module. - Add the
easypy.humanize
module. - Add the
easypy.interaction
module. - Add the
easypy.lockstep
module. - Add the
easypy.logging
module. - Add the
easypy.meta
module. - Add the
easypy.misc
module. - Add the
easypy.mocking
module. - Add the
easypy.predicates
module. - Add the
easypy.properties
module. - Add the
easypy.randutils
module. - Add the
easypy.resilience
module. - Add the
easypy.selective_queue
module. - Add the
easypy.signals
module. - Add the
easypy.tables
module. - Add the
easypy.threadtree
module. - Add the
easypy.timezone
module. - Add the
easypy.timing
module. - Add the
easypy.typed_struct
module. - Add the
easypy.units
module. - Add the
easypy.words
module. - Add the
easypy.ziplog
module.