git annex special remotes made easy
Project description
AnnexRemote
Helper module to easily develop special remotes for git annex. AnnexRemote handles all the protocol stuff for you, so you can focus on the remote itself. It implements the complete external special remote protocol and fulfils all specifications regarding whitespaces etc. This is ensured by an excessive test suite. Extensions to the protocol are normally added within hours after they've been published.
Getting started
Prerequisites
You need python3 installed on your system. AnnexRemote has been tested with version 3.4 to 3.7.
Installing
pip3 install annexremote
Running the tests
If you want to run the tests, copy the content of the tests
folder to the same location as annexremote.py
.
Then use a test discovery like nose to run them.
Usage
Import the necessary classes
from annexremote import Master
from annexremote import SpecialRemote
from annexremote import RemoteError
Now create your special remote class. It must subtype SpecialRemote
and implement at least the 6 basic methods:
class MyRemote(SpecialRemote):
def initremote(self):
# initialize the remote, eg. create the folders
# raise RemoteError if the remote couldn't be initialized
def prepare(self):
# prepare to be used, eg. open TCP connection, authenticate with the server etc.
# raise RemoteError if not ready to use
def transfer_store(self, key, filename):
# store the file in `filename` to a unique location derived from `key`
# raise RemoteError if the file couldn't be stored
def transfer_retrieve(self, key, filename):
# get the file identified by `key` and store it to `filename`
# raise RemoteError if the file couldn't be retrieved
def checkpresent(self, key):
# return True if the key is present in the remote
# return False if the key is not present
# raise RemoteError if the presence of the key couldn't be determined, eg. in case of connection error
def remove(self, key):
# remove the key from the remote
# raise RemoteError if it couldn't be removed
# note that removing a not existing key isn't considered an error
In your main
function, link your remote to the master class and initialize the protocol:
def main():
master = Master()
remote = MyRemote(master)
master.LinkRemote(remote)
master.Listen()
if __name__ == "__main__":
main()
Now save your program as git-annex-remote-$something
and make it executable.
chmod +x git-annex-remote-$something
(You'll need the sheebang line #!/usr/bin/env python3
)
That's it. Now you've created your special remote.
Export remotes
Import and subtype ExportRemote
instead of SpecialRemote
:
# ...
from annexremote import ExportRemote
class MyRemote(ExportRemote):
# implement the remote methods just like in the above example and then additionally:
def transferexport_store(self, key, local_file, remote_file):
# store the file located at `local_file` to `remote_file` on the remote
# raise RemoteError if the file couldn't be stored
def transferexport_retrieve(self, key, local_file, remote_file):
# get the file located at `remote_file` from the remote and store it to `local_file`
# raise RemoteError if the file couldn't be retrieved
def checkpresentexport(self, key, remote_file):
# return True if the file `remote_file` is present in the remote
# return False if not
# raise RemoteError if the presence of the file couldn't be determined, eg. in case of connection error
def removeexport(self, key, remote_file):
# remove the file in `remote_file` from the remote
# raise RemoteError if it couldn't be removed
# note that removing a not existing key isn't considered an error
def removeexportdirectory(self, remote_directory):
# remove the directory `remote_directory` from the remote
# raise RemoteError if it couldn't be removed
# note that removing a not existing directory isn't considered an error
def renameexport(self, key, filename, new_filename):
# move the remote file in `name` to `new_name`
# raise RemoteError if it couldn't be moved
Documentation
A full documentation is being worked on. Until then, have a look at the example and check the test cases in order to see how the other methods are used. Also have a look at git-annex-remote-googledrive which is based on AnnexRemote.
License
This project is licensed under GPLv3 - see the LICENSE file for details
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file annexremote-1.2.1.tar.gz
.
File metadata
- Download URL: annexremote-1.2.1.tar.gz
- Upload date:
- Size: 23.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.0 CPython/3.7.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2db60f428999fe2ad9a18c03feb94829ec88144279cb5630b77d62138cff3511 |
|
MD5 | e5d487d2d18c7dd868b98edd1b5370c4 |
|
BLAKE2b-256 | 9634ff4e7f3bcac6df2d7693b451b5a81cf9887610c8cf02a51750bed76eac72 |
File details
Details for the file annexremote-1.2.1-py3-none-any.whl
.
File metadata
- Download URL: annexremote-1.2.1-py3-none-any.whl
- Upload date:
- Size: 19.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.0 CPython/3.7.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b7fbfde240cbcc10d492c9ae3502151895587175c9a90f23d7e2f5540f248318 |
|
MD5 | 56a6b9567780e36bbd01aae22db84803 |
|
BLAKE2b-256 | e7b2452503d1e112235c987a11f8fc54906bee859ba9b3ea3188bde79fc247d8 |