cr8


Namecr8 JSON
Version 0.26.1 PyPI version JSON
download
home_pagehttps://github.com/mfussenegger/cr8
SummaryA collection of command line tools for crate devs
upload_time2024-03-25 15:18:05
maintainerNone
docs_urlNone
authorMathias Fußenegger
requires_python>=3.7
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ===
cr8
===

.. image:: https://github.com/mfussenegger/cr8/workflows/test%20&%20publish/badge.svg
    :target: https://github.com/mfussenegger/cr8/actions
    :alt: github actions

.. image:: https://img.shields.io/pypi/wheel/cr8.svg
    :target: https://pypi.python.org/pypi/cr8/
    :alt: Wheel

.. image:: https://img.shields.io/pypi/v/cr8.svg
   :target: https://pypi.python.org/pypi/cr8/
   :alt: PyPI Version

.. image:: https://img.shields.io/pypi/pyversions/cr8.svg
   :target: https://pypi.python.org/pypi/cr8/
   :alt: Python Version

A collection of command line tools for `Crate
<https://github.com/crate/crate>`_ developers (and maybe users as well).

TOC
====

- `Why cr8? 🤔`_
- `Install 💾`_
- `Usage`_
    - `Shell completion`_
- `Sub-commands`_
    - `timeit 🕐`_
    - `insert-fake-data`_
    - `insert-json`_
    - `insert-from-sql`_
    - `run-spec`_
    - `run-crate`_
        - `Script reproduction`_
        - `Find regressions`_
        - `Profiling`_
        - `Creating a CrateDB cluster`_
    - `run-track`_
    - `reindex`_
- `Protocols`_
- `Development ☢`_


Why cr8? 🤔
===========

1. To quickly produce sample data. Often if someone reports an issue sample
   data is required to be able to reproduce it.
   `insert-fake-data`_ and `insert-json`_ address this problem.

2. To benchmark queries & compare runtime across Crate versions.  `timeit 🕐`_,
   `run-spec`_ and `run-track`_ can be used to get runtime statistics of
   queries.
   These tools focus on response latencies. Being able to benchmark throughput
   is NOT a goal of cr8. Similarly, being able to simulate real-world use
   cases is also NOT a goal of cr8.



.. note::

    Although most commands output text by default. Most take a ``--output-fmt
    json`` argument to output JSON.
    This is useful if used together with `jq`_ to post-process the output


Install 💾
==========

Python >= 3.7 is required to use the command line tools.

Install them using `pip <https://pip.pypa.io/en/stable/>`_::

    python3.7 -m pip install --user cr8

This will install ``cr8`` into ``~/.local/bin``. Either use
``~/.local/bin/cr8`` to launch it or add ``~/.local/bin`` to your ``$PATH``
environment variable.


An alternative is to download a single ``zipapp`` file from the `releases page
<https://github.com/mfussenegger/cr8/releases>`_.


Usage
=====

The main binary is called ``cr8`` which contains a couple of sub-commands.

Use ``cr8 -h`` or ``cr8 <subcommand> -h`` to get a more detailed usage
description.

The included sub-commands are described in more detail below:

**Tip**:

Any `<subcommand>` with ``--hosts`` argument supports password authentication
like this::

    cr8 <subcommand> --hosts http://username:password@localhost:4200 <remaining args>


Shell completion
----------------

``cr8`` supports command completion in both ``bash`` and ``zsh`` via `argcomplete`_.

- Install ``argcomplete``
- Run ``activate-global-python-argcomplete``

Make sure you're using the ``argcomplete`` > 3.0.
In older versions of ``argcomplete`` it would be necessary to use the
``bashcompinit`` compatibility layer in ``zsh`` and register the application
via ``eval "$(register-python-argcomplete cr8)"``. See the upstream
documentation for details.


Sub-commands
============

timeit 🕐
---------

