13 months agoDrop deprecation filters for pip and yamllint master
Jeremy Stanley [Sat, 15 Oct 2022 17:33:14 +0000 (17:33 +0000)]
Drop deprecation filters for pip and yamllint

With the releases of pip 22.3 and yamllint 1.28.0, several more
deprecation warnings have been addressed. Remove them from our
testing filter list.

14 months agoRemove more Python warning filters
Jeremy Stanley [Sat, 1 Oct 2022 17:04:29 +0000 (17:04 +0000)]
Remove more Python warning filters

Many warnings emitted by dependencies have been fixed, so drop them
from the list of ones to ignore.

14 months agoAdd "ro" to the codespell exclusion list
Jeremy Stanley [Mon, 12 Sep 2022 13:45:00 +0000 (13:45 +0000)]
Add "ro" to the codespell exclusion list

We use "ro" as a standard abbreviation for "read only," but it seems
that codespell has recently started to not like it.

16 months agoSimplify test warning filter for Pip 22.2
Jeremy Stanley [Tue, 2 Aug 2022 13:54:39 +0000 (13:54 +0000)]
Simplify test warning filter for Pip 22.2

The fix to replace Pip's use of the deprecated cgi module was
included in the 22.2 release, so we can clean up our exclusion for
that particular DeprecationWarning.

16 months agoStub out initial inventory management commands
Jeremy Stanley [Tue, 26 Jul 2022 22:21:05 +0000 (22:21 +0000)]
Stub out initial inventory management commands

Basic command framework to get items into your inventory, drop items
from your inventory, and list items in your inventory. No
functionality is yet implemented by these.

17 months agoChange SetupTools pyproject.toml metadata warning
Jeremy Stanley [Sun, 26 Jun 2022 12:25:49 +0000 (12:25 +0000)]
Change SetupTools pyproject.toml metadata warning

A recent update to SetupTools has altered the warning message it
emits about the experimental nature of its pyproject.toml-based
metadata parser. Update our PYTHONWARNINGS filter to match.

18 months agoMove SetupTools metadata into pyproject.toml
Jeremy Stanley [Thu, 26 May 2022 16:50:08 +0000 (16:50 +0000)]
Move SetupTools metadata into pyproject.toml

SetupTools 61 adds experimental support for reading metadata from
pyproject.toml files instead of traditional or setup.cfg.
PBR still seems to require the package name in setup.cfg for now,
but otherwise hollow this file out moving everything to the new
solution. Because this is experimental, silence a warning from
SetupTools which states that. Also work around newer SetupTools
complaints about namespace packages included as data by informing it
that mudpy.tests and mudpy.tests.fixtures are included modules even
though they really aren't.

18 months agoForce testing with newer pip and friends
Jeremy Stanley [Thu, 26 May 2022 16:41:25 +0000 (16:41 +0000)]
Force testing with newer pip and friends

Set the "download" option to true in the default tox testenv, so
that pip, SetupTools and wheel will be updated to newer versions
when tests start. This should be manually overridden for now if
offline testing with precreated venvs is desired.

18 months agoUpdate warning filters for Python 3.11.0b1 etc
Jeremy Stanley [Thu, 26 May 2022 16:36:17 +0000 (16:36 +0000)]
Update warning filters for Python 3.11.0b1 etc

Python 3.11.0b1 adds new deprecation warnings for "dead batteries"
in the stdlib, both for our dependencies and ourself (telnetlib is
used a bit in the selftest). Also some new warnings are cropping up
with pip 22 and SetupTools 62, so filter those for now until they're
solved. Drop a filter for deprecated sre_constants use in the
pkg_resources vendored version of pyparsing which has recently been

19 months agoVarious tox.ini improvements and cleanup 0.5.0
Jeremy Stanley [Tue, 19 Apr 2022 14:43:15 +0000 (14:43 +0000)]
Various tox.ini improvements and cleanup

Be more explicit about when we do and don't install the project in
different testenvs by setting skip_install. This is currently
redundant, but a sensible safeguard in case the implicit behavior
from skipsdist and no usedevelop ever changes.

Use shutil.rmtree() in place of calling `rm` so that we won't need
an allowlist of executables outside the venv.

Switch to tox's {envpython} replacement macro rather than invoking
the interpreter by its assumed name, for improved portability.

Inherit {[testenv]deps} in the deps list for any testenv which needs
to extend it rather than duplicating its contents, for the sake of

Don't bother listing flake8 as an explicit dep in its testenv, since
the flake8-bugbear plugin will pull it in as a requirement anyway.

