python.blogowo.net

#!/usr/bin/env python

Jeśli życzysz sobie dodać tutaj swój blog, lub go usunć z tej planety - napisz maila na adres python(malpka)blogowo.net, zamieniając (malpka) na znak @.

May 04, 2008

Jarosław Zgoda

PIDA mnie rozczarowuje

Większość mojego kodu w Pythonie (a właściwie kodu w ogóle, włączając w to HTML i skrypty SQL) piszę w PIDA. Jak dla mnie to środowisko pozostawia mi ultrawygodnego Vima, dodając to, czego potrzebuję podczas pracy: zarządzanie grupą plików jako projektem, kilka podstawowych poleceń systemu kontroli wersji, przeglądarkę klas i integrację ...

May 04, 2008 03:47 PM

April 30, 2008

Jarosław Zabiełło

Shoulda - pozbycie się magii RSpec'a

Od jakiegoś czasu w kręgach Ruby on Rails można zauważyć przesunięcie paradygmatu w zakresie metodologii testowania kodu. Popularyzowane podejście TDD (Test Driven Development) zostaje wypierane przez BDD (Behaviour Driven Development). Jedną z bardziej promowanych bibliotek jest RSpec. Mimo że kusi składnią przypominającą naturalny język angielski, próba wykorzystania RSPec w rzeczywistym projekcie szybko może stać się co najmniej kłopotliwe.

RSpec aby wyglądał tak ładnie jak wygląda, wykorzystuje dynamikę i specyficzne właściwości Rubiego. Ruby pozwala opuszczać nawiasy w metodach, niezauważenie otwierać i modyfikować klasy swoich bibliotek (w tym wbudowanych i standardowych) oraz ogólnie dosyć dobrze nadaje się do tworzenia nowych języków do specyficznych zadań (DSL, Domain Specific Language). Innymi słowy, ceną za korzystanie ze składni RSpec jest konieczność opanowania tego nowego języka. I tu zaczynają się schody…

Dokumentacja do RSpec jest najdelikatniej mówiąc, niekompletna. Przykładów użycia RSpec trzeba szukać po całym internecie. Dokumentacja wygenerowana z kodu źródłowego API do RSpec jest również słabej jakości. Brakuje przykładów, brakuje nawet wzmianki co do niektórych metod, jakie są używane. Np. weźmy taki prosty przykład:

response.should have_text(/My String/)

Próba znalezienia czegoś sensownego na stronie z API RSpec’a jest beznadziejna. Nie ma nic napisane o metodzie “response”, nie ma nic o metodzie “have_text” ani w ogóle o tym, co można przekazać do metody should(). Po prostu pojawia się coś niczym królik z kapelusza magika. I tak jest z wieloma elementami składni RSpec’a. Są jakieś pojedyńcze elementy, ale nie wiadomo które, i jak je łączyć ze sobą. Jeśli Ruby ma zbytnie skłonności do “magii”, to RSpec magia do kwadratu. Coś się pojawia i znika nie wiadomo skąd, ani dlaczego. To jest po prostu chore. Po wielu dniach takiej walki z RSpec doszedłem do wniosku, że to droga donikąd. Tylko, że z drugiej strony, cofnięcie się z BDD do TDD też nie brzmi atrakcyjnie.

Czy jest zatem jakieś wyjście pośrednie? Tzn. rozwiązanie które nie rezygnując z elegancji BDD byłoby oparty na znanych, dobrze opisanych metodach, bez żadnej kolejnej, magicznej składni? Wydaje się, że powyższe założenia spełnia projekt Shoulda. Mój pierwsze wrażenia z kontaktu z tą biblioteką, jak na razie, są dosyć dobre. Shoulda wprowadza dużo mniej nowej składni niż RSpec. Większość testów wykorzystuje stare, sprawdzone “asserty”. I o to chodzi. Nowa metodologia i znana, sprawdzona biblioteka standardowa Rubiego Test::Unit.

class UserTest << Test::Unit 
  context "A User instance" do
    setup do
      @user = User.find(:first)
    end

    should "return its full name" 
      assert_equal 'John Doe', @user.full_name
    end

    context "with a profile" do
      setup do
        @user.profile = Profile.find(:first)
      end

      should "return true when sent #has_profile?" 
        assert @user.has_profile?
      end
    end
  end
end

Jeszcze jedna uwaga odnośnie implementacji BDD w innych językach. Trochę miałem problemów ze znalezieniem biblioteki do Pythona. Znaleziona obszerna lista bibliotek do Pythona nie ma kategorii BDD. Wygląda na to, że BDD i w ogóle kwestią testowania bardziej przejmują się użytkownicy Rubiego. Ale na szczęście na stronie na stronie http://behaviour-driven.org/Implementations zamieszczono informacje których mi brakowało. Jeden z linków prowadzi do Pinocchio, który jest rozszerzeniem bibliotek Nose używanej m.in. przez framework Pylons. Co ciekawe, jest też nawet JSSpec, biblioteka BDD dla języka Javascript.

Zobacz też:

Beyond Test Driven Development: Behaviour Driven Development

Wykładowcą jest Dave Astels, współautor książki A Practical Guide to eXtreme Programming (Google TechTalks)