A tool that can be used to measure the runtime of a given SQL statement on a
cluster::

    >>> echo "select name from sys.cluster" | cr8 timeit --hosts localhost:4200
    Runtime (in ms):
        mean:    ... ± ...
        min/max: ... → ...
    Percentile:
        50:   ... ± ... (stdev)
        95:   ...
        99.9: ...


insert-fake-data
----------------

A tool that can be used to fill a table with random data. The script will
generate the records using `faker <https://github.com/joke2k/faker>`_.

For example given the table as follows::

    create table x.demo (
        id int,
        name text,
        country text
    );

The following command can be used to insert 1000 records::

    >>> cr8 insert-fake-data --hosts localhost:4200 --table x.demo --num-records 200
    Found schema:
    {
        "country": "text",
        "id": "integer",
        "name": "text"
    }
    Using insert statement:
    insert into "x"."demo" ("id", "name", "country") values ($1, $2, $3)
    Will make 1 requests with a bulk size of 200
    Generating fake data and executing inserts
    <BLANKLINE>

It will automatically read the schema from the table and map the columns to
faker `providers
<https://faker.readthedocs.io/en/latest/providers.html>`_ and insert the
give number of records.

(Currently only top-level columns are supported)

An alternative way to generate random records is `mkjson
<https://github.com/mfussenegger/mkjson>`_ which can be used together with
``insert-json``.

insert-json
-----------

``insert-json`` can be used to insert records from a JSON file::

    >>> cat tests/demo.json | cr8 insert-json --table x.demo --hosts localhost:4200
    Executing inserts: bulk_size=1000 concurrency=25
    Runtime (in ms):
        mean:    ... ± 0.000

Or simply print the insert statement generated from a JSON string::

    >>> echo '{"name": "Arthur"}' | cr8 insert-json --table mytable
    ('insert into mytable ("name") values ($1)', ['Arthur'])
    ...

insert-from-sql
---------------

Copies data from one CrateDB cluster or PostgreSQL server to another.

::

    >>> cr8 insert-from-sql \
    ...   --src-uri "postgresql://crate@localhost:5432/doc" \
    ...   --query "SELECT name FROM x.demo" \
    ...   --hosts localhost:4200 \
    ...   --table y.demo \
    INSERT INTO y.demo ("name") VALUES ($1)
    Runtime (in ms):
    ...


The ``concurrency`` option of the command only affects the number of concurrent
write operations that will be made. There will always be a single read
operation, so copy operations may be bound by the read performance.


run-spec
--------

A tool to run benchmarks against a cluster and store the result in another
cluster. The benchmark itself is defined in a spec file which defines `setup`,
`benchmark` and `teardown` instructions.

The instructions itself are just SQL statements (or files containing SQL
statements).

In the `specs` folder is an example spec file.

Usage::

    >>> cr8 run-spec specs/sample.toml localhost:4200 -r localhost:4200
    # Running setUp
    # Running benchmark
    <BLANKLINE>
    ## Running Query:
       Name: count countries
       Statement: select count(*) from countries
       Concurrency: 2
       Duration: 1
    Runtime (in ms):
        mean:    ... ± ...
        min/max: ... → ...
    Percentile:
        50:   ... ± ... (stdev)
        95:   ...
        99.9: ...
    ...
    ## Skipping (Version ...
       Statement: ...
    # Running tearDown
    <BLANKLINE>

`-r` is optional and can be used to save the benchmark result into a cluster.
A table named `benchmarks` will be created if it doesn't exist.

Writing spec files in python is also supported::

    >>> cr8 run-spec specs/sample.py localhost:4200
    # Running setUp
    # Running benchmark
    ...

run-crate
---------

Launch a Crate instance::

    > cr8 run-crate 0.55.0

This requires Java 8.

