-------------
- Rewrote like 70% of the code, including: jinja templates, jobs base class and subclasses
- added a :func:`slurmjobs.Singularity` class and template
- added parameter grid classes!! Lets you do grid arithmetic :)
- Renamed:
- ``slurmjobs.Batch`` => :func:`slurmjobs.Jobs`
- ``slurmjobs.SlurmBatch`` => :func:`slurmjobs.Slurm`
- ``slurmjobs.Jobs.default_options`` => ``slurmjobs.Jobs.options``
- ``slurmjobs.Jobs.JOB_ID_KEY`` => ``slurmjobs.Jobs.job_id_arg``
- Changed signatures:
- removed parameters from :func:`slurmjobs.Jobs.__init__`: ``multicmd, cmd_wrapper, init_script, run_init_script, post_script, paths``
- added ``Receipt(receipt_id='a-str-used-instead-of-hash_args()')``
- removed utilities:
- ``get_job_name``, ``make_job_name_tpl``, ``format_value_for_name``, ``_encode_special``, ``_decode_special``, ``_obliterate_special``:
replaced by :func:`slurmjobs.Jobs.format_id_item` and :func:`slurmjobs.Jobs.format_job_id`
- ``expand_grid``, ``expand_paired_params``, ``unpack``, ``split_cond`` replaced by :func:`slurmjobs.Grid`
- ``singularity_command`` replaced by :func:`slurmjobs.Singularity`
- ``Factory`` replaced by :func:`slurmjobs.util.subclass_lookup`
- :func:`slurmjobs.util.flatten` now returns a generator rather than a list.
- ``slurmjobs.Jobs.template`` and ``slurmjobs.Jobs.run_template`` both expect a template string (not a path).
to specify a path, either have a way to read it from file or just extend the template
- simplified argument formatting (removed special namedtuple classes)
- changed ``NoArgVal`` to just ``...``
- changed ``Argument.build`` to just ``Argument.__call__``
- improved how command, cli, and args are rendered (all done in jinja now)
- added overridable method ``Receipt.hash_args`` to allow for custom hashing
- added proper docs
- added tensorflow ``2.7`` to ``cuda_versions.csv``
- added ``scripts/singuconda`` and ``slurmjobs.singuconda`` as a WIP rewrite.