Vai al contenuto

python-wave-surfer aka “a simple wave API”

10 dicembre 2009
Outdated! Please refer to the wiki in Bitbucket
pywave-notify in action

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)

From → computer, English

5 commenti
  1. bello sai.. hostalo da qualche parte…

  2. 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

  3. vrde permalink

    @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à.

  4. @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 :)

  5. vrde permalink

    >> 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 :)

Scrivi una risposta a edno Cancella risposta