Update the DeprecationWarning comment about pyparsing now that the
fix is available in 3.0.8 (but still not updated where it's being

19 months agoForce UTF-8 mode for testing
Jeremy Stanley [Tue, 19 Apr 2022 14:39:11 +0000 (14:39 +0000)]
Force UTF-8 mode for testing

against addition of any non-UTF-8 behaviors or reliance on implicit
encoding default, and to make sure things will continue to work when
these switches are on by default in future versions of the

19 months agoDrop unnecessary wheel build dependency
Jeremy Stanley [Tue, 19 Apr 2022 13:43:36 +0000 (13:43 +0000)]
Drop unnecessary wheel build dependency

Wheel is included automatically when needed, so simplify the backend
deps accordingly.

20 months agoIgnore deprecation warnings for Python 3.11.0a7
Jeremy Stanley [Wed, 6 Apr 2022 14:51:49 +0000 (14:51 +0000)]
Ignore deprecation warnings for Python 3.11.0a7

pip._vendor.pyparsing.core and pkg_resources._vendor.pyparsing raise
DeprecationWarning "module 'sre_constants' is deprecated" until a
new release containing is vendored
into pip and pkg_resources.

21 months agoClarify log message about missing data files
Jeremy Stanley [Sat, 12 Mar 2022 15:52:35 +0000 (15:52 +0000)]
Clarify log message about missing data files

When files are going to be written to and don't exist yet, such as
on new installations, make it clearer in the log that this is not
actually a problem.

21 months agoDrop support for Python 3.6
Jeremy Stanley [Mon, 28 Feb 2022 19:55:37 +0000 (19:55 +0000)]
Drop support for Python 3.6

As Python 3.6 officially reached end of life 2 months ago, remove
support for it. Also simplify our reload handler now that we no
longer need a separate workaround for interpreters older than 3.7.

22 months agoDrop warning filter for filelock poll_intervall
Jeremy Stanley [Tue, 18 Jan 2022 19:16:54 +0000 (19:16 +0000)]
Drop warning filter for filelock poll_intervall

Tox 20.11.0 corrected its use of filelock to stop passing the
deprecated poll_intervall parameter in favor of its newer
poll_interval, so we no longer need to filter the warning about it
when using latest Tox.

23 months agoUse PBR as a PEP 517 build backend
Jeremy Stanley [Sat, 1 Jan 2022 16:26:17 +0000 (16:26 +0000)]
Use PBR as a PEP 517 build backend

Recent versions of PBR are now capable of being integrated as a
build backend per the PEP 517 specification, so that the
script no longer needs to be invoked directly by anything. Declaring
setup_requires is now done via a new pyproject.toml file instead.
This allows us to avoid some recent deprecations in SetupTools,
though the file itself needs to be retained as a stub for now since
it still gets imported by PBR's wrapper of the SetupTools build_meta

23 months agoUpdate warning filter for pip's vendored libs
Jeremy Stanley [Wed, 29 Dec 2021 17:56:38 +0000 (17:56 +0000)]
Update warning filter for pip's vendored libs

The path function in importlib_resources is deprecated, but called
from the versions of certifi and pep517 vendored by recent pip
releases. Ignore these with the PYTHONWARNINGS in tox.ini so they'll
be filtered out for now.

2 years agoStop relying on usedevelop in tox
Jeremy Stanley [Fri, 19 Nov 2021 19:38:35 +0000 (19:38 +0000)]
Stop relying on usedevelop in tox

At the moment, tox calls into directly when usedevelop is
true, which causes legacy codepaths to be traversed during those
tests. Switch to just adding the project directory to deps in the
testenvs where we previously relied on it to get the project

2 years agoUpdate warning filter for SetupTools and filelock
Jeremy Stanley [Fri, 19 Nov 2021 19:30:00 +0000 (19:30 +0000)]
Update warning filter for SetupTools and filelock

SetupTools 58.3.0 deprecated use of the setup_requires parameter as
well as calls to easy_install and install. The filelock
library (used by virtualenv, on which tox relies) is replacing its
poll_intervall parameter with poll_interval and has deprecated the
former in a 3.4.0 release. Ignore these with the PYTHONWARNINGS in
tox.ini so they'll be filtered out.

2 years agoSwitch back to normal PyYAML releases
Jeremy Stanley [Sat, 23 Oct 2021 17:07:58 +0000 (17:07 +0000)]
Switch back to normal PyYAML releases

Now that PyYAML 6.0.0 exists without the deprecated license_file
metadata, we can go back to consuming regular releases of that
package without breaking Python 3.11 testing.

2 years agoAdd preliminary support for Python 3.11
Jeremy Stanley [Sat, 9 Oct 2021 17:03:32 +0000 (17:03 +0000)]
Add preliminary support for Python 3.11

Now that Python 3.10 is officially released and 3.11 is receiving
alpha versions, indicate that we're testing with 3.11 by updating
the trove classifiers for the Python package.

Because PyYAML is not yet building manylinux wheels for 3.11, re-add
the PYTHONWARNINGS exclusion for its Cython language_version
ambiguity (hopefully targeted for a fix soon in v6). Also pin our
minimum PyYAML requirement to the initial v6 beta version in order
to avoid needing to reintroduce the license_file DeprecationWarning

2 years agoStrip specifiers in dependency version strings
Jeremy Stanley [Sat, 9 Oct 2021 16:57:22 +0000 (16:57 +0000)]
Strip specifiers in dependency version strings

When comparing installed module names with the package dependencies,
chop off the version specifiers included with the requirements
strings in order to ease matching them.

2 years agoAdjust warning exclusions for Python 3.10
Jeremy Stanley [Tue, 5 Oct 2021 01:44:37 +0000 (01:44 +0000)]
Adjust warning exclusions for Python 3.10

Drop some PYTHONWARNINGS ignore entries for exceptions which have
been fixed in dependencies, and add a new one for flake8's plugin

2 years agoDrop redundant license_files package metadata
Jeremy Stanley [Thu, 23 Sep 2021 18:01:14 +0000 (18:01 +0000)]
Drop redundant license_files package metadata

As of wheel 0.32.0, with the introduction of the license_files meta
directive, the default is already to include any files matching the
glob patterns 'LICEN[CS]E*', 'COPYING*', 'NOTICE*', or 'AUTHORS*'
which covers our LICENSE and AUTHORS files well, so let's simplify
and clean it up.

2 years agoUpdate the copyright year in the LICENSE file 0.4.1
Jeremy Stanley [Sun, 15 Aug 2021 20:08:37 +0000 (20:08 +0000)]
Update the copyright year in the LICENSE file

The copyright statement in the LICENSE file is intended to cover all
the files in the repository, so it should have the same end year as
the most recently edited files.

2 years agoFail selftest if anything is written to stderr
Jeremy Stanley [Sun, 15 Aug 2021 15:16:07 +0000 (15:16 +0000)]
Fail selftest if anything is written to stderr

The new ResourceWarning exceptions in Python 3.8 are ignored since
they're raised during garbage collection, which makes them easy to
miss even with PYTHONWARNINGS=error in our testing. Luckily, their
tracebacks are written to stderr, and we normally expect nothing
will be written to stderr on successful runs of the selftest script.
As a simple solution to avoid similar situations in the future,
cause the selftest run to fail if anything at all gets written to
the service's stderr.

2 years agoClose included files after reading
Jeremy Stanley [Sun, 15 Aug 2021 15:13:32 +0000 (15:13 +0000)]
Close included files after reading

Use a context block where raw files are included by our macro
replacement routine, so that we'll close the file descriptors once
we're finished reading them in.

2 years agoClose data files after reading
Jeremy Stanley [Sun, 15 Aug 2021 15:10:18 +0000 (15:10 +0000)]
Close data files after reading

Starting with Python 3.8, the interpreter raises a ResourceWarning
exception during garbage collection if it finds an unclosed file
descriptor. Because of where this exception gets raised, it's
ignored (but a warning is emitted on stderr).

Use a typical context block in our loop to load data files, so that
this condition won't occur.

2 years agoAdjust Telnet echo state on connection replacement
Jeremy Stanley [Sun, 15 Aug 2021 13:51:58 +0000 (13:51 +0000)]
Adjust Telnet echo state on connection replacement

When a new connection authenticates for the same account as an
established one, we jump straight from the password entry state to
whatever state the old connection was in. Because password entry
disables local echo in order to hide the user's input from the
screen, we need to make sure that the new connection's Telnet
options are copied to the user object and then inject a negotiation
to cause the Telnet stack to normalize to the echo setting for the
new state.

2 years agoIgnore warnings building PyYAML wheels on 3.10.0b4
Jeremy Stanley [Tue, 20 Jul 2021 15:09:29 +0000 (15:09 +0000)]
Ignore warnings building PyYAML wheels on 3.10.0b4

Recent versions of pip and wheel are raising DeprecationWarning when
trying to build wheels of PyYAML due to deprecated license_file
metadata, solved once lands
and is included in a new release.

Recent Cython is raising a FutureWarning when trying to build wheels
of PyYAML due to a missing language_version option, solved once lands and is included in a
new release.

2 years agoUpdate copyright year in built documentation
Jeremy Stanley [Mon, 5 Jul 2021 16:32:19 +0000 (16:32 +0000)]
Update copyright year in built documentation

We've made changes to documentation this year, but neglected to
update the copyright year in the footer of built docs, so do that

2 years agoUse build instead of
Jeremy Stanley [Mon, 5 Jul 2021 13:03:44 +0000 (13:03 +0000)]
Use build instead of

Start transitioning into the PEP517 future of Python packaging by
switching from explicitly calling to using the build
module. Move install requirements into setup.cfg and update the
install docs to refer to the new location. Get rid of the separate
documentation build requirements file by moving into tox.ini deps
for the docs testenv. While we're there, add some commentary in the
tox.ini about some of the more opaque choices we've made for docs
builds and testing YAML style.

2 years agoUpdate test warnings for Python 3.10.0b2
Jeremy Stanley [Sat, 5 Jun 2021 00:16:56 +0000 (00:16 +0000)]
Update test warnings for Python 3.10.0b2

Switch our PYTHONWARNINGS in tox.ini to use a string match on some
warnings which have become increasingly common for more modules
under Python 3.10.0b2. For those which can't be covered effectively
by matching their messages, get more specific by adding the
exception names to the current module exclusions. Hopefully this
will allow for fairly narrow warning filters while minimizing the
need for future additions, at least to the extent that's possible.

2 years agoUpdate test warnings for Python 3.9.5 and 3.10.0b1
Jeremy Stanley [Sun, 9 May 2021 16:18:30 +0000 (16:18 +0000)]
Update test warnings for Python 3.9.5 and 3.10.0b1

Adjust our PYTHONWARNINGS in tox.ini to add some new exclusions for
warnings appearing in Python 3.10.0b1, and also clean up some which
were resolved by it and by Python 3.9.5. Adjust the code comments
documenting these accordingly.

2 years agoAlphabetize entries in command data file
Jeremy Stanley [Sun, 2 May 2021 19:07:34 +0000 (19:07 +0000)]
Alphabetize entries in command data file

The refactoring which led to the evaluate debug command left it out
of alpha order in share/command.yaml, so correct that now.

2 years agoBe more robust with elapsed time counter 0.4.0
Jeremy Stanley [Mon, 26 Apr 2021 01:21:45 +0000 (01:21 +0000)]
Be more robust with elapsed time counter

Stress testing identified a rare startup race if a user connected
before the elapsed time counter was initialized. The odds of
encountering this in the wild are close to nonexistent, but it was
introducing occasional test failures.

Solve the race by reordering the actions taken on each pulse, so
that the counter is initialized before the listening socket is
created. Also force all access to the counter through setter/getter
methods and wrap in try/except to always return a value and properly
create the counter and containing element if it doesn't yet exist.

2 years agoRetry client connections in selftest
Jeremy Stanley [Sat, 17 Apr 2021 16:07:33 +0000 (16:07 +0000)]
Retry client connections in selftest

Replace a hard-coded delay after process start with a dynamic client
connection retry, which attempts to connect up to five times with
the first being immediate while subsequent connections observe an
exponential backoff over a three-second period before giving up.
This improves both speed and stability of test runs.

Also combine the ConnectionResetError and EOFError conditions which
could be raised later once the socket is in use, as the end result
of either is effectively the same.

2 years agoDon't wait during selftest process cleanup
Jeremy Stanley [Sat, 17 Apr 2021 16:05:03 +0000 (16:05 +0000)]
Don't wait during selftest process cleanup

Remove an unconditional one-second delay after executing kill during
process cleanup. Subsequent torture tests indicate this was likely
unnecessary, but it slowed down testing considerably.

2 years agoDon't leave dangling file descriptor in selftest
Jeremy Stanley [Sat, 17 Apr 2021 15:59:18 +0000 (15:59 +0000)]
Don't leave dangling file descriptor in selftest

Use context management when opening the configuration file in
selftests so that its file descriptor will be cleaned up as soon as
loading completes.

2 years agoMake dist checking directory-agnostic
Jeremy Stanley [Sat, 17 Apr 2021 15:47:18 +0000 (15:47 +0000)]
Make dist checking directory-agnostic

Use the toxindir replacement macro in tox.ini to properly anchor the
base directory for dist building and checking. This ensures it will
run successfully even if the current working directory is not the
top level directory of the source tree.

2 years agoGet more granular with Python warnings in tests
Jeremy Stanley [Sat, 17 Apr 2021 15:44:36 +0000 (15:44 +0000)]
Get more granular with Python warnings in tests

Apparently, the PYTHONWARNINGS envvar has a rather flexible grammar
which can do things like exclude specific modules. Take advantage of
this to temporarily whitelist persistent problems in dependencies
(particularly packaging ecosystem tools/libraries) until they're
solved by their respective upstreams.

2 years agoUse consistent spacing in tox variables and lists
Jeremy Stanley [Sat, 17 Apr 2021 15:42:21 +0000 (15:42 +0000)]
Use consistent spacing in tox variables and lists

Tox is fine with spaces between list elements and variable
assignment operators. We used more readable spacing in some parts of
tox.ini, so make the rest of the file consistent.

2 years agoStop setting a default install command for tox
Jeremy Stanley [Sat, 17 Apr 2021 15:38:47 +0000 (15:38 +0000)]
Stop setting a default install command for tox

The install command we've been setting for tox is effectively
equivalent to its internal default. Just drop it.

2 years agoDon't check spelling in data directory
Jeremy Stanley [Sat, 17 Apr 2021 15:34:30 +0000 (15:34 +0000)]
Don't check spelling in data directory

The selftest can write some fairly random strings into ephemeral
files in the data directory, which get left behind and might trigger
false positives for codespell. None of what appears in this
directory is committed into source control, so we really don't care.
Just skip checking it.

2 years agoLint autogenerated YAML
Jeremy Stanley [Sat, 6 Mar 2021 02:38:00 +0000 (02:38 +0000)]
Lint autogenerated YAML

Run the selftest before calling yamllint, so that we can confirm the
YAML files generated by the data module follow the same format as
those shipped in the repository.

2 years agoUse twine's strict mode
Jeremy Stanley [Sat, 6 Mar 2021 02:34:40 +0000 (02:34 +0000)]
Use twine's strict mode

Twine has added a --strict option, and for now it succeeds testing
our build artifacts, so start using it.

2 years agoStop trying to use PYTHONWARNINGS=error for now
Jeremy Stanley [Sat, 6 Mar 2021 02:28:42 +0000 (02:28 +0000)]
Stop trying to use PYTHONWARNINGS=error for now

Additional deprecations in Setuptools have made trying to treat them
as errors basically insurmountable, and will likely remain that way
in some of the older Python interpreters we still support. Update
the comments in tox.ini in an attempt to track the latest blockers.

2 years agoAdd descriptions to tox testenvs
Jeremy Stanley [Sat, 6 Mar 2021 02:18:42 +0000 (02:18 +0000)]
Add descriptions to tox testenvs

Include a one-line description for each testenv in the tox.ini file,
useful for generally documenting what they're for, and displayed by
the `tox -lv` command.

2 years agoStop using the tox-venv plugin
Jeremy Stanley [Sat, 6 Mar 2021 02:05:50 +0000 (02:05 +0000)]
Stop using the tox-venv plugin

The tox-venv plugin is deprecated, now that tox can call the venv
module directly in place of virtualenv. Drop it, stop recommending
it in the documentation, and configure tox to use venv explicitly

2 years agoCorrect package metadata
Jeremy Stanley [Mon, 22 Feb 2021 07:43:12 +0000 (07:43 +0000)]
Correct package metadata

The platforms and classifiers parameters in setup.cfg are supposed
to be plural, their singular forms are deprecated. Update them

2 years agoBind to loopback interface by default
Jeremy Stanley [Sat, 30 Jan 2021 01:06:16 +0000 (01:06 +0000)]
Bind to loopback interface by default

Adjust the fallback behavior for otherwise unconfigured address
binding to match the safe posture adopted in the sample

3 years agoUse released codespell
Jeremy Stanley [Thu, 3 Dec 2020 19:31:58 +0000 (19:31 +0000)]
Use released codespell

Now that codespell has cut a release supporting in-repo
configuration, simplify our tox testenv for it accordingly. Also
update the status on the deprecation warnings situation, as the
latest blockers now lie with Setuptools rather than PBR.

3 years agoSwitch the selftest dialogue to a normal dict
Jeremy Stanley [Sun, 1 Nov 2020 16:52:07 +0000 (16:52 +0000)]
Switch the selftest dialogue to a normal dict

Starting with Python 3.6, dicts are implicitly ordered (albeit as a
side effect in 3.6, 3.7 is consistent with 3.6 and guarantees
ordering in interpreter versions from that point on). We no longer
need to use collections.OrderedDict for the selftest dialogue as a
result, so use a regular dict there now to simplify it.

3 years agoUse PosixPath arguments with os.remove()
Jeremy Stanley [Sun, 1 Nov 2020 16:48:25 +0000 (16:48 +0000)]
Use PosixPath arguments with os.remove()

Starting with Python 3.6, it's possible to pass a PosixPath to the
os.remove function instead of having to use the .name attribute.

3 years agoAlways use ModuleNotFoundError
Jeremy Stanley [Sun, 1 Nov 2020 16:46:44 +0000 (16:46 +0000)]
Always use ModuleNotFoundError

Now that we no longer support Python 3.5, we can assume
ModuleNotFoundError is always available and drop our
backward-compatible workaround for it in

3 years agoDrop support for Python 3.5
Jeremy Stanley [Sun, 1 Nov 2020 16:10:17 +0000 (16:10 +0000)]
Drop support for Python 3.5

It's been a couple of months since Python 3.5 officially reached end
of life, so stop advertising support in preparation for beginning to
use features only available in Python 3.6 and later.

3 years agoMove debug warning from setup to load
Jeremy Stanley [Fri, 9 Oct 2020 16:55:20 +0000 (16:55 +0000)]
Move debug warning from setup to load

Relocate the warning logged about debug mode from the misc.setup()
function to the Universe class load() method. This way, if debug
mode is enabled in configuration during a live reload event, it will
be logged. Also update the admin documentation to reflect that
enabling or disabling debug can be done with a reload, not only a
restart. Correct a minor spacing error in the configuration docs

3 years agoIncorporate pending logs from load during reloads
Jeremy Stanley [Fri, 9 Oct 2020 16:42:04 +0000 (16:42 +0000)]
Incorporate pending logs from load during reloads

The load() method for Universe class objects accumulates potential
log entries because it can be called when logging hasn't been set up
yet (for example, early at service start). When called during a
reload, these messages were previously discarded. Instead, add them
to the loglines attribute of the new universe so they will get
properly logged.

3 years agoReorder loglines fields
Jeremy Stanley [Fri, 9 Oct 2020 16:35:46 +0000 (16:35 +0000)]
Reorder loglines fields

Switch the Universe.loglines attribute's structure to place the log
message first and the log level value second, so that it's
consistent with the order in which those parameters are supplied by
the misc.log() function. While we're adjusting this in the
misc.get_loglines() function, switch the output construction from
concatenation to format strings for improved manageability.

3 years agoRecast is_restricted() to a bool 0.3.0
Jeremy Stanley [Wed, 7 Oct 2020 15:54:20 +0000 (15:54 +0000)]
Recast is_restricted() to a bool

When returning from the is_restricted function, just coerce the
lookups to a boolean type rather than forcing False defaults for
each facet.

3 years agoThe del and return statements aren't functions
Jeremy Stanley [Wed, 7 Oct 2020 15:51:01 +0000 (15:51 +0000)]
The del and return statements aren't functions

Correct a number of uses of del and return which had superfluous
parentheses. These are statement keywords, not function names, so
don't require parentheses around their expressions.

3 years agoSupport Python 3.10
Jeremy Stanley [Wed, 7 Oct 2020 15:34:02 +0000 (15:34 +0000)]
Support Python 3.10

Update the package's trove metadata to indicate support for Python
3.10 now that 3.10.0a1 has been tagged.

3 years agoDon't fail dist or docs builds on deprecations
Jeremy Stanley [Wed, 7 Oct 2020 15:27:33 +0000 (15:27 +0000)]
Don't fail dist or docs builds on deprecations

The current deprecation issues in dependencies raise warnings for
the dist and docs tox environments when run with Python 3.9 as the
default python3 interpreter. Use the same exclusions in the base
testenv definition for them now, until the maintainers of those
dependencies release updates.

3 years agoReplace show result with debug evaluate command
Jeremy Stanley [Sat, 3 Oct 2020 20:16:02 +0000 (20:16 +0000)]
Replace show result with debug evaluate command

The show result subcommand was quite unsafe. Even though it limited
the globals for strings passed to the env() builtin, it was still
possible for admins to do things like call the exec() builtin and
then import other modules, or use open() to overwrite files
writeable by the user under which the engine was running.

Introduce a new evaluate command as a substitute and remove the show
result subcommand. Use the debugging framework to limit access to
evaluate so that it's only available if debug mode is enabled in the
configuration at the time the daemon is started. Further limit
evaluate to not have most of the normal builtins, and explicitly
reject any strings containing a double-underscore (__) so that base
attributes of other modules such as __builtins__ can't be called
into easily, or "lambda" so that lambda functions can't be used to
work around protections. Also add some selftests to make sure
evaluate can still use the expressions we previously tested with
show result, and that only administrators can use it, and that it's
only available to them when debug mode is enabled.

The evaluate command is still to be considered quite unsafe, and
debug mode should only be engaged when all administrators with
access to the service are trusted with the same permissions the
system account running the service also possesses.

3 years agoRun different selftests when debug mode is engaged
Jeremy Stanley [Sat, 3 Oct 2020 19:04:58 +0000 (19:04 +0000)]
Run different selftests when debug mode is engaged

Add two skiplist tuples to the selftest framework, one for tests to
remove when debug mode is on, another for tests to remove when debug
mode is off. This is not used yet, so the tuples are initially
empty. Also enable debug mode in the daemon config fixture so that
debug functionality can be tested in the normal selftest run. The
default example config (tested with tox -e selftest_config) covers
the debug disabled case.

3 years agoAdd warnings about debugging mode
Jeremy Stanley [Sun, 4 Oct 2020 15:11:58 +0000 (15:11 +0000)]
Add warnings about debugging mode

Debugging mode is intended to enable administrative commands which
are especially unsafe and could even be used to run arbitrary shell
commands or alter files accessible to the user under which the
service runs. Log a warning about it at startup if the option has
been set, and insert some comments to that effect in the sample
configuration so that hopefully no one will turn it on without due
forethought. Also add a mention about its risks in the config doc.

3 years agoAdd restricted debug mode
Jeremy Stanley [Sat, 3 Oct 2020 18:09:10 +0000 (18:09 +0000)]
Add restricted debug mode

Create a new configuration flag, .mudpy.limit.debug, which indicates
unsafe debugging options will be available in the running engine.
This is unused, but lays the groundwork for future unsafe commands
to be toggled at start in base configuration.

3 years agoMake selftest dialogue mutable
Jeremy Stanley [Sat, 3 Oct 2020 17:45:47 +0000 (17:45 +0000)]
Make selftest dialogue mutable

In order to support future selectivity of test sets, replace the
immutable tuple of all tests with a dict keyed by test object.
Iterate over a copy of it so that the original is not altered when
tests are eventually removed during runtime. For Python 3.5 and
earlier, use OrderedDict so that test order is explicitly preserved.

3 years agoSkip spellcheck on logfiles
Jeremy Stanley [Sat, 3 Oct 2020 17:32:56 +0000 (17:32 +0000)]
Skip spellcheck on logfiles

Add any filenames ending with .log to the skiplist for codespell

3 years agoAdd is_restricted boolean check for commands
Jeremy Stanley [Fri, 2 Oct 2020 19:59:45 +0000 (19:59 +0000)]
Add is_restricted boolean check for commands

In preparation for adding additional command restriction indicators,
add a simple Element class method to return whether a command
element is flagged as administrative.

3 years agoAdd is_admin method to Element and User classes
Jeremy Stanley [Wed, 30 Sep 2020 19:57:13 +0000 (19:57 +0000)]
Add is_admin method to Element and User classes

For clarity and convenience, create an is_admin() boolean check for
whether a User's account or an actor Element's owner's account is
flagged as an administrator. Put them to use in places where the
administrator facet was previously checked directly. This allows us
to do a little additional safety checking to avoid hitting corner
cases where we try to check some object which may or may not have an

3 years agoStreamline can_run access control method
Jeremy Stanley [Wed, 30 Sep 2020 18:07:46 +0000 (18:07 +0000)]
Streamline can_run access control method

Minor rework of can_run() to replace the chain of elifs with simple
short-circuiting conditions each with its own return() so that it's
clearer this operates in a "first match" model.

3 years agoCheck for warnings in the to dist env 0.2.1
Jeremy Stanley [Sat, 19 Sep 2020 14:34:43 +0000 (14:34 +0000)]
Check for warnings in the to dist env

Some deprecated Setuptools operations were removed in a recent PBR
release, allowing us to now build sdist and wheel artifacts with
warnings as errors. There are still a couple more outstanding
deprecation fixes needed for other envs, so update the comment in
tox.ini accordingly.

3 years agoExplicitly close files opened by selftest
Jeremy Stanley [Sat, 19 Sep 2020 14:32:11 +0000 (14:32 +0000)]
Explicitly close files opened by selftest

Newer Python interpreters emit a warning during cleanup if open
files are not closed prior to termination. Our selftest opens the
pidfile for reading in a couple of places, as well as logfiles to
capture stdout/stderr. Open them in context blocks so they will be
closed on return rather than remaining open until the process ends.

3 years agoHandle early wrapping in test_show_result
Jeremy Stanley [Sat, 19 Sep 2020 14:29:59 +0000 (14:29 +0000)]
Handle early wrapping in test_show_result

When showing a Python module object, the included file path can
easily be long enough to wrap to the next line. Allow for line
breaks immediately before it in the test_show_result test where it
sometimes surfaces.

3 years agoDrop redundant master_doc setting from Sphinx conf
Jeremy Stanley [Sat, 19 Sep 2020 14:28:11 +0000 (14:28 +0000)]
Drop redundant master_doc setting from Sphinx conf

The master_doc option to Sphinx already defaults to looking for a
document named "index" so it's unnecessary to set explicitly in our
case. Clean it up.

3 years agoSwitch tox to use allowlist_externals
Jeremy Stanley [Wed, 16 Sep 2020 22:38:28 +0000 (22:38 +0000)]
Switch tox to use allowlist_externals

The whitelist_externals option in tox in deprecated in favor of
allowlist_externals. Update this and also bump our tox minversion to
the earliest version which supports this new syntax. While we're at
it, update a few code comments about bandit "nosec" exceptions to
refer to allowing instead of whitelisting.

3 years agoStart checking codebase with the codespell tool
Jeremy Stanley [Wed, 16 Sep 2020 22:24:02 +0000 (22:24 +0000)]
Start checking codebase with the codespell tool

Use master branch tip of codespell for now, until it supports
configuration in the included .codespellrc in a released version.
Also correct things its default dictionary selection identified as
misspellings, with the exception of intentional misspellings in the
sample spelling correction config and selftest which exercises it.

3 years agoRevert "No longer run in docs builds" 0.2.0
Jeremy Stanley [Sun, 23 Aug 2020 21:38:37 +0000 (21:38 +0000)]
Revert "No longer run in docs builds"

Turns out, PBR won't generate the ChangeLog without an explicit
install/build after all, or at least not in the way which tox is
handling it. This slipped through testing due to not running in a
clean tree.

This reverts commit 70381626690da47866363ef51ef8a37a4831dffa.

3 years agoRatchet down Python warnings in tox
Jeremy Stanley [Sun, 23 Aug 2020 21:14:43 +0000 (21:14 +0000)]
Ratchet down Python warnings in tox

Where possible, have tox envs treat any Python warning as an error.
This is not currently possible for any envs which invoke certain PBR
functionality, since it has a couple of outstanding fixes under
review to make it cease calling into deprecated code on newer Python
releases. Eventually this should be set in the global testenv when
possible, and only rolled back in case of dependency regressions or
new errors introduced by future interpreter versions.

3 years agoNo longer run in docs builds
Jeremy Stanley [Wed, 12 Aug 2020 09:56:24 +0000 (09:56 +0000)]
No longer run in docs builds

Since we don't skip sdist generation for our documentation builds in
tox, the separate install step is unnecessary as PBR will
already generate a current ChangeLog when the sdist is built.

3 years agoSet python_requires
Jeremy Stanley [Mon, 3 Aug 2020 10:35:10 +0000 (10:35 +0000)]
Set python_requires

Newer versions of pip will check PyPI for python_requires metadata,
helping to determine prior to package download if the local version
of the interpreter is sufficiently new to support a given package
version. Set ours to >= 3.5 for now. This should be increased any
time support for an old interpreter release is dropped from the list
in our trove classifiers.

3 years agoCorrect package metadata
Jeremy Stanley [Tue, 7 Jul 2020 10:50:19 +0000 (10:50 +0000)]
Correct package metadata

Use the more correct metadata fields recognized by
Setuptools/distutils rather in lieu of some used only by PBR.

3 years agoReport if service does not start under selftest
Jeremy Stanley [Tue, 2 Jun 2020 23:12:45 +0000 (23:12 +0000)]
Report if service does not start under selftest

Output a useful error and stop the selftest script immediately if
the service it tries to start does not actually start, to make
debugging some classes of errors slightly faster.

3 years agoPrefer importlib over pkg_resources
Jeremy Stanley [Sat, 23 May 2020 20:11:18 +0000 (20:11 +0000)]
Prefer importlib over pkg_resources

Since Setuptools pkg_resources library is effectively deprecated in
newer releases, try to use the equivalent importlib.metadata
features and exceptions when they're available.

3 years agoRecord the reported rows from NAWS negotiation
Jeremy Stanley [Wed, 22 Apr 2020 19:54:54 +0000 (19:54 +0000)]
Record the reported rows from NAWS negotiation

In preparation for future pagination support, get the rows included
in NAWS responses and record that as an integer in the User.rows
attribute, similar to the existing User.columns value used for line

3 years agoObtain terminal type (RFC 1091)
Jeremy Stanley [Sun, 12 Apr 2020 20:17:57 +0000 (20:17 +0000)]
Obtain terminal type (RFC 1091)

Implement rudimentary support for determining the terminal type
reported by RFC 1091 TTYPE compatible clients, and store any initial
value returned in the User.ttype attribute. This implementation does
not iterate over SEND TTYPE commands until UNKNOWN is returned, it
only takes the first value returned and assumes this is the default
terminal type for the user's current connection.

3 years agoOverhaul coder guide, add commands and misc
Jeremy Stanley [Sat, 21 Mar 2020 03:25:14 +0000 (03:25 +0000)]
Overhaul coder guide, add commands and misc

Brush up the quality of the coder guide, using relevant autodoc
references and clearer markup, as well as improving some wording.
Add a section on custom commands, and another for miscellaneous
design discussions taken from various recent E-mail threads.

3 years agoStart the install guide
Jeremy Stanley [Fri, 7 Feb 2020 08:12:17 +0000 (08:12 +0000)]
Start the install guide

Create a stub document with some installation and configuration
tips, to be expanded into something more useful over time.

3 years agoAdd the beginnings of an admin guide
Jeremy Stanley [Sun, 12 Jan 2020 08:04:54 +0000 (08:04 +0000)]
Add the beginnings of an admin guide

Some initial prose to seed the admin guide, taken from various
E-mails to users in recent months.

3 years agoCollapse redundant exceptions
Jeremy Stanley [Wed, 8 Jan 2020 23:29:54 +0000 (23:29 +0000)]
Collapse redundant exceptions

In User.enqueue_input() combine a redundant match on BlockingIOError
and OSError since the former is a subclass of the latter. This was
caught by the B014 check introduced in flake8-bugbear 20.1.1.

3 years agoIndicate support for Python 3.9
Jeremy Stanley [Tue, 7 Jan 2020 00:45:35 +0000 (00:45 +0000)]
Indicate support for Python 3.9

Python 3.9 is well into its second alpha, is a recognized trove
classifier on PyPI, and all mudpy changes are being successfully
tested against it. Add the classifier to our package metadata to
reflect this.

3 years agoLink the ChangeLog from package metadata
Jeremy Stanley [Tue, 7 Jan 2020 00:43:14 +0000 (00:43 +0000)]
Link the ChangeLog from package metadata

Users of PyPI are going to want to know where to find the ChangeLog
without going to the project homepage/docs and hunting around. Add a
flexible redirect URL for it so we can move it easily later.

3 years agoDrop section numbering from documentation builds
Jeremy Stanley [Tue, 7 Jan 2020 00:38:14 +0000 (00:38 +0000)]
Drop section numbering from documentation builds

Sphinx section numbering leads to confusing output, particularly for
the rendered ChangeLog. Remove it.

Update copyright year in the LICENSE as this is the first change of
the new year, and similarly update it in rendered documentation
footers as this is the first documentation change of the year.

3 years agoMake sure all command functions return True 0.1.1
Jeremy Stanley [Mon, 30 Dec 2019 17:52:01 +0000 (17:52 +0000)]
Make sure all command functions return True

Because recent adjustments to handler_active() rely on the
call_handler_function() return value to determine whether something
went wrong, we need command functions to return something which
evaluates boolean True if they ran to completion and didn't raise an
exception. Just return True from all of them for now, but they may
see more dynamic result handling in the future.

3 years agoIncrease timer resolution in test config 0.1.0
Jeremy Stanley [Mon, 30 Dec 2019 15:41:34 +0000 (15:41 +0000)]
Increase timer resolution in test config

Significantly speed up the timer in the test config (by a factor of
1000). On fast machines with cached tox envs, this results in an
order of magnitude improvement in test runtime. Related timer values
are lengthened to avoid test failures due to timeouts, and some
others are shortened for consistency.

This is obviously not suitable for normal operation, so the sample
configuration remains untouched and thus the tox selftest_config
testenv does not benefit from it.

3 years agoUse call_hook_function() in handler_active()
Jeremy Stanley [Mon, 30 Dec 2019 15:18:52 +0000 (15:18 +0000)]
Use call_hook_function() in handler_active()

Simplify mudpy.misc.handler_active() by making it a wrapper around
the more general mudpy.misc.call_hook_function() which was
originally derived from it.

3 years agoPreserve loglines on reload
Jeremy Stanley [Mon, 30 Dec 2019 01:49:32 +0000 (01:49 +0000)]
Preserve loglines on reload

When a reload occurs, prepend the new universe's loglines with those
from the old universe so they are not lost. This may temporarily
bloat the loglines list slightly over the limit, but it will be
adjusted downward the next time anything new gets logged. Also
adjust the `show log` selftests to handle linewraps in a new place
when the total loglines count is higher.

3 years agoSet bandit to error on risks of any severity
Jeremy Stanley [Sun, 29 Dec 2019 14:25:17 +0000 (14:25 +0000)]
Set bandit to error on risks of any severity

Now that the last of the low-level risks has been reviewed and
whitelisted, remove the severity filter from the bandit command so
that incorporation of any unexpected risks it can spot will be
blocked for future commits.