External data
=============

External data such as files and directories can be introduced as

::

    import taskblaster as tb

    @tb.workflow
    class Workflow:
        folder = tb.var()

        @tb.external_data
        def molecules_folder(self):
            return self.folder

        @tb.task
        def use_folder(self):
            return tb.node('run', folder=self.molecules_folder)

    def workflow(runner):
        runner.run_workflow(Workflow(folder='/home/user/molecules'))



Make sure you use absolute paths as strings when you supply the folder or a file. 
The external folder will be symlinked to the task folder as ``external``, and whenever
user depends on this ``external_data``, this symlink will be returned as a pathlib.Path object, and user
can access the files from this folder for example like: ``ase.io.read(folder / 'A.xyz')``.
If the external data is a file, then it will actually be copied.


The external file can be used as follows

::

    class Workflow:
        ...

        @tb.task
        def totree(self):
            return tb.node('tasks.totree', database=self.database)

    ...
    def totree(database):
        from ase.db import connect
        with connect(database.path):
            ...

