Metadata-Version: 2.1
Name: distroinfo
Version: 0.6.3
Summary: python module for parsing, validating and querying distribution/packaging metadata stored in human readable and reviewable text/YAML files
Home-page: https://github.com/softwarefactory-project/distroinfo
Author: Jakub Ruzicka
Author-email: dev@lists.rdoproject.org
License: Apache Software License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Environment :: OpenStack
Classifier: Intended Audience :: Information Technology
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: POSIX :: Linux
Requires-Python: >=3.9
Description-Content-Type: text/x-rst
License-File: LICENSE
License-File: AUTHORS
Requires-Dist: pbr >=6.0.0
Requires-Dist: PyYAML
Requires-Dist: requests
Requires-Dist: six
Provides-Extra: tests
Requires-Dist: pytest ; extra == 'tests'
Requires-Dist: pycodestyle ; extra == 'tests'

distroinfo
==========

``distroinfo`` is a python module for parsing, validating and querying
distribution/packaging metadata stored in human readable and reviewable
text/YAML files.

This is a proper generic (re)implementation of
`rdoinfo <https://github.com/redhat-openstack/rdoinfo>`__ parser which
proved well suited for the task of interfacing with distribution
metadata in a human friendly way. If you consider code reviews human
friendly, that is.

``distroinfo`` is a part of `Software Factory
project <https://softwarefactory-project.io/docs/>`__

STATUS
------

``distroinfo`` is available from Fedora/EPEL repos and is **BEING
INTEGRATED**.

`rdopkg <https://github.com/softwarefactory-project/rdopkg>`__ and
`DLRN <https://github.com/softwarefactory-project/DLRN>`__ are first
adopters.

``rdoinfo`` compatibility is ensured through offline and online tests.

CI is enabled.

See `distroinfo
reviews <https://softwarefactory-project.io/dashboard/project_distroinfo>`__.

Use github
`Issues <https://github.com/softwarefactory-project/distroinfo/issues>`__
to make requests and report bugs.

Installation
------------

from source
~~~~~~~~~~~

If you want to hack ``distroinfo`` or just have the latest code without
waiting for next release, you can use the git repo directly:

::

    git clone https://github.com/softwarefactory-project/distroinfo
    cd distroinfo
    python setup.py develop --user

You may set the preference over ``distroinfo`` RPM by correctly
positioning ``~/.local/bin/distroinfo`` in your ``$PATH``.

Or you can use virtualenv to avoid conflicts with RPM:

::

    git clone https://github.com/softwarefactory-project/distroinfo
    cd distroinfo
    virtualenv --system-site-packages ~/distroinfo-venv
    source ~/distroinfo-venv/bin/activate
    python setup.py develop
    ln `which distroinfo` ~/bin/distroinfo-dev

    distroinfo-dev --version

Required python modules are listed in
`requirements.txt <requirements.txt>`__.

from Fedora/EPEL repos (default)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``distroinfo`` is available on **Fedora 27** and newer:

::

    dnf install python2-distroinfo

including Python 3 version:

::

    dnf install python3-distroinfo

On CentOS/RHEL 7, ``distroinfo`` is available from
`EPEL <https://fedoraproject.org/wiki/EPEL>`__.

On **CentOS 7**:

::

    yum install epel-release
    yum install python2-distroinfo

On **RHEL 7**:

::

    yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    yum install python2-distroinfo

from PyPI
~~~~~~~~~

For your convenience, ``distroinfo`` is available from the Cheese Shop:

::

    pip install distroinfo

Usage
-----

You can **fetch info files from an URL** by specifying ``remote_info``
base URL:

::

    from distroinfo.info import DistroInfo

    RDOINFO_RAW_URL = \
        'https://raw.githubusercontent.com/redhat-openstack/rdoinfo/master/'

    di = DistroInfo('rdo-full.yml',
                    remote_info=RDOINFO_RAW_URL)
    info = di.get_info()

Or you can **fetch info files from a remote git repository** using
``remote_git_info``:

::

    from distroinfo.info import DistroInfo

    RDOINFO_GIT_URL = \
        'https://github.com/redhat-openstack/rdoinfo'

    di = DistroInfo('rdo-full.yml',
                    remote_git_info=RDOINFO_GIT_URL)
    info = di.get_info()

Or you can **fetch info files from a local directory** using
``local_info``:

::

    from distroinfo.info import DistroInfo

    INFO_PATH = '/path/to/info'

    di = DistroInfo('rdo-full.yml',
                    local_info=INFO_PATH)
    info = di.get_info()

For remote fetchers info files/repos are cached in
``~/.distroinfo/cache``.

You can navigate info structure yourself or use ``query`` module:

::

    from distroinfo import query

    # get a package info by strict package name
    nova = query.get_package(info, 'openstack-nova')

    # find a package by human reference (smart search)
    keystone = query.find_package(info, 'keystone')

Alternatively, you can get info with ``packages`` and ``releases`` as
dictionaries indexed by project/release name for easier access using
``info_dicts=True``:

::

    info = di.get_info(info_dicts=True)
    nova = info['packages']['nova']

It is also possible to filter packages matching a given criteria.
The following query will show all packages matching criteria conf: client AND tags: antelope.

::
    # rexen is a dictionary of applied filters.
    # pkg is the currently processed package.
    info = di.get_info()
    pkgs = info['packages']
    rexen = {"conf": "client", "tags": "antelope"}

    finding = query.filter_pkgs(pkgs, rexen)

It is also possible to apply negative filtering with "~" character, which
can be combined with other filters, like conf: client.

::
    info = di.get_info()
    pkgs = info['packages']
    rexen = {"tags": "~newton", "conf": "client"}
    finding = query.filter_pkgs(pkgs, rexen)

When using this feature, the output will contain packages WITHOUT newton tag but
containing conf:client.

Until proper documentation is in place, please refer to:

-  `rdoinfo <https://github.com/redhat-openstack/rdoinfo>`__ for prime
   example of ``distroinfo`` format usage
-  `rdoinfo integration
   tests <https://github.com/softwarefactory-project/distroinfo/blob/master/tests/integration/test_rdoinfo_online.py>`__
   for code examples
-  `dlrn.drivers.rdoinfo <https://github.com/softwarefactory-project/DLRN/blob/master/dlrn/drivers/rdoinfo.py>`__
   for a real world code that uses tags and
   ``remote_git_info``/``local_info``
-  `distroinfo.info <https://github.com/softwarefactory-project/distroinfo/blob/master/distroinfo/info.py>`__
   to RTFS

Command Line Interface
----------------------

A simple CLI is provided in ``scripts/di.py`` which can be used to test
basic ``distroinfo`` functionality, profile, dump parsed data, etc.

An example of dumping parsed rdoinfo into both YAML and JSON files:

::

    $> ./scripts/di.py dump -y rdoinfo.yaml -j rdoinfo.json -f git \
           'https://github.com/redhat-openstack/rdoinfo' rdo-full.yml

    Dumping YAML to: rdoinfo.yaml
    Dumping JSON to: rdoinfo.json

Additional ``docopt`` module is required to run the CLI.

Bugs
----

Please use the `github
Issues <https://github.com/softwarefactory-project/distroinfo/issues>`__
to report bugs.

