Building and Distributing Bundles¶
A bundle is a collection of code and data that can be added to ChimeraX to provide support for new graphical tools, commands, file formats, web databases and selection specifiers. This document describes the details of how to create a bundle and publish it in the ChimeraX toolshed. There is also a step-by-step example of writing a bundle available here.
Bundle Format¶
A ChimeraX bundle is packaged as a Python wheel.
A wheel usually contains Python and/or compiled code
along with additional resources such as icons,
data files, and documentation. While the
general Python wheel specification supports installing
files into arbitrary location, ChimeraX bundles
are limited to provide a single folder/directory,
which may be installed using the toolshed install
command. Bundle folders are typically placed in a
per-user location, which may be listed using the
toolshed cache
command.
It is possible but not recommended to use pip to
install a bundle. ChimeraX maintains a bundle
metadata cache for fast initialization, which
pip will not update, and therefore the bundle
functionality may not be available even though
the wheel is installed. In this event, try running
the toolshed refresh
command to force an update.
Creating bundles follows the same basic procedure as creating Python wheel, with a few ChimeraX customizations. The most straightforward way is to start with some ChimeraX sample code and modify it appropriately.
Bundle Sample Code¶
To build a bundle from the sample code,
you can either use the make
program, or the
ChimeraX application if you do not have make
.
On Linux and macOS, make
is available as part of the
developer package. On Windows, make
is
available as part of Cygwin.
The sample code can also be accessed from GitHub
(XML-based configuration ;
TOML-based configuration).
Because the sample code includes C++ source code that
need to be compiled, you will need a C++ compiler for
the build. On Windows, we use Microsoft Visual
Studio, Community 2015. On the Mac, we use Xcode
.
On Linux, gcc
and g++
are available in different
packages depending on the flavor of Linux.
The sample code is organized with “administrative” code
at the top level and actual bundle code in the src
folder. Administrative code, with the exception of
license text, is only used for building the bundle.
All other contents of the bundle should be in src
.
Administrative Files
Makefile is the configuration file used by the
make
command. This file is not used if you use thedevel
command to build and install your bundle.)README contains a pointer back to this document.
bundle_info.xml is an XML file containing information about the bundle, including its name, version, dependencies, etc. This file is used when you use the
devel
command to build and install your bundle.license.txt.bsd and license.txt.mit are two sample license text files. The actual file used when building the bundle is license.txt which must exist. For testing, simply renaming one of the sample license text file is sufficient. You may want to use a custom license for your actual bundle.
setup.py.in contains Python code for building the bundle. This file is a remnant from when bundles were built using the Python interpreter instead of ChimeraX It is here only as a potential starting point for developers who need greater control over the build process.
setup.cfg is the configuration file used when setup.py is run. This file should not be modified.
Bundle Source Code Files
__init__.py contains the bundle initialization code. Typically, it defines a subclass of the
chimerax.core.toolshed.BundleAPI
class and instantiates a single instance namedbundle_api
. ChimeraX communicates with the bundle through this singleton, which must conform to the bundle API.cmd.py contains code called by
bundle_api
from __init__.py for executing thesample
command. Before deciding on the name and syntax of your own command, you should look at the command style guide.io.py contains code called by
bundle_api
from __init__.py for opening XYZ files.tool.py contains code called by
bundle_api
from __init__.py for starting the graphical interface._sample_pyapi.cpp and _sample_pybind11.cpp contain sample C++ code that demonstrate two possible ways of binding C++ to Python. Thye compile into Python modules that each define two module functions. Which binding gets used at runtime is determined by the
api
argument of thesample
command.
Bundle Help Files
This sample bundle does not provide any help files, but if it did they would be provided as HTML files under a
src/docs
folder. Inside that folder documentation intended for developers should be in adevel
subfolder and documentation for users in auser
subfolder. Specifically, documentation for commands should be underuser/commands
as described here, and documentation for tools underuser/tools
as described here. Thedocs
directory also needs to be added to the list of data files in bundle_info.xml.
- Building and testing the Sample Bundle using ``ChimeraX``
Create a license.txt file. The easiest way is to copy license.txt.bsd to license.txt.
Start ChimeraX. In the command line, type
devel install pathname
where pathname is the path to the folder containing your bundle. This will build a wheel from your bundle and install it as a user bundle, i.e., it will not be installed in the user-specific folder rather than the ChimeraX folder.Check that the bundle works by opening a molecule and executing the command
sample count
. It should report the number of atoms and bonds for each molecule in the log.
- Building the Sample Bundle using ``make``
Edit Makefile and change
CHIMERAX_APP
to match the location of ChimeraX.app on your system.Create a license.txt file. The easiest way is to copy license.txt.bsd to license.txt.
Execute
make install
(which simply executesdevel install .
in ChimeraX).Check directory dist to make sure the wheel was created.
Check that the bundle works by opening a molecule and executing the command
sample count
. It should report the number of atoms and bonds for each molecule in the log.
Customizing the Sample Code¶
To convert the sample code into your own bundle, there are several importants steps:
First, customize the source code in the src folder for your bundle.
Edit bundle_info.xml to update bundle information. The supported elements are listed below in Bundle Information XML Tags.
Building and Testing Bundles¶
To build and test your bundle, execute the following command
(or run make install
which invokes the same command):
$(CHIMERAX_EXE) --nogui --cmd "devel install . ; exit"
Execute the
devel install .
command in ChimeraX. Python source code and other resource files are copied into the build folder. C/C++ source files, if any, are compiled and also copied into the build folder. The files in build are then assembled into a wheel in the dist directory. The assembled wheel is installed as a user bundle.
Note that on Windows $(CHIMERAX_EXE)
uses the
ChimeraX-console.exe
executable rather than the normal
ChimeraX.exe
. This is because on Windows an executable
cannot be both a GUI and a console app. So for running
ChimeraX with the --nogui
flag, you need to use the
console executable.
If the command completes successfully, fire up ChimeraX
(make test
is a shortcut if make
is available)
and try out your command. Warning and error messages
should appear in the Log
window.
If the bundle is not working as expected, e.g., command is
not found, tool does not start, and no messages are being
displayed, try executing $(CHIMERAX_EXE) --debug
(or make debug
for short), which runs ChimeraX
in debugging mode, and see if more messages are shown in
the console.
Distributing Bundles¶
With ChimeraX bundles being packages as standard Python
wheel-format files, they can be distributed as plain files
and installed using the ChimeraX toolshed install
command. Thus, electronic mail, web sites and file
sharing services can all be used to distribute ChimeraX
bundles.
Private distributions are most useful during bundle development, when circulation may be limited to testers. When bundles are ready for public release, they can be published on the ChimeraX Toolshed, which is designed to help developers by eliminating the need for custom distribution channels, and to aid users by providing a central repository where bundles with a variety of functionality may be found.
Customizable information for each bundle on the toolshed includes its description, screen captures, authors, citation instructions and license terms. Automatically maintained information includes release history and download statistics.
To submit a bundle for publication on the toolshed,
you must first sign in. Currently, only Google
sign in is supported. Once signed in, use the
Submit a Bundle
link at the top of the page
to initiate submission, and follow the instructions.
The first time a bundle is submitted to the toolshed,
approval from ChimeraX staff is needed before it is
published. Subsequent submissions, using the same
sign in credentials, do not need approval and should
appear immediately on the site.
Bundle Documentation¶
Your bundle’s documentation can be found and shown by ChimeraX’s
help tool. The help tool will look for documentation in
docs/user/commands/COMMANDNAME.html
and
docs/user/tools/TOOLNAME.html
.
You can store your documentation in your bundle’s src
tree, or
next to it as long as you use the appropriate ExtraDir
(XML)
attributes to package them in the correct locations:
src/docs/user/commands/
src/docs/user/tools/
For example, if your bundle had these folders:
src docs/user/commands docs/user/tools
Then you would put the following in your bundle_info.xml
<ExtraFiles>
<ExtraDir source='docs'/>
</ExtraFiles>
If you use pyproject.toml
, you can put your documentation in
any tree structure you like. For example, if your folder structure
was
src docs/commands docs/tools
Then your TOML would include:
[chimerax.extra-files]
"src/docs/user/commands" = ["docs/commands/*"]
"src/docs/user/tools" = ["docs/tools/*"]
Cleaning Up ChimeraX Bundle Source Folders¶
Two ``make
targets are provided for removing intermediate
files left over from building bundles:
make clean
Remove generated files, e.g., setup.py and build folder, as well as the dist folder containing the built wheels.
Using pyproject.toml
for Bundles¶
ChimeraX bundle information can optionally be stored in pyproject.toml. Details of that file are found in Using pyproject.toml for Bundles