Summary
Improve and simplify the `Datafile` interface and allow datafiles to simultaneously exist in the cloud and locally.
Contents
Enhancements
- [x] Allow datafiles to have a local and a cloud location simultaneously
- [x] If a local path is added to a cloud datafile, sync datafile changes to the new local file and the cloud object
- [x] Raise error if project name missing when attempting to instantiate a datafile from a cloud object
- [x] Make `Datafile` cloud location attributes public (`cloud_path`, `bucket_name`, `project_name`, `path_in_bucket`, `cloud_protocol`)
- [x] Add `Datafile.exists_locally` property
Fixes
- [x] Stop correct input and configuration manifest paths being overruled in `Runner.run`
Refactoring
- [x] Remove parameters from `Datafile` cloud methods except `Datafile.to_cloud` so that there is only one way to update the cloud location explicitly and none implicitly (this ties a single `Datafile` instance more strongly to a single cloud location)
- [x] Convert `Datafile.get_local_path` method to `Datafile.local_path` property
- [x] Rename `Datafile.is_in_cloud` to `Datafile.exists_in_cloud`
Testing
- [x] Fix incorrect dataset and datafile paths in manifest template app test
<!--- SKIP AUTOGENERATED NOTES --->