Added support for custom S3-compatible object stores. This functionality is available via the endpoint_url keyword argument when instantiating an S3Client instance. See documentation for more details. (#138 thanks to @YevheniiSemendiak)
Added CloudPath.upload_from which uploads the passed path to this CloudPath (issuse #58)
Added support for common file transfer functions based on shutil. Issue #108. PR #142.
CloudPath.copy copy a file from one location to another. Can be cloud -> local or cloud -> cloud. If client is not the same, the file transits through the local machine.
CloudPath.copytree reucrsively copy a directory from one location to another. Can be cloud -> local or cloud -> cloud. Uses CloudPath.copy so if client is not the same, the file transits through the local machine.
Added rich comparison operator support to cloud paths, which means you can now use them with sorted. (#129)
Added polymorphic class AnyPath which creates a cloud path or pathlib.Path instance appropriately for an input filepath. See new documentation for details and example usage. (#130)
Changed all custom cloudpathlib exceptions to be located in new cloudpathlib.exceptions module.
Changed all custom cloudpathlib exceptions to subclass from new base CloudPathException. This allows for easy catching of any custom exception from cloudpathlib.
Changed all custom exceptions names to end with Error as recommended by PEP 8.
Changed various functions to throw new CloudPathFileExistsError, CloudPathIsADirectoryError or CloudPathNotADirectoryError exceptions instead of a generic ValueError.
Removed exception exports from the root cloudpathlib package namespace. Import from cloudpathlib.exceptions instead if needed.
Fixed download_to method to handle case when source is a file and destination is a directory. (#121 thanks to @genziano)
Fixed bug where hash(...) of a cloud path was not consistent with the equality operator. (#129)
Fixed AzureBlobClient instantiation to throw new error MissingCredentialsError when no credentials are provided, instead of AttributeError. LocalAzureBlobClient has also been changed to accordingly error under those conditions. (#131)
Fixed GSClient to instantiate as anonymous with public access only when instantiated with no credentials, instead of erroring. (#131)
Added a new module cloudpathlib.local with utilities for mocking cloud paths in tests. The module has "Local" substitute classes that use the local filesystem in place of cloud storage. See the new documentation article "Testing code that uses cloudpathlib" to learn more about how to use them. (#107)
Added support for Google Cloud Storage. Instantiate with URIs prefixed by gs:// or explicitly using the GSPath class. (#113 thanks to @wolfgangwazzlestrauss)
Changed backend logic to reduce number of network calls to cloud. This should result in faster cloud path operations, especially when dealing with many small files. (#110, #111)
Fixed CloudPath instantiation so that reinstantiating with an existing CloudPath instance will reuse the same client, if a new client is not explicitly passed. This addresses the edge case of non-idempotency when reinstantiating a CloudPath instance with a non-default client. (#104)