Blob Blame History Raw
# fedmod modularity tools

fedmod provides tools for working with Fedora's modulemd metadata format
that aren't related to actually building them (for build commands, see
fedpkg and mbs-build).

Currently, this consists of:

* `fedmod <query-command>`: simple repoquery-like commands providing operations
  like listing modules, resolving dependencies for packages, finding out
  where a certain package is, etc. See the
  [user docs](https://pagure.io/modularity/fedmod/blob/master/f/src/README.md)
  for a full list of available query subcommands.
* `fedmod rpm2module`: generates a draft modulemd file based on
  the given RPM name (multiple RPM names can be given, but the resulting
  draft module will lack any descriptive metadata in that case)
* `fedmod fetch-metadata`: download the F28 package and module metadata needed
  to generate draft module definitions (the metadata sets to use are not yet
  configurable)

## Project status

`fedmod` is not yet available from the main Fedora repos, but can be installed
from [COPR](https://copr.fedorainfracloud.org/coprs/g/modularity/fedmod/)
as follows:

    $ sudo dnf copr enable @modularity/fedmod
    $ sudo dnf install fedmod
    $ fedmod fetch-metadata
    $ fedmod rpm2module graphite-web

This will generate a draft `modulemd` file for Fedora's `graphite-web`
package on stdout.

See the local development instructions below for info on running directly
from a local development clone with `pipenv`.

## User documentation

Please see the [User docs of fedmod modularity tools](https://pagure.io/modularity/fedmod/blob/master/f/src/README.md).


## Local development

### Runtime dependencies

The preferred dependency management tool for development is `pipenv`:

    $ pipenv --three --site-packages
    $ PIP_IGNORE_INSTALLED=1 pipenv install --dev

The `PIP_IGNORE_INSTALLED=1` setting means that everything available to `pip`
will be installed into the virtual environment based on `Pipfile.lock`, and only
components that aren't installable with `pip` will be used from the system
Python installation.

Some dependencies aren't currently available from PyPI, and hence need to be
installed system-wide:

    $ sudo dnf install libmodulemd python3-gobject-base python3-solv

### Additional development dependencies

`pipenv` itself isn't packaged for Fedora yet, so the recommended bootstrapping
approach is to use the "pip script installer", `pipsi`:

    $ sudo dnf install pipsi
    $ pipsi install pew
    $ pipsi install pipenv

This will create a pair of isolated virtual environments in your home directory
specifically for `pipenv` and the tool it uses for virtual environment
management, `pew`. These can later be updated to newer versions using `pipsi`:

    $ pipsi upgrade pew
    $ pipsi upgrade pipenv

(Note: the `pipsi list` command will list all packages installed via `pipsi`,
and the commands they provide)

### Running the development version

After setting up the `pipenv` environment, the development version can be
run as follows

    $ pipenv run fedmod fetch-metadata
    $ pipenv run fedmod rpm2module graphite-web

Alternatively, start an interactive shell as described below for running the
tests, and `fedmod` will refer to the development version.

### Running the tests

After going through the environment setup steps above, start a shell that's
correctly configured to run the tests with `fedmod` and all of its
dependencies available:

    $ pipenv shell

The metadata needed by the module generator tests can then be installed with
`fedmod` itself:

    $ fedmod fetch-metadata

The tests can then be run in the launched subshell with:

    $ pytest tests

To test the package build process, tox is also supported:

    $ tox -e py36


### Reviewing project dependencies

To see the Python level dependencies graph:

    $ pew toggleglobalsitepackages
    $ pipenv graph
    $ pew toggleglobalsitepackages

(If you don't turn off global site-packages access first, you'll get the
dependency graph of all the installed system Python components as well)


### Testing Fedora system package compatibility

While the default development environment is managed with `pipenv` for a more
consistent cross-platform development experience, `fedmod` is intended to
support installation as a system package in Fedora 26 and later.

A specific tox environment is provided to enable this testing:

    $ tox -e system

The only component this installs into the environment is `fedmod` itself: all
other dependencies must be available as Python 3 system packages.

Unlike the regular test environment, this environment also implicitly runs
`fedmod fetch-metadata` in order to ensure that the metadata fetching operation
also works correctly given only system packages as dependencies.

## Publishing new releases

### COPR releases

The main current release mechanism is through COPR at
https://copr.fedorainfracloud.org/coprs/g/modularity/fedmod/.

This is configured to automatically build a new release every time a new tag
is pushed to the `fedmod` git repository.

`fedmod`'s RPMs are built with `tito`, but version tagging is handled with a
helper script. To publish a new release, run:

    $ ./tag-release.sh <X.Y.Z>
    $ git push && git push --tags


### PyPI releases

`fedmod` is also published to PyPI here: https://pypi.org/project/fedmod/

After releasing to COPR to ensure everything is properly tagged, a new PyPI
release can be made by doing:

    $ cd src
    $ rm dist/*
    $ python setup.py sdist bdist_wheel
    $ twine upload dist/*

The `dnf` and `solv` dependencies unfortunately mean the PyPI release isn't
particularly useful at this point (`pipsi` doesn't allow system level
dependencies, and even if it did, platforms that provide these libraries are
also likely to provide access to COPR).