On Tue, Nov 15, 2011 at 3:49 PM, Germán Gutiérrez <[email protected]> wrote: > Thanks! It served me as a model to get started with it, I have a very > early draft, add only, jira backend, I'm slowly progressing with this > since I'm doing it on my spare time, which is too little :) > > I started with the twitter backend as a model that seems very > simple... in fact it is batantly based on it > > BTW, Can you explain what SyncMeme is about?
Hello German, the SyncMeme holds the relationship between the local GTG task, and the remote Jira task. In particular: - it knows which GTG task is the local copy of which Jira task - it knows what was the state of both tasks last time a sync happened. When a sync happens, the SyncEngine looks at the current status of local and remote tasks, and comparing that to the data in the SyncMeme, it decides which task should be updated/deleted/added. > > > Regards, > > Germán. > > On Thu, Nov 10, 2011 at 7:40 PM, Izidor Matušov > <[email protected]> wrote: >> Hi Germán, >> >> Am 10.11.2011 01:44, schrieb Germán Gutiérrez: >>> >>> Izidor, looks like you are the master in this, any helloworld.py >>> equivalent in backend world? >> >> Unfortunately, there is no well-written documentation or any helloworld. >> (The feature was still not released). >> >> I recommend you to get >> >> bzr branch lp:~gtg-contributors/gtg/google_tasks >> >> and look at backends for launchpad and google tasks. They are in general >> very similar although they do different things. (Google Tasks synchronize >> your tasks, launchpad only imports tasks) >> >> Luca: I was thinking about lowering the barrier for writing a new backend. >> There is a lot of redundant code for every backend (they are pretty much the >> same). What about making more high level interface so "user programmer" just >> provides the minimum of information (authenticate yourself, this is list of >> remote tasks, add to GTG tasks which you do not have, give me tasks, that >> has changed or were deleted so I can update them on server) I think it is >> sufficient to specify only those 3 things and details can be solved by >> internal, high-level interface. The goal might be to write a brand new, >> simple backend under 99 lines of code. What do you say? Do you want to work >> on it at the hackathon on 26th? >> >> A try to make a simple tutorial: >> >> 1, create file GTG/backends/backend_yourname.py >> 2, (optional) put icon of for your backend as >> data/icons/hicolor/scalable/apps/backend_yourname.png >> 3, open GTG/backends/backend_yourname.py and some other backend for >> inspiration >> 4, You have to include a lot of GTG import statements to get all things you >> need. >> 5, Put external library you need. (There might be already python bindings >> for your service or protocol) >> 6, Create a new class called Backend, extend PeriodicImportBackend >> 7, Put description for your backend, e.g.: >> _general_description = { >> GenericBackend.BACKEND_NAME: "backend_gtask", >> GenericBackend.BACKEND_HUMAN_NAME: _("Google Tasks"), >> GenericBackend.BACKEND_AUTHORS: ["Madhumitha Viswanathan", "Izidor >> Matušov"], >> GenericBackend.BACKEND_TYPE: GenericBackend.TYPE_READWRITE, >> GenericBackend.BACKEND_DESCRIPTION: >> _("This backend synchronizes your tasks with the web service " >> "Google Tasks\n\n" >> "Note: This product uses the Google Tasks API but is not " >> "endorsed or certified by Google Tasks"),\ >> } >> >> 8, Put parameters for your backend (e.g. username, other parameters): >> _static_parameters = { >> "username": { \ >> GenericBackend.PARAM_TYPE: GenericBackend.TYPE_STRING, \ >> GenericBackend.PARAM_DEFAULT_VALUE: "insert your username here"}, >> \ >> "period": { \ >> GenericBackend.PARAM_TYPE: GenericBackend.TYPE_INT, \ >> GenericBackend.PARAM_DEFAULT_VALUE: 2, }, >> "import-bug-tags": { \ >> GenericBackend.PARAM_TYPE: GenericBackend.TYPE_BOOL, \ >> GenericBackend.PARAM_DEFAULT_VALUE: False}, \ >> "tag-with-project-name": { \ >> GenericBackend.PARAM_TYPE: GenericBackend.TYPE_BOOL, \ >> GenericBackend.PARAM_DEFAULT_VALUE: True}, \ >> } >> >> 9, in the constructor, call parent's constructor, initilialize pickle file >> (pickle is used for serialization of data) for sync_engine which keeps >> relation between local and remote tasks. Initialize internal variables: >> >> def __init__(self, parameters): >> ''' >> See GenericBackend for an explanation of this function. >> Re-loads the saved state of the synchronization >> ''' >> super(Backend, self).__init__(parameters) >> #loading the saved state of the synchronization, if any >> self.data_path = os.path.join('backends/launchpad/', \ >> "sync_engine-" + self.get_id()) >> self.sync_engine = self._load_pickled_file(self.data_path, \ >> SyncEngine()) >> >> 10, When an instance of your backend is created and enabled (the user has >> added new backend, set parameters like username and clicked on "Enable >> syncing"), initialize() method is called. You can use it to start your >> authentication. >> >> There is code for storing password in GNOME keyring (if it is not >> accessible, GTG will forget password after restart) or use authentication >> procedure of your webservice. (Look at other backends for inspiration) >> >> >> (hardcore begins) >> 11, do_periodic_import(): once in while is this function called. Firstly, >> you fetch all tasks on the remote side. Then you put that task into >> sync_engine. It automagicaly tells youwhether you should add this task to >> local GTG, remove it or update it. >> >> Later you ask for a difference between list of your local tasks and list of >> your remote tasks, and those tasks should be deleted.. >> >> 12, Test it and polish it :-) >> >> Around this state, you should have about 500 lines of code and a prototype >> of your backend. >> >> If you want, you can join us on Saturday, November 26 at online hackathon >> and your questions will be answered in the real time :-) >> >> Please, write down questions you have. We can from our communication put >> together very first version of how to write your first backend in 13 steps >> :-) >> >> Izidor >> > > > > -- > Saludos, > Germán > > Delivering common sense since 1969 <Epoch Fail!>. > > The Nature is not amiable; It treats impartially to all the things. > The wise person is not amiable; He treats all people impartially. > _______________________________________________ Mailing list: https://launchpad.net/~gtg-user Post to : [email protected] Unsubscribe : https://launchpad.net/~gtg-user More help : https://help.launchpad.net/ListHelp