``run-crate`` supports chaining of additional commands using ``--``. Under the
context of ``run-crate`` any host urls can be formatted using the
``{node.http_url}`` format string::

    >>> cr8 run-crate latest-stable -- timeit -s "select 1" --hosts '{node.http_url}'
     # run-crate
    ===========
    <BLANKLINE>
    ...
    Starting Crate process
    CrateDB launching:
        PID: ...
        Logs: ...
        Data: ...
    <BLANKLINE>
    ...
    Cluster ready to process requests
    <BLANKLINE>
    <BLANKLINE>
    # timeit
    ========
    <BLANKLINE>
    <BLANKLINE>
    <BLANKLINE>
    <BLANKLINE>

In the above example ``timeit`` is a ``cr8`` specific sub-command. But it's
also possible to use arbitrary commands by prefixing them with ``@``::

    cr8 run-crate latest-nightly -- @http '{node.http_url}'


Script reproduction
~~~~~~~~~~~~~~~~~~~

One common use of this feature is to quickly reproduce bug reports::

    cr8 run-crate latest-nightly -- @crash --hosts {node.http_url} <<EOF
        create table mytable (x int);
        insert into mytable (x) values (1);
        refresh mytable;
        ...
    EOF


Find regressions
~~~~~~~~~~~~~~~~

Another use case is to use ``run-crate`` in combination with ``run-spec`` and
``git bisect``::

    git bisect run cr8 run-crate path/to/crate/src \
        -- run-spec path/to/spec.toml '{node.http_url}' --fail-if '{runtime_stats.mean} > 15'

This could also be combined with `timeout
<https://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html#timeout-invocation>`_.


Profiling
~~~~~~~~~

This can also be used in combination with the Java flight recorder to do
profiling::

    cr8 run-crate latest-nightly \
        -e CRATE_HEAP_SIZE=4g \
        -e CRATE_JAVA_OPTS="-Dcrate.signal_handler.disabled=true -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:+UnlockCommercialFeatures -XX:+FlightRecorder" \
        -s discovery.type=single-node \
        -- run-spec path/to/specs/example.toml {node.http_url} --action setup \
        -- @jcmd {node.process.pid} JFR.start duration=60s filename=myrecording.jfr \
        -- run-spec path/to/specs/example.toml {node.http_url} --action queries \
        -- @jcmd {node.process.pid} JFR.stop


Creating a CrateDB cluster
~~~~~~~~~~~~~~~~~~~~~~~~~~

``cr8`` doesn't contain a dedicated command to spawn a CrateDB cluster. But you
can run ``cr8 run-crate <version> -s cluster.name=<name>`` to launch multiple
nodes. If the cluster name matches, it will form a cluster.


run-track
---------

A tool to run ``.toml`` track files.
A track is a matrix definition of node version, configurations and spec files.

For each version and configuration a Crate node will be launched and all specs
will be executed::

    >>> cr8 run-track tracks/sample.toml
    # Version:  latest-testing
    ## Starting Crate latest-testing, configuration: default.toml
    ### Running spec file:  sample.toml
    # Running setUp
    # Running benchmark
    ...


reindex
-------

A command to re-index all tables on a cluster which have been created in the
previous major versions. So if you're running a 3.x CrateDB cluster, all tables
from 2.x would be re-created::

   >>> cr8 reindex --help
   usage: cr8 reindex [-h] --hosts HOSTS
   ...


Protocols
=========

``cr8`` supports using ``HTTP`` or the ``postgres`` protocol.

Note that using the postgres protocol will cause ``cr8`` to measure the
round-trip time instead of the service time. So measurements will be different.

To use the ``postgres`` protocol, the ``asyncpg`` scheme must be used inside hosts URIs:

::


    >>> echo "select 1" | cr8 timeit --hosts asyncpg://localhost:5432
    Runtime (in ms):
    ...


Development ☢
==============

To get a sandboxed environment with all dependencies installed use ``venv``::

    python -m venv .venv
    source .venv/bin/activate

Install the ``cr8`` package using pip::

    python -m pip install -e .

Run ``cr8``::

    cr8 -h

Tests are run with ``python -m unittest``

