Zope 3 Cookbook

Publié par

Zope 3 Cookbook

Publié le : jeudi 21 juillet 2011
Lecture(s) : 56
Nombre de pages : 62
Voir plus Voir moins
Tarek
Zop
e
Ziad´e
-
3
Co
okb
o
ok
ziade.tarek@gmail.com
2
Tabledesmatie`res
Introduction iii 1 Comprendre les interfaces 1 2 Ecrire des tests unitaires pour Python 7 ´ 3 Ecrire des tests fonctionnels 13 4 Comprendre les adapters 19 5Comprendreles´e`ts23 venemen ´ 6 Ecrire du reSTructuredText pour la documentation et les doc-tests 27 7 Trouver le bon rythme entre codage, documentation, tests fonc-tionnels et unitaires 31 8 Enregistrer une session utilisateur pour les tests 35 9 Organiser le code dans un paquet 39 10Cr´e´erunuxRSSpourtouslesconteneurs45 11R´ecup´ererlURLdunobjet51 12 Mettre en place une file asynchrone d’envoi de mails 53
i
ii
TABLE
DES
MATI
` ERES
Introduction
Ce livre contient des recettes pour Zope 3.2.1, issues du projet zope-cookbook.org. Zope3continueson´evolutionmaislamajorite´decesrecettesrestentdactua-lite. ´ Celivreae´te´´ecritparTarekZiade´etestdistribue´enlicenceC-CAttribution-NonCommercial-NoDerivs 2.5 http ://creativecommons.org/licenses/by-nc-nd/2.5/
iii
iv
INTRODUCTION
Chapitre 1
Comprendre les interfaces
Lesinterfacessonta`labasedelaprogrammationoriente´com-posants,eta`fortioria`labasedetouteslesbriquesdeZope3.Cette recetteenpre´senteleprincipe.
Comprendreleme´canisme Historiquement,lesinterfacessontn´eesdelastandardisationdeschiers den-tˆetedulangageC.Lase´parationdeladescriptionetdelimpl´ementation permetdepre´senterlesde´nitionsducode,etdemasquerlesd´etailsdimpl´ementation auxutilisateurs.Le´volutionducodesous-jacentpeutsefairedanscecasind´ependamment durestedusyste`me. Cettetechniqueaensuite´et´eint´egr´eeetstandardise´eavecquelquesnuances danslaplupartdeslangagesorient´esobjetsmodernes,commeJavaviases protocolsC++.hedecorpele`domnurusi,pheluD,o Python ne propose pasencoreesnombreusrglaede´cafrm,sedmeteinsyde`est discussionsdanslacommunaute´surlesujetcescinqderni`eresanne´es.Pour paliera`cemanque,Zopeaimpl´emente´sonpropresyst`emedinterfaces,quia ´et´eensuiteadopt´epardautresframeworkscommeTwisted. DansZope,uneinterfacede´nieuncontrat,compose´dattributsetdem´ethodes. Une classe peuteem´tlnprmeicette interface, en fournissant le code pour l’en-semble de cette signature. On dit que la classerespectemeˆemenU.ecafretnil classepeutbiensˆurimpl´ementerplusieursinterfaces. Lint´erˆetdecettem´ecaniqueprendtoutsonsensdansZope,lorsquelesoutils d’interactions manipulent ces abstractions au lieu de manipuler les objets qui les impl´ementent.LesdirectivesZCMLparexemple,peuventassocierdesactions `adesinterfaces.Lesobjetspublie´sd´eclenchantcesactionssilsimple´mentent les dites interfaces.
De´nirdesinterfaces Zope fourni dans le paquetzope.interfacereralce´ourdilspoutbledsnmeuen et manipuler des interfaces. Elementsdede´nitiondinterfaces: Interface: interface de base ; 1
2
CHAPITRE 1. COMPRENDRE LES INTERFACES Attribute ;: attribut de base invariantejstmilpe´aexuboeappliq:ucontraintcafrenetuteinme´eannt donnee. ´ Interface Interfacepnuessuecealtsnuesalcala`elbarapmcoe,eri`ulicrtpaesedabes objecttueruotPython.Elledoitˆedclmeseasbadeposeertelitue´simoce de´nitiondinterface.Uneinterfaceestdoncuneclasse,maissansaucuncode: seuleslessignaturesdem´ethodesysontde´nies. L’interface IDechire : >>> from zope.interface import Interface >>> class IDechire(Interface): ... def tout(langage): ..."""spe´cifiesilangagefournienentre´ede´chire""" ... Notes: Danslesde´nitionsdinterface,lattributselfdisparaˆıt Lecorpsdesme´thodesnestcompose´quedudocstring Unefoisde´nie,cetteinterfacepeutˆetreimple´mente´eparuneclasse,qui s’associe avec la directiveimplements. La classe Dechire : >>> from zope.interface import implements >>> class Dechire(object): ... implements(IDechire) ... def tout(self, langage): ... if langage == ’python’: ... return True ... return False ... >>> dechire = Dechire() >>> dechire.tout(’python’) True >>> dechire.tout(’java’) False >>> dechire.tout(’ruby’) False Attribute Outrelesm´ethodes,desattributspeuventeˆtreassoci´es`auneinterface,pour ´etendrelasignature.Attributeest une classe qui s’instancie avec une simple chaˆıne de caracteres. ` L’interface IDocument :
3
>>> from zope.interface import Attribute >>> class IDocument(Interface): ... titre = Attribute(’Titre du document’) ... description = Attribute(’Description du document’) ... def recuperer(): ... "renvoi titre et description""" "" ... Lesclassesquiimple´mententlinterfacedoivent,commepourlesme´thodes, fournir les attributs. La classe Document : >>> class Document(object): ... implements(IDocument) __init__(s f, titre, description): ... def el ... self.titre = titre ... self.description = description ... def recuperer(self): ... return self.titre, self.description ... >>> mon = Document("Recette d’omelette", "Avec les secrets de Mireille") >>> mon.titre "Recette d’omelette" invariant La fonctioninvariantmrepdteennietfrciaa.ten`euaunecontrassocier Touteslesinstancesdobjetdontlaclasseimple´menteuneinterfacesontalors pass´ees`aunobjetcallablertnoctuepiuq,sttejeoblsierolquali´e. ˆ Silobjetnestpasquali´e,uneerreurde´rive´edezope.interface.Invaliddoit ˆetrelev´ee. Prenonslexempleduneinterfacede´nissantdesLivres,etnesappliquant quesurleslivresdontlenombredepagesnede´passentpas250. Contraintes sur ILivre : >>> from zope.interface import Invalid >>> class BibleError(Invalid): ... def __repr__(self): ... return "BibleError(%r)" % self.args ... >>> def taille_max(ob): ... if ob.pages > 250: ... raise BibleError(ob) ... >>> from zope.interface import invariant >>> class ILivre(Interface): ... pages = Attribute(’nombre de pages’) ( ai _max) ... invariant t lle ... def contenu(page): ..."""renvoilecontenudelapagedonn´ee"""
CHAPITRE 1. COMPRENDRE LES INTERFACES
4 ... >>> class Livre(object): ... implements(ILivre) ... def __init__(self, pages): ... self.pages = pages ... def contenu(self, page): ... return "takalacheter" ... taille maxteedytepuqleojbontrˆolecLivreegap.sdsul052ese`esppaepn Danslecascontraˆıre,lafonctiond´eclencheuneerreurBibleError. LesinstancesdeLivrepeuventˆetreensuitevalid´eesparlebiaisdelam´ethode validateInvariantsd’Interface. Tests sur l’invariant : >>> programmation_python = Livre(570) >>> programmation_python.pages 570 >>> programmation_python.contenu(45) ’takalacheter’ >>> ILivre.validateInvariants(programmation_python) Traceback (most recent call last): ... BibleError: <....Livre object at ...> >>> paris_matsh = Livre(46) >>> ILivre.validateInvariants(paris_matsh)
Manipuler les interfaces Outre la fonctionimplementseiurenlcdtasscoquipermentei-erseasun`a face,zope.interfaceinruofe`ccanutaiilimssmaun`are.gppni Manipulations sur IDocument : >>> list(IDocument) [’titre’, ’recuperer’, ’description’] >>> IDocument[’recuperer’] <zope.interface.interface.Method object at ...> >>> titre = IDocument[’titre’] >>> titre <zope.interface.interface.Attribute object at ...> >>> titre. name __ __ ’titre’ >>> titre. doc __ __ ’Titre du document’ Unensembledefonctionsutilitaires,etdeme´thodesassocie´esa`Interface, permete´galementdemanipulerlesinterfaces. Lesplusutiles´etant: Interface.providedBy(object): renvoie vrai siobjecti-rnelmeete´tlnpim face.
Soyez le premier à déposer un commentaire !

17/1000 caractères maximum.