Package: bagit
bagit is a Python library and command line utility for working withBagItstyle packages.Installationbagit.py is a single-file python module that you can drop into your
project as needed or you can install globally with:pip install bagitPython v2.7+ is required.Command Line UsageWhen you install bagit you should get a command-line program called
bagit.py which you can use to turn an existing directory into a bag:bagit.py --contact-name 'John Kunze' /directory/to/bagFinding Bagit on your systemThebagit.pyprogram should be available in your normal command-line
window (Terminal on OS X, Command Prompt or Powershell on Windows,
etc.). If you are unsure where it was installed you can also request
that Python search forbagitas a Python module: simply replacebagit.pywithpython-mbagit:python -m bagit --helpOn some systems Python may have been installed aspython3,py,
etc. – simply use the same name you use to start an interactive Python
shell:py -m bagit --help
python3 -m bagit --helpConfiguring BagItYou can pass in key/value metadata for the bag using options like--contact-nameabove, which get persisted to the bag-info.txt. For a
complete list of bag-info.txt properties you can use as commmand line
arguments see--help.Since calculating checksums can take a while when creating a bag, you
may want to calculate them in parallel if you are on a multicore
machine. You can do that with the--processesoption:bagit.py --processes 4 /directory/to/bagTo specify which checksum algorithm(s) to use when generating the
manifest, use the –md5, –sha1, –sha256 and/or –sha512 flags (MD5 is
generated by default).bagit.py --sha1 /path/to/bag
bagit.py --sha256 /path/to/bag
bagit.py --sha512 /path/to/bagIf you would like to validate a bag you can use the –validate flag.bagit.py --validate /path/to/bagIf you would like to take a quick look at the bag to see if it seems
valid by just examining the structure of the bag, and comparing its
payload-oxum (byte count and number of files) then use the--fastflag.bagit.py --validate --fast /path/to/bagAnd finally, if you’d like to parallelize validation to take advantage
of multiple CPUs you can:bagit.py --validate --processes 4 /path/to/bagUsing BagIt in your programsYou can also use BagIt programatically in your own Python programs by
importing thebagitmodule.CreateTo create a bag you would do this:bag=bagit.make_bag('mydir',{'Contact-Name':'John Kunze'})make_bagreturns a Bag instance. If you have a bag already on disk
and would like to create a Bag instance for it, simply call the
constructor directly:bag=bagit.Bag('/path/to/bag')Update Bag MetadataYou can change the metadata persisted to the bag-info.txt by using theinfoproperty on aBag.# load the bagbag=bagit.Bag('/path/to/bag')# update bag info metadatabag.info['Internal-Sender-Description']='Updated on 2014-06-28.'bag.info['Authors']=['John Kunze','Andy Boyko']bag.save()Update Bag ManifestsBy defaultsavewill not update manifests. This guards against a
situation where a call tosaveto persist bag metadata accidentally
regenerates manifests for an invalid bag. If you have modified the
payload of a bag by adding, modifying or deleting files in the data
directory, and wish to regenerate the manifests set themanifestsparameter to True when callingsave.importshutil,os# add a fileshutil.copyfile('newfile','/path/to/bag/data/newfile')# remove a fileos.remove('/path/to/bag/data/file')# persist changesbag.save(manifests=True)The save method takes an optional processes parameter which will
determine how many processes are used to regenerate the checksums. This
can be handy on multicore machines.ValidationIf you would like to see if a bag is valid, use itsis_validmethod:bag=bagit.Bag('/path/to/bag')ifbag.is_valid():print("yay :)")else:print("boo :(")If you’d like to get a detailed list of validation errors, execute thevalidatemethod and catch theBagValidationErrorexception. If
the bag’s manifest was invalid (and it wasn’t caught by the payload
oxum) the exception’sdetailsproperty will contain a list ofManifestErrors that you can introspect on. Each ManifestError,
will be of typeChecksumMismatch,FileMissing,UnexpectedFile.So for example if you want to print out checksums that failed to
validate you can do this:bag=bagit.Bag("/path/to/bag")try:bag.validate()exceptbagit.BagValidationErrorase:fordine.details:ifisinstance(d,bagit.ChecksumMismatch):print("expected%sto have%schecksum of%sbut found%s"%(d.path,d.algorithm,d.expected,d.found))To iterate through a bag’s manifest and retrieve checksums for the
payload files use the bag’s entries dictionary:bag=bagit.Bag("/path/to/bag")forpath,fixityinbag.entries.items():print("path:%smd5:%s"%(path,fixity["md5"]))Contributing to bagit-python development% git clone git://github.com/LibraryOfCongress/bagit-python.git
% cd bagit-python
# MAKE CHANGES
% python test.pyRunning the testsYou can quickly run the tests by having setuptools install dependencies:python setup.py testOnce your code is working, you can useToxto run the tests with every
supported version of Python which you have installed on the local
system:toxIf you have Docker installed, you can run the tests under Linux inside a
container:% docker build -t bagit:latest . && docker run -it bagit:latestBenchmarksIf you’d like to see how increasing parallelization of bag creation on
your system effects the time to create a bag try using the included
bench utility:% ./bench.pyLicenseNote: By contributing to this project, you agree to license your work
under the same terms as those that govern this project’s distribution.