Pyre family example

From DANSE

Is it possible to have multiple components in an application that use the same factory name?

Yes. You have to use the 'family' keyword in the inventory. See meta-example below.

First, let's construct a "Greeter" component:

from pyre.components.Component import Component
class Greeter(Component):

    class Inventory(Component.Inventory):
        import pyre.inventory
        greeting = pyre.inventory.str("greeting",default="Hello")
        greeting.meta['tip] = "the greeting to use"

    def greet(self, friend):
        return "%s %s!" % (self.greeting, friend)

    def __init__(self, name='default-greeter'):
        Component.__init__(self, name, facility='greeter')
        self.greeting = ''
        return

    def _configure(self):
        Component._configure(self)
        self.greeting = self.inventory.greeting
        return

We can now build factories to be used from within .odb files...

"goodbye" is a 'Greeter' component (contained within a 'greeter' factory).

def greeter():
    from Greeter import Greeter
    class Goodbye(Greeter):
        def __init__(self)
            Greeter.__init__(self, "goodbye")
            return

        def _defaults(self):
            self.inventory.greeting = "Goodbye"
            return

    return Goodbye()

"farewell" is another "Greeter" component of similar construction.

def greeter():
    from Greeter import Greeter
    class Farewell(Greeter):
        def __init__(self)
            Greeter.__init__(self, "farewell")
            return

        def _defaults(self):
            self.inventory.greeting = "Farewell"
            return

    return Farewell()

To use both the 'farewell' and 'goodbye' greeters in the same pyre application, the most appropriate syntax is to use 'family'.

from pyre.applications.Script import Script
class Danse(Script):

    class Inventory(Script.Inventory):
        import pyre.inventory
        friend = pyre.inventory.str('friend', default='Tim')
        friend.meta['tip'] = "the name of the person to greet"
        friend.validator = pyre.inventory.choice(["Brent","John","Mike","Tim")]
        from Greeter import Greeter
# 1 #   greeter = pyre.inventory.facility("greeter", default=Greeter())
# 2 #   greeter = pyre.inventory.facility("greeter", factory=Greeter, args=[])
# 3 #   greeter = pyre.inventory.facility("greeter", default="goodbye")
        greeter = pyre.inventory.facility("saluter", family="greeter", default=Greeter())
        greeter.meta['tip'] = "the component that greets"

    def main(self, *args, **kwds):
        print self.greeter.greet(self.myfriend)
        return

    def __init__(self):
        Script.__init_(self, 'danse')
        self.myfriend = 'Hi'
        return

    def _configure(self):
        Script._configure(self)
        self.myfriend = self.inventory.friend
        return

if __name__='__main__':
    app = Danse()
    app.run()

Invocation methods 1, 2, and 3 (commented out above) will function well if there is only one greeter to configure. Usage for any of these cases would look like this...

$ danse.py --greeter=goodbye
 Goodbye Tim!
$ danse.py --greeter=goodbye --goodbye.greeting=Morning
 Morning Tim!
$ danse.py
 Hello Tim!

However, as soon as there are two greeters needed, you cannot refer to 'greeter' as a seperate entity! So, we must use the 'family' syntax (uncommented above). So if we added a second greeter to the Script's inventory...

        greeter2 = pyre.inventory.facility("welcomer", family="greeter", default="goodbye")

Then, we can imagine that usage would look as follows (if first the 'saluter' prints, then the 'welcomer' prints):

$ danse.py --saluter=farewell --welcomer=goodbye
 Farewell Tim!  Goodbye Tim!
$ danse.py --saluter=goodbye --saluter.greeting=Morning --welcomer=goodbye
 Morning Tim!  Goodbye Tim!
$ danse.py
 Hello Tim!  Hello Tim!
Personal tools
Document Uploads/Links