Packages

class lsst.base.Packages(packages)

Bases: object

A table of packages and their versions.

There are a few different types of packages, and their versions are collected in different ways:

  1. Run-time libraries (e.g., cfitsio, fftw): we get their version from interrogating the dynamic library
  2. Python modules (e.g., afw, numpy; galsim is also in this group even though we only use it through the library, because no version information is currently provided through the library): we get their version from the __version__ module variable. Note that this means that we’re only aware of modules that have already been imported.
  3. Other packages provide no run-time accessible version information (e.g., astrometry_net): we get their version from interrogating the environment. Currently, that means EUPS; if EUPS is replaced or dropped then we’ll need to consider an alternative means of getting this version information.
  4. Local versions of packages (a non-installed EUPS package, selected with setup -r /path/to/package): we identify these through the environment (EUPS again) and use as a version the path supplemented with the git SHA and, if the git repo isn’t clean, an MD5 of the diff.

These package versions are collected and stored in a Packages object, which provides useful comparison and persistence features.

Example usage:

from lsst.base import Packages
pkgs = Packages.fromSystem()
print("Current packages:", pkgs)
old = Packages.read("/path/to/packages.pickle")
print("Old packages:", old)
print("Missing packages compared to before:", pkgs.missing(old))
print("Extra packages compared to before:", pkgs.extra(old))
print("Different packages: ", pkgs.difference(old))
old.update(pkgs)  # Include any new packages in the old
old.write("/path/to/packages.pickle")
Parameters:
packages : dict

A mapping {package: version} where both keys and values are type str.

Notes

This is essentially a wrapper around a dict with some conveniences.

Methods Summary

difference(other) Get packages in symmetric difference of self and another Packages object.
extra(other) Get packages in self but not in another Packages object.
fromSystem() Construct a Packages by examining the system.
missing(other) Get packages in another Packages object but missing from self.
read(filename) Read packages from filename.
update(other) Update packages with contents of another set of packages.
write(filename) Write to file.

Methods Documentation

difference(other)

Get packages in symmetric difference of self and another Packages object.

Parameters:
other : Packages

Other packages to compare against.

Returns:
difference : dict

Packages in symmetric difference. Keys (type str) are package names; values (type str) are their versions.

extra(other)

Get packages in self but not in another Packages object.

Parameters:
other : Packages

Other packages to compare against.

Returns:
extra : dict

Extra packages. Keys (type str) are package names; values (type str) are their versions.

classmethod fromSystem()

Construct a Packages by examining the system.

Determine packages by examining python’s sys.modules, runtime libraries and EUPS.

Returns:
packages : Packages
missing(other)

Get packages in another Packages object but missing from self.

Parameters:
other : Packages

Other packages to compare against.

Returns:
missing : dict

Missing packages. Keys (type str) are package names; values (type str) are their versions.

classmethod read(filename)

Read packages from filename.

Parameters:
filename : str

Filename from which to read.

Returns:
packages : Packages
update(other)

Update packages with contents of another set of packages.

Parameters:
other : Packages

Other packages to merge with self.

Notes

No check is made to see if we’re clobbering anything.

write(filename)

Write to file.

Parameters:
filename : str

Filename to which to write.