python-wave-surfer aka “a simple wave API”
Outdated! Please refer to the wiki in Bitbucket
Here is my simple implementation for a google wave API — deeply inspired by hiroshi‘s work and from a folengo‘s idea.
The API module, wave.py
, implements only the login and two functions to retrieve your waves. The API module uses the Python Standard Library so just import it (on GNU/Linux, mac os, win and… Symbian maybe?) and play :)
>>> import wave >>> wave.login('user@gmail.com', 'password') >>> wave.get_unread_waves() [{'url': u'googlewave.com!w+xxxxxxx', 'total': 37, 'unread': 5, 'title': u'OT'}, {'url': u'googlewave.com!w+xxxxxxx', 'total': 26, 'unread': 3, 'title': u'ciao pythonisti!'}, {'url': u'googlewave.com!w+xxxxxxx', 'total': 2, 'unread': 2, 'title': u'Automation in InDesign'}]
You can clone the repo from Bitbucket or download the tarball.
On top of this minimal API I wrote a notifier using pynotify (so it runs on Gnome and KDE without any problem), this is the code:
import sys import time import getpass import pynotify import wave pynotify.init('pywave-notifier') if len(sys.argv) != 2: print 'usage: notifier.py youraccount@gmail.com' sys.exit(0) wave.login(sys.argv[1], getpass.getpass("password: ")) lastmsg = u'' while True: unread = wave.get_unread_waves() msg = u'' for item in unread: msg += '%(title)s (%(unread)s/%(total)s)\n'\ % item # yep, not so perfect (: if msg != lastmsg: n = pynotify.Notification( "%s unread waves" % len(unread), msg) n.show() lastmsg = msg time.sleep(3*60)
bello sai.. hostalo da qualche parte…
uhm, come mai non ha oggetti, la tua libwave? (:
e se uno volesse incrociare i dati da 2 o piu` account?
poi boh, nonso, forse invece di get_unread_waves() che mi sa tanto di giava getter ;), una lazy property .unread?
eppoi, nel tuo esempio di notifier. sommare stringhe non vabbene, meglio joinarle tutte assieme
tipo un msg=”\n”.join(“%(title)s (%(unread)s/%(total)s)” % item for item in unread)
‘plimenti, cmq. idea sympatica
@edno: grazie! per ora basta e avanza bitbucket :P
@C8E: in realtà è già un oggetto se la vedi a livello di “modulo” :P
Comunque ci avevo pensato un po’ ma il codice era nato procedurale e la cosa più semplice era lasciare tutto in un modulo. Mi piace l’idea della lazy property ma, vista la precondizione di fare una cosa a livello di modulo, non l’ho neanche considerata.
Non escludo comunque la possibilità di mettere tutto in una classe, questa in fin dei conti è una bozza “just for fun”, al salire della complessità (per ora sono solo poche funzioni) la classe è probabilmente la scelta migliore.
Una cosa riguardo la somma delle stringhe, onestamente non condivido proprio il “monoriga” con str.join(), quel loop non è “performance sensitive code” e ho preferito dare più peso alla leggibilità.
@vrde:
> in realtà è già un oggetto se la vedi a livello di “modulo” :P
si`, ma un oggetto singletonico, ripeto: come fai a gestire piu` account?
> onestamente non condivido proprio il “monoriga” con str.join()
il punto non era il monoriga (che ho usato per far prima e perche` il margine di questo sito e` troppo piccolo per bla bla), ma il str.join di una sequenza al posto di str += str. e non e` solo questione di performance, ma anche di “pythonicita`” (che tu sbandieri come goal del tuo modulo :)
>> in realtà è già un oggetto se la vedi a livello di “modulo” :P
> si`, ma un oggetto singletonico, ripeto: come fai a gestire piu` account?
in nessun modo! :D mi sembra overkilling la possibilità di incrociare i dati, come ti ho detto concordo l’idea di farci una classe ma non con l’obiettivo di gestire più account.
> onestamente non condivido proprio il “monoriga” con str.join()
>> […]ho usato per far prima e perche` il margine di questo sito
>> e` troppo piccolo[…]
sì, un CSS custom mi costa 14.97$ all’anno, hai considerato una donazione?
>> […]ma il str.join di una sequenza al posto di str += str. e non e` solo
>> questione di performance, ma anche di “pythonicita`” (che tu
>> sbandieri come goal del tuo modulo :)
ah ok, comunque c’era una cosa che non conoscevo ovvero le http://docs.python.org/reference/expressions.html#generator-expressions…
io avrei fatto ‘\n’.join([list comprehension]), non avevo notato la tua “generator expression”
dai un occhio al (nuovo) codice e se hai lament^H^H^H^H^H^H consigli dimmi :)