.. _jq: https://stedolan.github.io/jq/
.. _argcomplete: https://kislyuk.github.io/argcomplete/

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/mfussenegger/cr8",
    "name": "cr8",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": null,
    "author": "Mathias Fu\u00dfenegger",
    "author_email": "pip@zignar.net",
    "download_url": "https://files.pythonhosted.org/packages/f8/0a/4f3f9c92b9fbc3d5e13b0a80f63f1e754d0e32a77858f494793e70aff43a/cr8-0.26.1.tar.gz",
    "platform": null,
    "description": "===\ncr8\n===\n\n.. image:: https://github.com/mfussenegger/cr8/workflows/test%20&%20publish/badge.svg\n    :target: https://github.com/mfussenegger/cr8/actions\n    :alt: github actions\n\n.. image:: https://img.shields.io/pypi/wheel/cr8.svg\n    :target: https://pypi.python.org/pypi/cr8/\n    :alt: Wheel\n\n.. image:: https://img.shields.io/pypi/v/cr8.svg\n   :target: https://pypi.python.org/pypi/cr8/\n   :alt: PyPI Version\n\n.. image:: https://img.shields.io/pypi/pyversions/cr8.svg\n   :target: https://pypi.python.org/pypi/cr8/\n   :alt: Python Version\n\nA collection of command line tools for `Crate\n<https://github.com/crate/crate>`_ developers (and maybe users as well).\n\nTOC\n====\n\n- `Why cr8? \ud83e\udd14`_\n- `Install \ud83d\udcbe`_\n- `Usage`_\n    - `Shell completion`_\n- `Sub-commands`_\n    - `timeit \ud83d\udd50`_\n    - `insert-fake-data`_\n    - `insert-json`_\n    - `insert-from-sql`_\n    - `run-spec`_\n    - `run-crate`_\n        - `Script reproduction`_\n        - `Find regressions`_\n        - `Profiling`_\n        - `Creating a CrateDB cluster`_\n    - `run-track`_\n    - `reindex`_\n- `Protocols`_\n- `Development \u2622`_\n\n\nWhy cr8? \ud83e\udd14\n===========\n\n1. To quickly produce sample data. Often if someone reports an issue sample\n   data is required to be able to reproduce it.\n   `insert-fake-data`_ and `insert-json`_ address this problem.\n\n2. To benchmark queries & compare runtime across Crate versions.  `timeit \ud83d\udd50`_,\n   `run-spec`_ and `run-track`_ can be used to get runtime statistics of\n   queries.\n   These tools focus on response latencies. Being able to benchmark throughput\n   is NOT a goal of cr8. Similarly, being able to simulate real-world use\n   cases is also NOT a goal of cr8.\n\n\n\n.. note::\n\n    Although most commands output text by default. Most take a ``--output-fmt\n    json`` argument to output JSON.\n    This is useful if used together with `jq`_ to post-process the output\n\n\nInstall \ud83d\udcbe\n==========\n\nPython >= 3.7 is required to use the command line tools.\n\nInstall them using `pip <https://pip.pypa.io/en/stable/>`_::\n\n    python3.7 -m pip install --user cr8\n\nThis will install ``cr8`` into ``~/.local/bin``. Either use\n``~/.local/bin/cr8`` to launch it or add ``~/.local/bin`` to your ``$PATH``\nenvironment variable.\n\n\nAn alternative is to download a single ``zipapp`` file from the `releases page\n<https://github.com/mfussenegger/cr8/releases>`_.\n\n\nUsage\n=====\n\nThe main binary is called ``cr8`` which contains a couple of sub-commands.\n\nUse ``cr8 -h`` or ``cr8 <subcommand> -h`` to get a more detailed usage\ndescription.\n\nThe included sub-commands are described in more detail below:\n\n**Tip**:\n\nAny `<subcommand>` with ``--hosts`` argument supports password authentication\nlike this::\n\n    cr8 <subcommand> --hosts http://username:password@localhost:4200 <remaining args>\n\n\nShell completion\n----------------\n\n``cr8`` supports command completion in both ``bash`` and ``zsh`` via `argcomplete`_.\n\n- Install ``argcomplete``\n- Run ``activate-global-python-argcomplete``\n\nMake sure you're using the ``argcomplete`` > 3.0.\nIn older versions of ``argcomplete`` it would be necessary to use the\n``bashcompinit`` compatibility layer in ``zsh`` and register the application\nvia ``eval \"$(register-python-argcomplete cr8)\"``. See the upstream\ndocumentation for details.\n\n\nSub-commands\n============\n\ntimeit \ud83d\udd50\n---------\n\nA tool that can be used to measure the runtime of a given SQL statement on a\ncluster::\n\n    >>> echo \"select name from sys.cluster\" | cr8 timeit --hosts localhost:4200\n    Runtime (in ms):\n        mean:    ... \u00b1 ...\n        min/max: ... \u2192 ...\n    Percentile:\n        50:   ... \u00b1 ... (stdev)\n        95:   ...\n        99.9: ...\n\n\ninsert-fake-data\n----------------\n\nA tool that can be used to fill a table with random data. The script will\ngenerate the records using `faker <https://github.com/joke2k/faker>`_.\n\nFor example given the table as follows::\n\n    create table x.demo (\n        id int,\n        name text,\n        country text\n    );\n\nThe following command can be used to insert 1000 records::\n\n    >>> cr8 insert-fake-data --hosts localhost:4200 --table x.demo --num-records 200\n    Found schema:\n    {\n        \"country\": \"text\",\n        \"id\": \"integer\",\n        \"name\": \"text\"\n    }\n    Using insert statement:\n    insert into \"x\".\"demo\" (\"id\", \"name\", \"country\") values ($1, $2, $3)\n    Will make 1 requests with a bulk size of 200\n    Generating fake data and executing inserts\n    <BLANKLINE>\n\nIt will automatically read the schema from the table and map the columns to\nfaker `providers\n<https://faker.readthedocs.io/en/latest/providers.html>`_ and insert the\ngive number of records.\n\n(Currently only top-level columns are supported)\n\nAn alternative way to generate random records is `mkjson\n<https://github.com/mfussenegger/mkjson>`_ which can be used together with\n``insert-json``.\n\ninsert-json\n-----------\n\n``insert-json`` can be used to insert records from a JSON file::\n\n    >>> cat tests/demo.json | cr8 insert-json --table x.demo --hosts localhost:4200\n    Executing inserts: bulk_size=1000 concurrency=25\n    Runtime (in ms):\n        mean:    ... \u00b1 0.000\n\nOr simply print the insert statement generated from a JSON string::\n\n    >>> echo '{\"name\": \"Arthur\"}' | cr8 insert-json --table mytable\n    ('insert into mytable (\"name\") values ($1)', ['Arthur'])\n    ...\n\ninsert-from-sql\n---------------\n\nCopies data from one CrateDB cluster or PostgreSQL server to another.\n\n::\n\n    >>> cr8 insert-from-sql \\\n    ...   --src-uri \"postgresql://crate@localhost:5432/doc\" \\\n    ...   --query \"SELECT name FROM x.demo\" \\\n    ...   --hosts localhost:4200 \\\n    ...   --table y.demo \\\n    INSERT INTO y.demo (\"name\") VALUES ($1)\n    Runtime (in ms):\n    ...\n\n\nThe ``concurrency`` option of the command only affects the number of concurrent\nwrite operations that will be made. There will always be a single read\noperation, so copy operations may be bound by the read performance.\n\n\nrun-spec\n--------\n\nA tool to run benchmarks against a cluster and store the result in another\ncluster. The benchmark itself is defined in a spec file which defines `setup`,\n`benchmark` and `teardown` instructions.\n\nThe instructions itself are just SQL statements (or files containing SQL\nstatements).\n\nIn the `specs` folder is an example spec file.\n\nUsage::\n\n    >>> cr8 run-spec specs/sample.toml localhost:4200 -r localhost:4200\n    # Running setUp\n    # Running benchmark\n    <BLANKLINE>\n    ## Running Query:\n       Name: count countries\n       Statement: select count(*) from countries\n       Concurrency: 2\n       Duration: 1\n    Runtime (in ms):\n        mean:    ... \u00b1 ...\n        min/max: ... \u2192 ...\n    Percentile:\n        50:   ... \u00b1 ... (stdev)\n        95:   ...\n        99.9: ...\n    ...\n    ## Skipping (Version ...\n       Statement: ...\n    # Running tearDown\n    <BLANKLINE>\n\n`-r` is optional and can be used to save the benchmark result into a cluster.\nA table named `benchmarks` will be created if it doesn't exist.\n\nWriting spec files in python is also supported::\n\n    >>> cr8 run-spec specs/sample.py localhost:4200\n    # Running setUp\n    # Running benchmark\n    ...\n\nrun-crate\n---------\n\nLaunch a Crate instance::\n\n    > cr8 run-crate 0.55.0\n\nThis requires Java 8.\n\n``run-crate`` supports chaining of additional commands using ``--``. Under the\ncontext of ``run-crate`` any host urls can be formatted using the\n``{node.http_url}`` format string::\n\n    >>> cr8 run-crate latest-stable -- timeit -s \"select 1\" --hosts '{node.http_url}'\n     # run-crate\n    ===========\n    <BLANKLINE>\n    ...\n    Starting Crate process\n    CrateDB launching:\n        PID: ...\n        Logs: ...\n        Data: ...\n    <BLANKLINE>\n    ...\n    Cluster ready to process requests\n    <BLANKLINE>\n    <BLANKLINE>\n    # timeit\n    ========\n    <BLANKLINE>\n    <BLANKLINE>\n    <BLANKLINE>\n    <BLANKLINE>\n\nIn the above example ``timeit`` is a ``cr8`` specific sub-command. But it's\nalso possible to use arbitrary commands by prefixing them with ``@``::\n\n    cr8 run-crate latest-nightly -- @http '{node.http_url}'\n\n\nScript reproduction\n~~~~~~~~~~~~~~~~~~~\n\nOne common use of this feature is to quickly reproduce bug reports::\n\n    cr8 run-crate latest-nightly -- @crash --hosts {node.http_url} <<EOF\n        create table mytable (x int);\n        insert into mytable (x) values (1);\n        refresh mytable;\n        ...\n    EOF\n\n\nFind regressions\n~~~~~~~~~~~~~~~~\n\nAnother use case is to use ``run-crate`` in combination with ``run-spec`` and\n``git bisect``::\n\n    git bisect run cr8 run-crate path/to/crate/src \\\n        -- run-spec path/to/spec.toml '{node.http_url}' --fail-if '{runtime_stats.mean} > 15'\n\nThis could also be combined with `timeout\n<https://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html#timeout-invocation>`_.\n\n\nProfiling\n~~~~~~~~~\n\nThis can also be used in combination with the Java flight recorder to do\nprofiling::\n\n    cr8 run-crate latest-nightly \\\n        -e CRATE_HEAP_SIZE=4g \\\n        -e CRATE_JAVA_OPTS=\"-Dcrate.signal_handler.disabled=true -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:+UnlockCommercialFeatures -XX:+FlightRecorder\" \\\n        -s discovery.type=single-node \\\n        -- run-spec path/to/specs/example.toml {node.http_url} --action setup \\\n        -- @jcmd {node.process.pid} JFR.start duration=60s filename=myrecording.jfr \\\n        -- run-spec path/to/specs/example.toml {node.http_url} --action queries \\\n        -- @jcmd {node.process.pid} JFR.stop\n\n\nCreating a CrateDB cluster\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``cr8`` doesn't contain a dedicated command to spawn a CrateDB cluster. But you\ncan run ``cr8 run-crate <version> -s cluster.name=<name>`` to launch multiple\nnodes. If the cluster name matches, it will form a cluster.\n\n\nrun-track\n---------\n\nA tool to run ``.toml`` track files.\nA track is a matrix definition of node version, configurations and spec files.\n\nFor each version and configuration a Crate node will be launched and all specs\nwill be executed::\n\n    >>> cr8 run-track tracks/sample.toml\n    # Version:  latest-testing\n    ## Starting Crate latest-testing, configuration: default.toml\n    ### Running spec file:  sample.toml\n    # Running setUp\n    # Running benchmark\n    ...\n\n\nreindex\n-------\n\nA command to re-index all tables on a cluster which have been created in the\nprevious major versions. So if you're running a 3.x CrateDB cluster, all tables\nfrom 2.x would be re-created::\n\n   >>> cr8 reindex --help\n   usage: cr8 reindex [-h] --hosts HOSTS\n   ...\n\n\nProtocols\n=========\n\n``cr8`` supports using ``HTTP`` or the ``postgres`` protocol.\n\nNote that using the postgres protocol will cause ``cr8`` to measure the\nround-trip time instead of the service time. So measurements will be different.\n\nTo use the ``postgres`` protocol, the ``asyncpg`` scheme must be used inside hosts URIs:\n\n::\n\n\n    >>> echo \"select 1\" | cr8 timeit --hosts asyncpg://localhost:5432\n    Runtime (in ms):\n    ...\n\n\nDevelopment \u2622\n==============\n\nTo get a sandboxed environment with all dependencies installed use ``venv``::\n\n    python -m venv .venv\n    source .venv/bin/activate\n\nInstall the ``cr8`` package using pip::\n\n    python -m pip install -e .\n\nRun ``cr8``::\n\n    cr8 -h\n\nTests are run with ``python -m unittest``\n\n.. _jq: https://stedolan.github.io/jq/\n.. _argcomplete: https://kislyuk.github.io/argcomplete/\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A collection of command line tools for crate devs",
    "version": "0.26.1",
    "project_urls": {
        "Homepage": "https://github.com/mfussenegger/cr8"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e3a99bc780b1008f8d0957068ebcf6c3851b6957cd5520d2f426bd732f745d92",
                "md5": "3569a54cbca231653ecfac2d7b15166b",
                "sha256": "d3a3b3b825c10eacab5cb7b70bf9282c4bffb3d4098a45a8c157f855eec20910"
            },
            "downloads": -1,
            "filename": "cr8-0.26.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3569a54cbca231653ecfac2d7b15166b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 44357,
            "upload_time": "2024-03-25T15:18:01",
            "upload_time_iso_8601": "2024-03-25T15:18:01.932691Z",
            "url": "https://files.pythonhosted.org/packages/e3/a9/9bc780b1008f8d0957068ebcf6c3851b6957cd5520d2f426bd732f745d92/cr8-0.26.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f80a4f3f9c92b9fbc3d5e13b0a80f63f1e754d0e32a77858f494793e70aff43a",
                "md5": "f402590aa39b6abe5204d88529674784",
                "sha256": "7e71bdaadc1d7f49cb434f3e6bf22bd7d77e97c00e2472a3bd3cc0f85016d6c1"
            },
            "downloads": -1,
            "filename": "cr8-0.26.1.tar.gz",
            "has_sig": false,
            "md5_digest": "f402590aa39b6abe5204d88529674784",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 62016,
            "upload_time": "2024-03-25T15:18:05",
            "upload_time_iso_8601": "2024-03-25T15:18:05.680706Z",
            "url": "https://files.pythonhosted.org/packages/f8/0a/4f3f9c92b9fbc3d5e13b0a80f63f1e754d0e32a77858f494793e70aff43a/cr8-0.26.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-25 15:18:05",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "mfussenegger",
    "github_project": "cr8",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "cr8"
}
        
Elapsed time: 0.28212s