Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ideenklau erwünscht: Konzepte aus der Zope-Welt
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
wosc
October 05, 2011
Programming
320
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ideenklau erwünscht: Konzepte aus der Zope-Welt
wosc
October 05, 2011
More Decks by wosc
See All by wosc
Keep a changelog
wosc
0
350
werkzeugkiste.pdf
wosc
0
190
Automatisierte Browser-Tests mit gocept.selenium
wosc
2
290
Other Decks in Programming
See All in Programming
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
530
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
160
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
220
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
6
4.1k
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
190
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
110
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
210
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.9k
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
120
AutonomyとControlのあいだ:Graflowで記述するAIエージェント協調
myui
0
120
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
540
Featured
See All Featured
Done Done
chrislema
186
16k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
140
Agile that works and the tools we love
rasmusluckow
331
21k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
The Limits of Empathy - UXLibs8
cassininazir
1
350
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
610
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
Transcript
Ideenklau erwünscht: Konzepte aus der Zope-Welt Wolfgang Schnerring gmbh &
co. kg PyCon DE 2011, Leipzig Wolfgang Schnerring Zope-Ideen 06.10.2011 1 / 39
Einführung 1996 Z Object Publishing Environment: Application-Server als CGI-Alternative 2001
Plone CMS 2004 Rewrite: Zope 3 2009 Zope Toolkit Wolfgang Schnerring Zope-Ideen 06.10.2011 2 / 39
Agenda 1 Traversal 2 Erweiterbarkeit 3 Zope Component Architecture 4
Model-based Security 5 Transaktionen 6 Test-Setup 7 Testbrowser http://www.sxc.hu/photo/1149105 by nkzs Wolfgang Schnerring Zope-Ideen 06.10.2011 3 / 39
None
Traversal Routing /users/edit/14 /users/edit/
[email protected]
/users/
[email protected]
/edit Wolfgang Schnerring Zope-Ideen 06.10.2011 5
/ 39
Traversal Routing /users/edit/14 /users/edit/
[email protected]
/users/
[email protected]
/edit /users/{email}/edit → edit_user(email) Wolfgang Schnerring
Zope-Ideen 06.10.2011 5 / 39
Traversal Traversal / users /
[email protected]
/ edit Wolfgang Schnerring
Zope-Ideen 06.10.2011 6 / 39
Traversal Traversal / users /
[email protected]
/ edit Wolfgang Schnerring
Zope-Ideen 06.10.2011 6 / 39
None
Erweiterbarkeit Zusätzliche Views Wolfgang Schnerring Zope-Ideen 06.10.2011 8 / 39
Erweiterbarkeit Zusätzliche Daten # package1 class User(persistent.Persistent): pass user.firstname =
’Alice’ user.lastname = ’Random’ user.email = ’
[email protected]
’ # package2 annotations = zope.annotation.interfaces.IAnnotations(user) annotations[’credit_card_ref’] = ’1234XAB’ Wolfgang Schnerring Zope-Ideen 06.10.2011 9 / 39
None
Zope Component Architecture Adapter-Pattern Wolfgang Schnerring Zope-Ideen 06.10.2011 11 /
39
Zope Component Architecture Zusätzliche Operationen # package1 class User: #
[...] # package2 class CreditCardHolder: adapts(User) implements(CreditCard) # client code CreditCard(user).add(’1234XAB’) Wolfgang Schnerring Zope-Ideen 06.10.2011 12 / 39
Zope Component Architecture Single Dispatch class Shape: def draw(self): raise
NotImplementedError() class Circle(Shape): def draw(self): # [...] class Square(Shape): def draw(self): # [...] Wolfgang Schnerring Zope-Ideen 06.10.2011 13 / 39
Zope Component Architecture Multiple Dispatch class SVGCircle: adapts(Circle, SVGCanvas) implements(Drawable)
class JPGCircle: adapts(Circle, JPGCanvas) implements(Drawable) # client code Drawable(shape, canvas).draw() Wolfgang Schnerring Zope-Ideen 06.10.2011 14 / 39
Zope Component Architecture Beispiel: Views # client code EditForm(user, request).render()
class HTMLEditForm: adapts(User, HTTPRequest) implements(EditForm) class JSONEditForm: adapts(User, JSONRequest) implements(EditForm) Wolfgang Schnerring Zope-Ideen 06.10.2011 15 / 39
Zope Component Architecture Zusätzliche Views Wolfgang Schnerring Zope-Ideen 06.10.2011 16
/ 39
Zope Component Architecture Beispiel: Traversal # /users/
[email protected]
/edit class UserFolderTraverser: adapts(UserFolder)
implements(zope.traversing.interfaces.ITraversable) def __init__(self, context, request): self.context = context self.request = request def traverse(self, name, remaining): return self.context.find_user_by_email(name) Wolfgang Schnerring Zope-Ideen 06.10.2011 17 / 39
Zope Component Architecture Beispiel: Events zope.event.notify(ObjectCreatedEvent(user)) # client code @subscribe(User,
ObjectCreatedEvent) def send_welcome_email(user, event): # [...] Wolfgang Schnerring Zope-Ideen 06.10.2011 18 / 39
None
Model-based Security view-based Wolfgang Schnerring Zope-Ideen 06.10.2011 20 / 39
Model-based Security view-based Wolfgang Schnerring Zope-Ideen 06.10.2011 20 / 39
Model-based Security model-based Wolfgang Schnerring Zope-Ideen 06.10.2011 21 / 39
Model-based Security API zope.security.checker.defineChecker(class_, checker) proxied = zope.security.checker.ProxyFactory(object) class Checker(object):
def check_getattr(self, object, name): def check_setattr(self, object, name): # permission = [...] getInteraction().checkPermission(permission, object) Wolfgang Schnerring Zope-Ideen 06.10.2011 22 / 39
Model-based Security API class Interaction(object): def add(self, participation): def remove(self,
participation): def checkPermission(self, permission, object): # [...] Wolfgang Schnerring Zope-Ideen 06.10.2011 23 / 39
None
Transaktionen 2-Phase-Commit Wolfgang Schnerring Zope-Ideen 06.10.2011 25 / 39
Transaktionen 2-Phase-Commit Wolfgang Schnerring Zope-Ideen 06.10.2011 25 / 39
Transaktionen 2-Phase-Commit Wolfgang Schnerring Zope-Ideen 06.10.2011 25 / 39
Transaktionen 2-Phase-Commit Wolfgang Schnerring Zope-Ideen 06.10.2011 25 / 39
Transaktionen 2-Phase-Commit Fehlerfall Wolfgang Schnerring Zope-Ideen 06.10.2011 25 / 39
Transaktionen 2-Phase-Commit Wolfgang Schnerring Zope-Ideen 06.10.2011 25 / 39
Transaktionen 2-Phase-Commit Wolfgang Schnerring Zope-Ideen 06.10.2011 25 / 39
Transaktionen API transaction commit / abort savepoint get doom join
DataManager tpc_begin – commit – tpc_vote – (tpc_finish | tpc_abort) Wolfgang Schnerring Zope-Ideen 06.10.2011 26 / 39
Transaktionen Beispiel Wolfgang Schnerring Zope-Ideen 06.10.2011 27 / 39
None
Test-Setup unittest.TestCase class ExampleTest(unittest.TestCase): def setUp(self): def tearDown(self): def test_something(self):
Wolfgang Schnerring Zope-Ideen 06.10.2011 29 / 39
Test-Setup gemeinsames setUp Wolfgang Schnerring Zope-Ideen 06.10.2011 30 / 39
Test-Setup Stacking Wolfgang Schnerring Zope-Ideen 06.10.2011 31 / 39
Test-Setup Layer class Layer(object): __bases__ = (OTHER_LAYER,) def setUp(self): def
tearDown(self): def testSetUp(self): def testTearDown(self): Wolfgang Schnerring Zope-Ideen 06.10.2011 32 / 39
Test-Setup Beispiel class PersistenceTest(unittest.TestCase): layer = DB_LAYER def test_serializing_document_parameters(self): #
[...] class IntegrationTest(unittest.TestCase): layer = COMBINED_LAYER def test_search_displays_suggestions_from_database(self): # [...] Wolfgang Schnerring Zope-Ideen 06.10.2011 33 / 39
Test-Setup Beispiel class DatabaseLayer(plone.testing.Layer): def setUp(self): self.connection = dbdriver.connect(os.environ[’DSN’]) def
tearDown(self): self.connection.close() DB_LAYER = DatabaseLayer() HTTP_LAYER = HTTPServerLayer() COMBINED_LAYER = plone.testing.Layer( bases=(DatabaseLayer, HTTPServerLayer)) Wolfgang Schnerring Zope-Ideen 06.10.2011 34 / 39
None
Testbrowser Beispiel Wolfgang Schnerring Zope-Ideen 06.10.2011 36 / 39
Testbrowser Beispiel class SearchTest(unittest.TestCase): def test_advanced_search_filters_by_content_type(self): b = zope.testbrowser.wsgi.Browser( wsgi_app=my_wsgi_callable)
b.open(’http://localhost’) b.getLink(’Advanced Search’).click() b.getControl(name=’q’).value = ’zope’ b.getControl(’Content type’).displayValue = [’HTML’] b.getControl(’Search’).click() self.assertEqual(’10’, b.getControl(’Results per page’)) self.assertIn(’fisch’, b.contents) # not released yet, unfortunately self.assertEllipsis(’...fisch...framework...’) Wolfgang Schnerring Zope-Ideen 06.10.2011 37 / 39
Ressourcen http://pypi.python.org/pypi/<package> http://www.sxc.hu/photo/1087620 by nkzs 1 zope.traversing 2 zope.configuration grokcore.component
zope.annotation 3 zope.component, zope.interface, zope.event 4 zope.security 5 zope.testrunner, plone.testing 6 transaction, repoze.tm2 zope.sqlalchemy, zope.sendmail, gocept.amqprun 7 zope.testbrowser Wolfgang Schnerring Zope-Ideen 06.10.2011 38 / 39
Wir suchen Mitarbeiter in Halle! Softwareentwicklung Web Python TDD Systemadministration
Gentoo/KVM Puppet Nagios Bei Interesse: mich ansprechen oder
[email protected]
Wolfgang Schnerring Zope-Ideen 06.10.2011 39 / 39