Highlights
----------
- Native integration of HDF5 files with the ``H5Store`` and ``H5StoreManager``, which are exposed as the ``job.data``, ``job.stores``, ``project.data``, and ``project.stores`` properties respectively.
- The newly added ``signac.get_job()`` function makes it easier to obtain instances of ``Job`` by calling the function from within a job's workspace directory or by directly providing the path to the job's workspace directory. This is especially useful for interactive work or when accessing jobs which are outside of the current project.
- Simplified export of project and job data to pandas dataframes *via* the ``to_dataframe()`` function.
- Projects and job search results are displayed nicely in Jupyter Notebooks.
- Support for compressed Collection files.
Added
------
- Official support for Python 3.7.
- The ``H5Store`` and ``H5StoreManager`` classes, which are useful for storing (numerical) array-like data with an HDF5-backend. These classes are exposed within the root namespace.
- The ``job.data`` and ``project.data`` properties which present an instance of ``H5Store`` to access numerical data within the job workspace and project root directory.
- The ``job.stores`` and ``project.stores`` properties, which present an instance of ``H5StoreManager`` to manage multiple instances of ``H5Store`` to store numerical array-like data within the project workspace and project root directory.
- The ``signac.get_job()`` and the ``signac.Project.get_job()`` functions that allow users to get a job handle by switching into or providing the job's workspace directory.
- The ``job`` variable is automatically set when opening a ``signac shell`` from within a job's workspace directory.
- Add the ``signac shell -c`` option which allows the direct specification of Python commands to be executed within the shell.
- Automatic cast of ``numpy`` arrays to lists when storing them within a ``JSONDict``, e.g., a ``job.statepoint`` or ``job.document``.
- Enable ``Collection`` class to manage collections stored in compressed files (gzip, zip, etc.).
- Enable deleting of ``JSONDict`` keys through the attribute interface, e.g., ``del job.doc.foo``.
- Pretty HTML representation of instances of ``Project`` and ``JobsCursor`` targeted at Jupyter Notebooks (requires pandas, automatically enabled when installed).
- The ``to_dataframe()`` function to export the job state point and document data of a ``Project`` or a ``JobsCursor``, e.g., the result of ``Project.find_jobs()``, as a ``pandas.Dataframe`` (requires pandas).
Changed
-------
- Dots (`.`) in keys are no longer allowed for ``JSONDict`` and ``Collection`` keys (previously deprecated).
- The ``JSONDict`` module is exposed in the root namespace, which is useful for storing text-serializable data with a JSON-backend similar to the ``job.statepoint`` or ``job.document``, etc.
- The ``Job.init()`` method returns the job to allow one-line job creation and initialization.
- The ``search`` argument was added to the ``signac.get_project()`` function, which when True (the default), will cause signac to search for a project within *and above* a specified root directory, not only within the root directory. The behavior without any arguments remains unchanged.
Fixed
-----
- Fix ``Collection.update()`` behavior such that existing documents with identical primary key are updated. Previously, a ``KeyError`` would be raised.
- Fix issue where the ``Job.move()`` would trigger a confusing ``DestinationExists`` exception when trying to move jobs across devices / file systems.
- Fix issue that caused failures when the ``python-rapidjson`` package is installed. The ``python-rapidjson`` package is used as the primary JSON-backend when installed.
- Fix issue where schema with multiple keys would subset incorrectly if the list of jobs or statepoints was provided as an iterator rather than a sequence.
Removed
-------
- Removes the obsolete and deprecated ``core.search_engine`` module.
- The previously deprecated ``Project.find_statepoints()`` and ``Project.find_job_documents()`` functions have been removed.
- The ``Project.find_jobs()`` no longer accepts the obsolete ``index`` argument.