Osiem lat temu coś mi odbiło i zacząłem tworzyć PyXMPP. Wtedy jeszcze właściwie nie było XMPP (specyfikacja dopiero powstawała, RFC 3920 wydano dopiero ponad rok później), tym bardziej żadnej biblioteki XMPP dla Pythona, czy nawet jakiejkolwiek implementacji XMPP. Było jakieś jabber.py, ale mnie nie zadowalało. Zacząłem więc pisać własną bibliotekę, najpierw z myślą o serwerze, potem dla mojego klienta – CJC.
Wtedy musiałem pisać wszystko od zera, SASL, Stringprep, jakieś sensowne StartTLS, bo dostępnych implementacji nie było, albo nie nadawały się do sensownego, czy bezpośredniego użycia. Język w którym pisałem (Python 2.2) nie przypominał bardzo dzisiejszego Pythona. Testować też nie było z czym, bo właściwie żaden serwer SASL czy StartTLS nie obsługiwał (dlatego myśląc o implementacji serwera musiałem też pisać kod klienta). Myślę, że były nawet czasy, gdy moje PyXMPP było „tą jedyną sensowną” biblioteką XMPP dla Pythona.
Niestety, niektóre moje decyzje zaczęły na projekcie ciążyć. W szczególności wykorzystanie libxml2. API zupełnie „niepythonowe”, gdzie trzeba pamiętać o zwalnianiu pamięci o tym który obiekt używa pamięci przydzielonej innemu obiektowi. To sprawiało nie tylko, że kod był brzydki, ale się po prostu czasem sypał w niewyjaśnionych okolicznościach, ciekł pamięcią i średnio nadawał się do integracji z czymkolwiek innym. Dodatkowo API libxml2 używało stringów zakodowanych UTF-8, gdzie w Pythonie używałoby się raczej obiektów unicode
, co wymagało ciągłych konwersji. Mimo wszystko libxml2 miało swoje zalety, szczególnie nad alternatywami dostępnymi w tamtym czasie: było szybkie, obsługiwało przestrzenie nazw XML i serializowało XML do postaci strawnej przez implementacje XMPP (ElementTree sam z siebie wciąż tego nie umie).
Mijały miesiące i lata. PyXMPP rozwijało się, najpierw szybko, potem powoli, z ewentualnymi gwałtownymi zrywami. Stary kod coraz mniej mi się podobał, ale był i działał, szkoda było dużo zmieniać. Czasem próbowałem wprowadzić jakieś nowe pomysły (np. interfejsy z Zope), z średnim skutkiem. W końcu rozwój praktycznie zamarł, z wyjątkiem drobiazgów których czasem zachciałem w CJC (np. ostatnio IPv6)…
W między czasie pojawiło się wiele implementacji XMPP, także w Pythonie. Nie tylko biblioteki ale i całe popularne klient (chociażby Gajim). Pojawił się Python 3, wyszły nowe RFC dla XMPP. PyXMPP praktycznie w ogóle się teraz nie liczy… a mnie dwa miesiące temu znowu „odbiło”…
Postanowiłem spróbować przerobić stary kod na coś nowocześniejszego. Przede wszystkim miało wylecieć `libxml2` i być zastąpione przez ElementTree. Przy okazji chciałem wyczyścić API i w ogóle poprawić jakość kodu. W starym nie tylko były jeszcze miejscami konstrukcje z Pythona 2.2 (np. ‚0’ i ‚1’ zamiast ‚True’ i ‚False’), to jeszcze kiedyś miałem zwyczaj oszczędzania na spacjach, przez co kod był po prostu nieczytelny. Postanowiłem przepisać kod pod kątem Pythona 2.7 ale z myślą o obsłudze też 3.2.
Tak sobie grzebałem w tym przez ostatnie parę tygodni. W modułach które przerobiłem zmieniłem praktycznie każdą linijkę kodu. Miejscami wprowadziłem fundamentalne zmiany w całej wewnętrznej strukturze pakietu. Napisałem nowy framework pętli głównej i I/O. Wiem, wymyślanie na nowo koła, jest Twisted, ale przecież implementacje XMPP na Twisted też już są…
Powoli kod zaczął nawet być używalny… postarałem się go jakoś udokumentować, napisałem trzy przykładowe skrypty, jakiś tutorial na wiki… i wczoraj postanowiłem pokazać to światu.
Nie wiem na co liczyłem, w końcu teraz to tylko „kolejna implementacja XMPP dla pythona”… ale może komuś się przyda… może w czymś jest jednak lepsza od istniejących. No i szkoda by było, jakby mój kod pisany od 2003 roku umarł jako to brzydkie stare PyXMPP (tak, to nie jest racjonalne myślenie)…
Od wczorajszego wydania ‚alpha’ znalazł się tylko jeden ‚obserwujący’ na GitHub, jedna odpowiedź na maila na liście dyskusyjnej i 30 pobrań pakietu… No cóż, kariery tym nie robię. ;-)
- Nazwa projektu: PyXMPP 2
- Projekt na GitHub: https://github.com/Jajcus/pyxmpp2
- Projekt w PyPI: http://pypi.python.org/pypi/pyxmpp2
- Dokumentacja API: http://jajcus.github.com/pyxmpp2/api/
- Wiki: https://github.com/Jajcus/pyxmpp2/wiki