source: main/waeup.ikoba/trunk/src/waeup/ikoba/app.txt @ 12702

Last change on this file since 12702 was 12209, checked in by Henrik Bettermann, 10 years ago

Take new plugin into considerartion.

File size: 3.3 KB
RevLine 
[11949]1:mod:`waeup.ikoba.app` -- central components for Ikoba
[11971]2******************************************************
[3933]3
[5140]4.. :doctest:
[11949]5.. :layer: waeup.ikoba.testing.IkobaUnitTestLayer
[3933]6
[11949]7.. module:: waeup.ikoba.app
[3933]8
[11954]9.. class:: Company
[4273]10
[11949]11  The main Ikoba application object is given with
[11954]12  :class:`Company`. It provides the main containers as faculties,
[4273]13  hostels, etc.
14
15  .. attribute:: name
16
[11954]17     A string. The name of a company.
[4273]18
19  .. attribute:: faculties
20
21     An arbitrary object containing "faculties". In the case of
[11954]22     `Company` it is a container of type
[11949]23     `waeup.ikoba.interfaces.IFacultiesContainer`.
[4273]24
25
[11954]26Creating `Company` instances
[11971]27============================
[3933]28
[11954]29As :class:`Company` instances make use of the Zope Component
[4273]30Architecture (ZCA), we have to setup the basic component registries,
31before we can create instances. We do this by simply grokking the
32whole :mod:`waeup` package. This way all interfaces, utilities and adapters
33defined in the package are looked up and registered with the global
[5140]34registries (this is done by the testlayer automatically).
[3933]35
[11954]36Now we can import the :class:`Company` class and create an
[4273]37instance:
[3933]38
[11954]39    >>> from waeup.ikoba.app import Company
40    >>> mycompany = Company()
41    >>> mycompany
42    <waeup.ikoba.app.Company object at 0x...>
[3933]43
[11954]44Instances of `Company` comply with the interface
45`waeup.ikoba.interfaces.ICompany`:
[3933]46
47    >>> from zope.interface.verify import verifyClass
[11954]48    >>> from waeup.ikoba.interfaces import ICompany
49    >>> verifyClass(ICompany, Company)
[3933]50    True
51
[4273]52A freshly created instance provides the attributes promised by the
53interface:
[3933]54
[11954]55    >>> from waeup.ikoba.app import Company
56    >>> mycompany = Company()
57    >>> mycompany['configuration'].name
58    u'Sample Company'
[3933]59
[11954]60  >>> mycompany['users']
[11949]61  <waeup.ikoba.userscontainer.UsersContainer object at 0x...>
[6897]62
[11954]63  >>> mycompany['datacenter']
[11949]64  <waeup.ikoba.datacenter.DataCenter object at 0x...>
[6897]65
[11954]66  >>> mycompany['configuration']
[11949]67  <waeup.ikoba.configuration.ConfigurationContainer object at 0x...>
[6907]68
[6897]69
[11949]70Ikoba plugins
[11971]71=============
[6897]72
[11949]73waeup.ikoba provides an API to 'plugin' components. Things that should
74be setup at creation time of a Ikoba application can indicate
75that by providing a utility providing IIkobaPlugin.
[6897]76
77The plugins are looked up by an created app, which then will call the
78``setup()`` method of each plugin.
79
[11949]80   >>> from waeup.ikoba.interfaces import IIkobaPluggable
[6897]81   >>> from zope.component import getAdapters, getUtilitiesFor
[11949]82   >>> sorted(list(getUtilitiesFor(IIkobaPluggable)))
[12209]83   [(u'documents', <waeup.ikoba.documents.container.DocumentsPlugin ...)]
[6897]84
85
86We can provide a new plugin like this:
87
88   >>> import grok
[11949]89   >>> from waeup.ikoba.interfaces import IIkobaPluggable
[6897]90   >>> class MyPlugin(grok.GlobalUtility):
[11949]91   ...   grok.implements(IIkobaPluggable)
[6897]92   ...   def setup(self, site, name, logger):
93   ...     print "Setup was called for"
94   ...     print site
95   ...   def update(self, site, name, logger):
96   ...     pass
97
98When we register the plugin
99
100   >>> grok.testing.grok_component('MyPlugin', MyPlugin)
101   True
102
[11949]103and setup a new Ikoba instance, we will get a message:
[6897]104
[11954]105   >>> from waeup.ikoba.app import Company
106   >>> site = Company()
[6897]107   Setup was called for
[11954]108   <waeup.ikoba.app.Company object at 0x...>
[6897]109
[11954]110Apparently the plugin can do with the Company object whatever it
[7811]111likes. That's what plugins are for.
Note: See TracBrowser for help on using the repository browser.