zope.generations

Sagteware kiekie:
zope.generations
Sagteware besonderhede:
Weergawe: 4.0.0 Alpha 1
Upload datum: 15 Apr 15
Lisensie: Gratis
Populariteit: 2

Rating: nan/5 (Total Votes: 0)

zope.generations bied 'n manier van die opdatering van voorwerpe in die databasis toe die program skedule veranderings. & Nbsp; 'n program skedule is in wese die struktuur van data, die struktuur van die klasse in die geval van ZODB of die tafel beskrywings in die geval van 'n relasionele databasis.
gedetailleerde dokumentasie
Generations is 'n manier van die opdatering van voorwerpe in die databasis toe die program skedule veranderings. 'N program skedule is in wese die struktuur van data, die struktuur van die klasse in die geval van ZODB of die tafel beskrywings in die geval van 'n relasionele databasis.
Wanneer jy jou aansoek se data strukture verander, byvoorbeeld, jy die semantiese betekenis van 'n bestaande veld in 'n klas verander, sal jy 'n probleem met databasisse wat voor jou verandering geskep is. Vir 'n meer deeglike bespreking en moontlike oplossings, sien http://wiki.zope.org/zope3/DatabaseGenerations
Ons sal gebruik word om die komponent argitektuur, en ons sal 'n databasis en 'n verband nodig het:
& Nbsp; >>> invoer cgi
& Nbsp; >>> van pprint invoer pprint
& Nbsp; >>> van zope.interface invoer implemente
& Nbsp; >>> van ZODB.tests.util invoer DB
& Nbsp; >>> db = DB ()
& Nbsp; >>> conn = db.open ()
& Nbsp; >>> wortel = conn.root ()
Stel jou voor dat ons aansoek is 'n binneste vertrek, jy kan dit leer om te reageer op frases. Kom ons hou dit eenvoudig en die data in 'n dict stoor:
& Nbsp; >>> wortel ['antwoorde'] = {'hallo': "? Hi & hoe doen jy ',
& Nbsp; ... "? Betekenis van die lewe": "42"
& Nbsp; ... "vier & Nbsp; >>> invoer transaksie
& Nbsp; >>> transaction.commit ()
Aanvanklike opstelling
Hier is 'n paar generasies-spesifieke kode. Ons sal skep en registreer SchemaManager. SchemaManagers is verantwoordelik vir die werklike updates van die databasis. Hierdie een sal net 'n dummy wees. Die punt hier is om die geslagte module bewus daarvan dat ons aansoek ondersteun geslagte.
Die standaard implementering van SchemaManager is nie geskik vir hierdie toets omdat dit gebruik Python modules geslagte te bestuur. Vir nou, sal dit net 'n boete, want ons wil dit nie net nog iets te doen.
& Nbsp; >>> van zope.generations.interfaces invoer ISchemaManager
& Nbsp; >>> van zope.generations.generations invoer SchemaManager
& Nbsp; >>> invoer zope.component
& Nbsp; >>> dummy_manager = SchemaManager (minimum_generation = 0, geslag = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... dummy_manager, ISchemaManager, naam = 'some.app')
'Some.app' is 'n unieke identifiseerder. Jy moet gebruik om 'n URI of die stippellyn naam van jou pakket.
Wanneer jy begin Zope en 'n databasis oopgemaak word, word 'n gebeurtenis IDatabaseOpenedWithRoot gestuur. Zope registreer evolveMinimumSubscriber by verstek as 'n hanteerder vir hierdie gebeurtenis. Kom ons simuleer hierdie:
& Nbsp; >>> klas DatabaseOpenedEventStub (voorwerp):
& Nbsp; ... def __init __ (self, 'n databasis):
& Nbsp; ... self.database = databasis
& Nbsp; >>> gebeurtenis = DatabaseOpenedEventStub (db)
& Nbsp; >>> van zope.generations.generations invoer evolveMinimumSubscriber
& Nbsp; >>> evolveMinimumSubscriber (event)
Die gevolg van hierdie aksie is dat dit nou die databasis bevat die feit dat ons huidige skema getal is 0. As ons die skema werk, sal Zope3 'n idee van wat die beginpunt was nie. Hier sien?
& Nbsp; >>> van zope.generations.generations invoer generations_key
& Nbsp; >>> wortel [generations_key] ['some.app']
& Nbsp; 0
In die werklike lewe moet jy nooit weer hoef te pla met hierdie sleutel direk nie, maar jy moet bewus wees dat dit bestaan ​​nie.
Upgrade scenario
Terug na die storie. Sommige tyd verby en een van ons kliënte kry gekap omdat ons vergeet HTML spesiale karakters te ontsnap! Die gruwel! Ons moet hierdie probleem so gou as moontlik op te los sonder enige data te verloor. Ons besluit geslagte te gebruik om ons maats te beïndruk.
Kom ons werk die skema bestuurder (drop die ou een en installeer 'n nuwe persoonlike een):
& Nbsp; >>> van zope.component invoer globalregistry
& Nbsp; >>> selfoon = globalregistry.getGlobalSiteManager ()
& Nbsp; >>> gsm.unregisterUtility (mits = ISchemaManager, naam = 'some.app')
& Nbsp; True
& Nbsp; >>> klas MySchemaManager (voorwerp):
& Nbsp; ... implemente (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... generasie = 2
& Nbsp; ...
& Nbsp; ... def ontwikkel (self, konteks, geslag):
& Nbsp; ... wortel = context.connection.root ()
& Nbsp; ... antwoorde = wortel ['antwoorde']
& Nbsp; ... as generasie == 1:
& Nbsp; ... vir vraag, antwoord in answers.items ():
& Nbsp; ... antwoorde [vraag] = cgi.escape (antwoord)
& Nbsp; ... elif generasie == 2:
& Nbsp; ... vir vraag, antwoord in answers.items ():
& Nbsp; ... del antwoorde [vraag]
& Nbsp; ... antwoorde [cgi.escape (vraag)] = antwoord
& Nbsp; ... anders:
& Nbsp; ... samel ValueError ("Bummer")
& Nbsp; ... wortel ['antwoorde'] = antwoorde # ping volharding
& Nbsp; ... transaction.commit ()
& Nbsp; >>> bestuurder = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (bestuurder, ISchemaManager, naam = 'some.app')
Ons het minimum_generation stel om 1. Dit beteken dat ons aansoek sal weier om te loop met 'n databasis ouer as generasie 1. Die geslag kenmerk is ingestel op 2, wat beteken dat die nuutste generasie wat hierdie SchemaManager weet is 2.
ontwikkel () is die monster hier. Sy werk is om die databasis te kry van geslag-1 tot geslag. Dit kry 'n konteks wat die kenmerk 'konneksie', wat 'n verbintenis met die ZODB. Jy kan gebruik wat voorwerpe te verander soos in hierdie voorbeeld.
In hierdie spesifieke implementering generasie 1 ontsnap die antwoorde (sê, kritiese, want hulle kan gevoer word deur enigiemand nie!), Geslag 2 ontsnap die vrae (sê, minder belangrik, want dit kan gevoer word deur gemagtigde personell net).
In werklikheid, het jy nie regtig nodig het om 'n persoonlike implementering van ISchemaManager. Een is beskikbaar, ons het dit gebruik vir 'n dummy voorheen. Dit maak gebruik van Python modules vir organisasie van evolusie funksies. Sien sy docstring vir meer inligting.
In die werklike lewe sal jy baie meer kompleks voorwerp strukture as die een hier. Om jou lewe makliker te maak, is daar twee baie nuttige funksies wat beskikbaar is in zope.generations.utility: findObjectsMatching () en findObjectsProviding (). Hulle sal 'n gat in houers rekursief te help om ou voorwerpe wat jy wil om te werk, deur koppelvlak of deur 'n ander kriteria soek. Hulle is maklik om te verstaan, gaan hulle docstrings.
Generations in aksie
So, ons woedend kliënt afgelaai ons jongste kode en weer begin Zope. Die geleentheid is outomaties weer gestuur:
& Nbsp; >>> gebeurtenis = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (event)
Shazam! Die kliënt is weer gelukkig!
& Nbsp; >>> pprint (wortel ['antwoorde'])
& Nbsp; {'hallo': "Hi & hoe doen jy?",
& Nbsp; 'betekenis van die lewe? ":" 42 "
& Nbsp; 'vier Omdat evolveMinimumSubscriber is baie lui, is dit net updates die databasis net genoeg sodat jou aansoek kan dit gebruik (die minimum_generation, dit is). Trouens, die merker dui daarop dat die databasis geslag is gestamp tot 1:
& Nbsp; >>> wortel [generations_key] ['some.app']
& Nbsp; 1
Ons sien dat die geslagte werk, so ons besluit om die volgende stap te neem en te ontwikkel tot geslag 2. Kom ons kyk hoe dit kan met die hand gedoen:
& Nbsp; >>> van zope.generations.generations invoer ontwikkel
& Nbsp; >>> ontwikkel (db)
& Nbsp; >>> pprint (wortel ['antwoorde'])
& Nbsp; {'hallo': "Hi & hoe doen jy?",
& Nbsp; 'betekenis van die lewe? ":" 42 "
& Nbsp; 'vier & Nbsp; >>> wortel [generations_key] ['some.app']
& Nbsp; 2
Verstek gedrag van Evolve opgraderings aan die jongste geslag wat deur die SchemaManager. Jy kan die hoe argument gebruik om te ontwikkel () wanneer jy wil net om te kyk of jy nodig het om te werk, of as jy wil lui soos die intekenaar wat ons voorheen genoem word.
Bestel van skema bestuurders
Algemene substelsels gebruik om 'n aansoek te komponeer staatmaak op ander subsisteme behoorlik funksioneer. Indien beide substelsels verskaf skema bestuurders, is dit dikwels nuttig om die volgorde waarin die evolvers sal opgeroep word om te weet. Dit laat 'n raamwerk en dit is kliënte in staat wees om te ontwikkel in die konsert, en die kliënte kan weet dat die raamwerk sal ontwikkel word voor of na hom.
Dit kan bereik word deur die beheer van die name van die skema bestuurder nuts. Die skema bestuurders hardloop in die volgorde soos bepaal deur sorteer hulle name.
& Nbsp; >>> manager1 = SchemaManager (minimum_generation = 0, geslag = 0)
& Nbsp; >>> Manager2 = SchemaManager (minimum_generation = 0, geslag = 0)
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager1, ISchemaManager, naam = 'another.app')
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... Manager2, ISchemaManager, naam = 'another.app-uitbreiding ")
Let op hoe die naam van die eerste pakket is gebruik om 'n naamruimte vir afhanklike pakkette te skep. Dit is nie 'n vereiste van die raamwerk, maar 'n gerieflike patroon vir hierdie gebruik.
Kom ons ontwikkel die databasis hierdie geslagte te vestig:
& Nbsp; >>> gebeurtenis = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (event)
& Nbsp; >>> wortel [generations_key] ['another.app']
& Nbsp; 0
& Nbsp; >>> wortel [generations_key] ['another.app-uitbreiding']
& Nbsp; 0
Kom ons veronderstel dat vir een of ander rede elk van hierdie subsisteme moet 'n generasie te voeg, en daardie geslag 1 van 'another.app-uitbreiding "hang af van geslag 1 van' another.app. Ons sal moet skema bestuurders vir elk wat op rekord dat hulle al loop, sodat ons kan die gevolg verifieer te voorsien:
& Nbsp; >>> gsm.unregisterUtility (mits = ISchemaManager, naam = 'another.app')
& Nbsp; True
& Nbsp; >>> gsm.unregisterUtility (
& Nbsp; ... mits = ISchemaManager, naam = 'another.app-uitbreiding ")
& Nbsp; True
& Nbsp; >>> klas FoundationSchemaManager (voorwerp):
& Nbsp; ... implemente (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... generasie = 1
& Nbsp; ...
& Nbsp; ... def ontwikkel (self, konteks, geslag):
& Nbsp; ... wortel = context.connection.root ()
& Nbsp; ... bestel = root.get ('bestel', [])
& Nbsp; ... as generasie == 1:
& Nbsp; ... ordering.append ('fondament 1')
& Nbsp; ... Druk 'fondament generasie 1'
& Nbsp; ... anders:
& Nbsp; ... samel ValueError ("Bummer")
& Nbsp; ... wortel ['bestel'] = bestel # ping volharding
& Nbsp; ... transaction.commit ()
& Nbsp; >>> klas DependentSchemaManager (voorwerp):
& Nbsp; ... implemente (ISchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... generasie = 1
& Nbsp; ...
& Nbsp; ... def ontwikkel (self, konteks, geslag):
& Nbsp; ... wortel = context.connection.root ()
& Nbsp; ... bestel = root.get ('bestel', [])
& Nbsp; ... as generasie == 1:
& Nbsp; ... ordering.append ('afhanklike 1')
& Nbsp; ... Druk 'afhanklike generasie 1'
& Nbsp; ... anders:
& Nbsp; ... samel ValueError ("Bummer")
& Nbsp; ... wortel ['bestel'] = bestel # ping volharding
& Nbsp; ... transaction.commit ()
& Nbsp; >>> manager1 = FoundationSchemaManager ()
& Nbsp; >>> Manager2 = DependentSchemaManager ()
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... manager1, ISchemaManager, naam = 'another.app')
& Nbsp; >>> zope.component.provideUtility (
& Nbsp; ... Manager2, ISchemaManager, naam = 'another.app-uitbreiding ")
Ontwikkel die databasis sal nou altyd hardloop die 'another.app' evolusie voor die 'another.app-uitbreiding "van evolusie:
& Nbsp; >>> gebeurtenis = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (event)
& Nbsp; fondament generasie 1
& Nbsp; afhanklik generasie 1
& Nbsp; >>> wortel ['bestel']
& Nbsp; ['fondament 1', 'n afhanklike 1 ']
Installasie
In die bogenoemde voorbeeld, het ons die hand geïnisialiseer die antwoorde. Ons moet nie dat die hand te doen. Die aansoek moet in staat wees om dit outomaties te doen.
IInstallableSchemaManager strek ISchemaManager, die verskaffing van 'n rekenaar installeer vir die uitvoering van 'n aanvanklike installasie van 'n aansoek. Dit is 'n beter alternatief as registreer databasis geopen intekenaars.
Kom ons definieer 'n nuwe skema bestuurder wat sluit installasie:
& Nbsp; >>> gsm.unregisterUtility (mits = ISchemaManager, naam = 'some.app')
& Nbsp; True
& Nbsp; >>> van zope.generations.interfaces invoer IInstallableSchemaManager
& Nbsp; >>> klas MySchemaManager (voorwerp):
& Nbsp; ... implemente (IInstallableSchemaManager)
& Nbsp; ...
& Nbsp; ... minimum_generation = 1
& Nbsp; ... generasie = 2
& Nbsp; ...
& Nbsp; ... def installeer (self, konteks):
& Nbsp; ... wortel = context.connection.root ()
& Nbsp; ... wortel ['antwoorde'] = {'hallo': "? Hi & hoe doen jy ',
& Nbsp; ... "? Betekenis van die lewe": "42"
& Nbsp; ... "vier & Nbsp; ... transaction.commit ()
& Nbsp; ...
& Nbsp; ... def ontwikkel (self, konteks, geslag):
& Nbsp; ... wortel = context.connection.root ()
& Nbsp; ... antwoorde = wortel ['antwoorde']
& Nbsp; ... as generasie == 1:
& Nbsp; ... vir vraag, antwoord in answers.items ():
& Nbsp; ... antwoorde [vraag] = cgi.escape (antwoord)
& Nbsp; ... elif generasie == 2:
& Nbsp; ... vir vraag, antwoord in answers.items ():
& Nbsp; ... del antwoorde [vraag]
& Nbsp; ... antwoorde [cgi.escape (vraag)] = antwoord
& Nbsp; ... anders:
& Nbsp; ... samel ValueError ("Bummer")
& Nbsp; ... wortel ['antwoorde'] = antwoorde # ping volharding
& Nbsp; ... transaction.commit ()
& Nbsp; >>> bestuurder = MySchemaManager ()
& Nbsp; >>> zope.component.provideUtility (bestuurder, ISchemaManager, naam = 'some.app')
Nou, kan maak 'n nuwe databasis:
& Nbsp; >>> db.close ()
& Nbsp; >>> db = DB ()
& Nbsp; >>> conn = db.open ()
& Nbsp; >>> se antwoorde 'in conn.root ()
& Nbsp; Vals
& Nbsp; >>> gebeurtenis = DatabaseOpenedEventStub (db)
& Nbsp; >>> evolveMinimumSubscriber (event)
& Nbsp; >>> conn.sync ()
& Nbsp; >>> wortel = conn.root ()
& Nbsp; >>> pprint (wortel ['antwoorde'])
& Nbsp; {'hallo': "Hi & hoe doen jy?",
& Nbsp; 'betekenis van die lewe? ":" 42 "
& Nbsp; 'vier & Nbsp; >>> wortel [generations_key] ['some.app']
& Nbsp; 2
Die ZODB transaksie log wys daarop dat ons installeer script tereggestel
& Nbsp; >>> [. It.description vir dit in conn.db () storage.iterator ()] [- 2]
& Nbsp; u'some.app: hardloop installeer geslag '
(Klein nota: dit is nie die laaste rekord, want daar is twee pleeg: MySchemaManager voer een, en evolveMinimumSubscriber voer die tweede een MySchemaManager nie regtig nodig het om te pleeg..)

Wat is nuut in hierdie release:.

  • Bygevoeg ondersteuning vir Python 3.3
  • Vervang afgekeur zope.interface.implements gebruik met ekwivalent zope.interface.implementer versierder.
  • Drop ondersteuning vir Python 2.4 en 2.5.

Wat is nuut in die weergawe 3.7.1:

  • verwyder buildout deel wat tydens die ontwikkeling gebruik is, maar doen nie stel op Windows.
  • Generation skrifte voeg 'n transaksie noot.

Vereistes :

  • Python

Ander sagteware ontwikkelaar Zope Corporation and Contributors

zope.app.http
zope.app.http

11 May 15

grokui.admin
grokui.admin

14 Apr 15

zope.exceptions
zope.exceptions

20 Feb 15

zope.browserpage
zope.browserpage

20 Feb 15

Kommentaar te zope.generations

Kommentaar nie gevind
Kommentaar te lewer
Draai op die foto!