Skip to main content

Parse an expression for selecting stages and tags

Project description

Parse a mini-language for selecting objects by tag or name

[Home | GitLab | PyPI | ReadTheDocs]

This library is mostly useful for command-line parsing by other tools like tox-stages and nox-stages. It may be used to parse e.g. a command-line specification like @check and not pylint or @tests or ruff and then match it against a list of objects that have names and lists of tags.

Parse stage specifications

The parse_spec() function parses a string specification into a BoolExpr object that may later be used to select matching objects (e.g. test environments).

The specification mini-language may roughly be described as:

expr ::= and_expr ["or" and_expr...]
and_expr ::= not_expr ["and" not_expr...]
not_expr ::= ["not"] atom
atom ::= tag | keyword
tag ::= "@" characters
keyword ::= characters
characters ::= [A-Za-z0-9_-]+

Thus, all of the following:

  • @check
  • @check and @quick
  • @tests and not examples
  • not @tests
  • pep8 or not @quick and @check

...are valid expressions, with the "not", "and", and "or" keywords having their usual precedence (pep8 or not @quick and @check is parsed as pep8 or ((@not quick) and @check)).

Check whether an object matches a parsed specification

The parse-stages library provides two base dataclasses for objects that may be matched against parsed expressions: TaggedFrozen and Tagged. Both classes have the same members:

  • name: a string
  • tags: a list of strings
  • get_keyword_haystacks(): a method that returns a list of strings, [self.name] unless overridden

When a BoolExpr object's evaluate() method is called for a specific TaggedFrozen or Tagged object, it checks whether the specification matches the tags and keywords defined for this object. Tags are matched exactly, while a keyword is considered to match if it is contained in the checked string; e.g. pep would match both pep8 and exp_pep563, while @black would not match a black-reformat tag.

The get_keyword_haystacks() method returns the strings to look in for matching keywords. By default, it only returns the name field; however, it may be extended, e.g. for Nox sessions it may also return the name of the Python function that implements the session, for test classes with methods it may return the class name and the method name, etc.

Examples

Parse a list of stage specifications into expressions that may later be matched against test environment definitions:

e_check = parse_stages.parse_spec("@check")
e_check_quick = parse_stages.parse_spec("@check and @quick")
e_check_no_ruff = parse_stages.parse_spec("@check and not ruff")

specs = [(spec, parse_stages.parse_spec(spec)) for spec in args.stage_specs]

Select the test environments that match the specification:

# Obtain a list (okay, a dictionary) of test environments in some way
tox_envs = get_tox_environments()  # {"ruff": {"tags": ["check", "quick"]}, ...}

# Convert them to objects that the parsed expressions can match
all_envs = [
    parse_stages.TaggedFrozen(name, env["tags"])
    for name, env in tox_envs.items()
]

# Or define our own class that may hold additional information
@dataclasses.dataclass(frozen=True)
class TestEnv(parse_stages.TaggedFrozen):
    """A single test environment: name, tags, etc."""
    ...

all_envs = [TestEnv(name, env["tags"], ...) for name, env in tox_envs.items()]

# Select the ones that match the "@check" expression
matched = [env for env in all_envs if e_check.evaluate(env)]

# Or if we only care about the names...
quick_names = [env.name for env in all_envs if e_check_quick.evaluate(env)]

Contact

The parse-stages library was written by Peter Pentchev. It is developed in a GitLab repository. This documentation is hosted at Ringlet with a copy at ReadTheDocs.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

parse_stages-0.1.10.tar.gz (265.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

parse_stages-0.1.10-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file parse_stages-0.1.10.tar.gz.

File metadata

  • Download URL: parse_stages-0.1.10.tar.gz
  • Upload date:
  • Size: 265.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for parse_stages-0.1.10.tar.gz
Algorithm Hash digest
SHA256 a36d275771d5f5fc0e30ab2d5dbb1d1a3728332f78509e7ce621ad866b574481
MD5 1264e44748bf65e6370b76c63de13077
BLAKE2b-256 1bbe8b856f6bb3891bc81b0d7afd8268a5e88c126c06962271f052425ebd8a9c

See more details on using hashes here.

File details

Details for the file parse_stages-0.1.10-py3-none-any.whl.

File metadata

  • Download URL: parse_stages-0.1.10-py3-none-any.whl
  • Upload date:
  • Size: 9.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for parse_stages-0.1.10-py3-none-any.whl
Algorithm Hash digest
SHA256 a955dae639f9240a229aae5f9eb7a1adbc8d0b623069ce80ab43c0fca4d6f654
MD5 9aaa1ff4fbcdaa3d60e099ad2068090e
BLAKE2b-256 97e6c0e4d2b79e6fa2e0441370c615c346fca0b7a146dc8a9be6dc65586e9dc8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page