by Jarosław Zabiełło at April 30, 2008 10:19 PM

April 29, 2008

Jarosław Zgoda

Tak łatwo to jeszcze nie było

Znalazłem kilka dni temu samouczek pisania własnych ramówek webowych w Pythonie w oparciu o WSGI i bibliotekę WebOb. Tak łatwo to chyba jeszcze nie było... Na szczęście minęły czasy pączkujących ramówek (w tempie dwóch tygodniowo, strach było otworzyć lodówkę), ale może takie samouczki pokażą pretendentom, co ich czeka od strony ...

April 29, 2008 09:47 PM

Riklaunim

Trochę ożywienia tu trzeba

Od pewnego czasu trochę cicho w Bibliotekach, ale obecnie pracuję w wolnym czasie nad aktualizacją i rozbudową Diamandy :) czyli tego na czym stoją Biblioteki. Jak wszystko zrobię z zaplanowanych ficzerów :) to korzystanie ze strony powinno być prostsze, a i współpraca społeczności też całkiem możliwa... a tematów na artykuły mam sporo :)

April 29, 2008 04:20 AM

April 28, 2008

Pykonik

Materiały z trzeciego spotkania

Poniżej prezentacja Michała Bugno i Krzysztofa Goja z trzeciego spotkania Pykonika, czyli "Systemy kontroli wersji Bazaar i Mercurial".

Oprócz slajdów mamy także obiecany podcast: [Pykonik][03]DVCS.ogg

Happy listening.

Całe spotkanie było nagrywane kamerą w związku z tym, jak tylko uda ma się obrobić obraz, wystawimy też videocast. Możliwe, że uda się również zrobić slidecast z użyciem powyższego audio, choć to w dużej mierze zależy od obłożenia czasowego ekipy.



by vArDo (noreply@blogger.com) at April 28, 2008 05:56 PM

Web-Dev

Python Magazine 2008-04

Ukazał się właśnie (trzymam świeży, jeszcze ciepły wydruk:) nowy numer Python Magazine.

Co w nim znajdziemy?

czytaj dalej

by bluszcz at April 28, 2008 02:47 PM

Perełki Django

Queryset-Refactor Merged!

Od dawna rozwijany w osobnym branchu ulepszony ORM został połączony z drzewem głównym. W końcu możemy uaktualniać wiele rekordów w tabeli na raz, czy też korzystać z dziedziczenia modeli.

Jedyne niekompatybilność na które natrafiłem, to OneToOneField nie jest teraz domyślnie kluczem podstawowym, oraz zmieniło się użycie order_by jeżeli sortujemy po dowiązanej tabeli (jest dużo bardziej intuicyjne).

Więcej informacji na: http://blog.michaeltrier.com/2008/4/27/django-queryset-refactor-merged, opis nowych rzeczy: http://code.djangoproject.com/wiki/QuerysetRefactorBranch

PS. Jeszcze został do połączenia branch newforms-admin i być może kolejnym krokiem będzie wersja stabilna.

April 28, 2008 01:32 PM

Jarosław Zgoda

Gówniażeria

Co jakiś czas na pl.comp.lang.python pojawiają się ogłoszenia o pracy dla programistów w Pythonie. Abstrahując od dyskusyjnej właściwości tej grupy dla wysyłania ogłoszeń o pracy (niby jest pl.praca.oferowana, ale ogłoszeń o pracy dla Pythoniarzy nie jest aż tak wiele, więc ma to pewien walor...), to reakcje na takie ogłoszenia doprowadzają ...

April 28, 2008 10:47 AM

April 27, 2008

Jarosław Zgoda

QS-RF w trunku Django

Queryset-refactor zlądował w trunku Django. Wspominam z kronikarskiego obowiązku, bo nie zauważyłem żadnych problemów z moimi aplikacjami w związku z tym.

April 27, 2008 09:47 PM

April 26, 2008

Jarosław Zgoda

Kalkulator w dłoń i liczymy

Osłabiający się wciąż dolar sprawił, że postanowiłem sprawdzić, czy MegiTeam nadal jest konkurencją dla WebFaction, przynajmniej jeżeli chodzi o cenę. Kalkulator w dłoń i liczymy. Ponieważ MegiTeam nie ma opcji płatności miesięcznej, policzymy dla okresów 3, 6 i 12 miesięcy, stosując wszystkie podstawowe zniżki i porównując plany taryfowe, które sobie ...

April 26, 2008 08:47 PM

April 25, 2008

Galdomedia

Wypełnianie formularzy PDF - forge_fdf w pythonie

Przytrafiło się ostatnio wypełnić przygotowany przez klienta formularz PDF. Ot, umieścić na gotowej formie klucz identyfikacyjny, dać odwiedzającemu PDFa, który to może go wypełnić i odesłać. Formularz jest identyfikowany bardzo łatwo dzięki rzeczonemu kluczowi. Pojawił się jednak jeden zasadniczy problem - jak? Nie chcieliśmy kupować rozwiązań komercyjnych, a poszukiwania w internecie na niewiele się zdały. [...]

by Maciej Litwiniuk at April 25, 2008 10:50 AM