Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Ideenklau erwünscht: Konzepte aus der Zope-Welt
Search
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
300
Other Decks in Programming
See All in Programming
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
3k
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
140
アクセシビリティから考える情報設計
high_g_engineer
0
420
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
410
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
290
AHC070解法紹介
eijirou
0
140
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
8.8k
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
260
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
180
Workers Cache を知る
syumai
0
300
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
580
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.4k
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Ethics towards AI in product and experience design
skipperchong
2
390
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Embracing the Ebb and Flow
colly
88
5.2k
The Invisible Side of Design
smashingmag
301
52k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Why Our Code Smells
bkeepers
PRO
340
58k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
850
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
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