Changeset 24
- Timestamp:
- 02/01/08 17:45:54 (1 year ago)
- Files:
-
- project/trunk/src/pyxoo/__init__.py (modified) (1 diff)
- project/trunk/src/pyxoo/command.py (modified) (1 diff)
- project/trunk/src/pyxoo/core.py (modified) (4 diffs)
- project/trunk/src/pyxoo/model.py (modified) (5 diffs)
- project/trunk/src/pyxoo/view.py (modified) (5 diffs)
- project/trunk/test/model/TestModelLocator.py (modified) (2 diffs)
- project/trunk/test/utils/TestInterface.py (modified) (1 diff)
- project/trunk/test/view/TestViewLocator.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
project/trunk/src/pyxoo/__init__.py
r23 r24 20 20 __version__ = "0.1" 21 21 __author__ = "Alexis Couronne" 22 __url__ = " www.pyxoo.org"22 __url__ = "http://www.pyxoo.org" 23 23 24 24 project/trunk/src/pyxoo/command.py
r23 r24 234 234 235 235 class Delegate( Command ): 236 __logger = logging.getLogger( " Pyxoo.Command.delegate.Delegate" )236 __logger = logging.getLogger( "pyxoo.command.Delegate" ) 237 237 238 238 @classmethod project/trunk/src/pyxoo/core.py
r23 r24 1 1 2 import pyxoo, sys 2 import pyxoo, sys, logging 3 3 4 4 __version__ = pyxoo.__version__ … … 20 20 21 21 def isRegistered( self, key ): 22 """ isRegistered(string):boolean22 """ 23 23 Returns true is there is a ressource associated 24 24 with the passed-in key. To avoid errors when … … 27 27 ressource you would access is already accessible before any 28 28 call to the locate function. 29 @type key: String 30 @rtype: Boolean 29 31 """ 30 32 31 33 def locate( self, key ): 32 """ locate(string):object34 """ 33 35 Returns the ressource associated with the passed-in key. 34 36 If there is no ressource identified by the passed-in key, the … … 36 38 when attempting to access to a ressource, take care to check the 37 39 existence of the ressource before trying to access to it. 40 @type key: String 41 @rtype: Object 38 42 """ 39 43 40 def add( self, dictionnary):41 """ add(dict):void44 def add( self, dictionnary ): 45 """ 42 46 Adds all ressources contained in the passed-in dictionnary 43 47 into this locator instance. If there is keys used both in 44 48 the locator and in the dictionnary an exception is thrown. 45 """ 49 @type dictionnary: dict 50 @rtype: void 51 """ 52 53 54 55 class AbstractLocator( Locator ): 56 __logger = logging.getLogger( "pyxoo.core.AbstractLocator" ) 57 def __init__( self, typeObject=None, typeListener=None ): 58 """ 59 Creates a new locator instance. If the type 60 argument is defined, the locator is considered as typed, and 61 then the type of all elements inserted in this set is checked. 62 @param typeObject: Can be None 63 @param typeListener: Can be None 64 @type typeObject: Class or Type 65 @type typeListener: Class or Type 66 """ 67 self.__type = typeObject 68 self.__elements = pyxoo.utils.HashMap( str, self.__type ) 69 self.__eventBroadcaster = pyxoo.event.EventBroadcaster( self, typeListener ) 70 71 def onRegister( self, name=None, object=None ): 72 """ 73 override me if you need me 74 @param name: Can be None 75 @param object: Can be None 76 @type name: String 77 @type object: Object 78 @rtype: void 79 """ 80 pass 81 82 def onUnregister( self, name=None ): 83 """ 84 override me if you need me 85 @param name: Can be None 86 @type name: String 87 @rtype: void 88 """ 89 pass 90 91 def isRegistered( self, name ): 92 """ 93 Returns true is there is a ressource associated 94 with the passed-in key. To avoid errors when 95 retreiving ressources from a locator you should systematically 96 use the isRegistered function to check if the 97 ressource you would access is already accessible before any 98 call to the locate function. 99 @type name: String 100 @rtype: Boolean 101 """ 102 return self.__elements.containsKey( name ) 103 104 def register( self, name, object ): 105 """ 106 @type name: String 107 @type object: Object 108 @rtype: void 109 @raise pyxoo.exceptions.IllegalArgumentException: Raise IllegalArgumentException if an object already registered with the passed in name. 110 @raise TypeError: Raise TypeError if locator is typed and the passed in object is not an instance of locator type. 111 """ 112 if self.isTyped() and not isinstance( object, self.getType() ): 113 msg = "%s.register() failed. Item must be '%s' typed."%( self, self.getType() ) 114 self.__logger.error( msg ) 115 raise TypeError( msg ) 116 if self.__elements.containsKey( name ): 117 msg = " item is already registered with '%s' name in %s"%( name, self ) 118 self.__logger.error( msg ) 119 raise pyxoo.exceptions.IllegalArgumentException( msg ) 120 else: 121 self.__elements.put( name, object ) 122 self.onRegister( name, object ) 123 124 125 def unregister( self, name ): 126 """ 127 @type name: String 128 @rtype: Boolean 129 """ 130 if self.__elements.containsKey( name ): 131 self.__elements.remove( name ) 132 self.onUnregister( name ) 133 return True 134 else: 135 return False 136 137 def locate( self, name ): 138 """ 139 Returns the ressource associated with the passed-in key. 140 If there is no ressource identified by the passed-in key, the 141 function will fail with an error. To avoid the throw of an exception 142 when attempting to access to a ressource, take care to check the 143 existence of the ressource before trying to access to it. 144 @type key: String 145 @rtype: Object 146 @raise pyxoo.exceptions.NoSuchElementException: Raise NoSuchElementException if no object registered with passed in name. 147 """ 148 if self.__elements.containsKey( name ): 149 return self.__elements.get( name ) 150 else: 151 msg = "Can't find '%s' item with '%s' name in %s"%( self.getType(), name, self ) 152 self.__logger.fatal( msg ) 153 raise pyxoo.exceptions.NoSuchElementException( msg ) 154 155 def release( self ): 156 """ 157 Clears all association between keys and objects 158 registered for this locator. 159 @rtype: void 160 """ 161 self.__elements.clear() 162 163 def add( self, dictionnary ): 164 """ 165 Adds all ressources contained in the passed-in dictionnary 166 into this locator instance. If there is keys used both in 167 the locator and in the dictionnary an exception is thrown. 168 @type dictionnary: dict 169 @rtype: void 170 """ 171 for key, value in dictionnary.items(): 172 self.register( key, value ) 173 174 def matchType(self, object): 175 """ 176 Verify that the passed-in object type match the current 177 container element's type. 178 @type object: Object 179 @rtype: Boolean 180 """ 181 return isinstance( object, self.getType() ) or object is None 182 183 def getType(self): 184 """ 185 Return the class type of elements in this container. 186 An untyped container returns None, as the 187 wildcard type (*) is not a Class 188 and Object class doesn't fit for primitive types. 189 @rtype: Class or Type or None 190 """ 191 return self.__type 192 193 def isTyped(self): 194 """ 195 Returns true if this container perform a verification 196 of the type of elements. 197 @rtype: Boolean 198 """ 199 return self.__type is not None 200 201 def addEventListener( self, eventType, listener, *args ): 202 """ 203 Adds an event listener for the specified event type. 204 There is two behaviors for the addEventListener 205 function : 206 The passed-in listener is an object : 207 The object is added as listener only for the specified event, the object must 208 have a function with the same name than type or at least a 209 handleEvent function. 210 The passed-in listener is a function : 211 A Delegate object is created and then 212 added as listener for the event type. There is no restriction on the name of 213 the function. If the rest is not empty, all elements in it is 214 used as additional arguments into the delegate object. 215 @type eventType: String 216 @type listener: Object 217 @type *args: ...Object 218 @rtype: Boolean 219 @raise pyxoo.execeptions.UnsupportedOperationException: If the listener is an object which have neither a function with the same name than the event type nor a function called handleEvent 220 """ 221 return self.__eventBroadcaster.addEventListener( eventType, listener, *args ) 222 223 def removeEventListener( self, eventType, listener ): 224 """ 225 Removes the passed-in listener for listening the specified event. The 226 listener could be either an object or a function. 227 @type eventType: String 228 @type listener: Object 229 @rtype: Boolean 230 """ 231 return self.__eventBroadcaster.removeEventListener( eventType, listener ) 232 233 def getKeys(self): 234 """ 235 Returns an list view of the keys contained in this locator. 236 @rtype: list 237 """ 238 return self.__elements.getKeys() 239 240 def getValues(self): 241 """ 242 Returns an list view of the values contained in this locator. 243 @rtype: list 244 """ 245 return self.__elements.getValues() 246 247 def __str__( self ): 248 """ 249 Returns the string representation of this instance. 250 @rtype: String 251 """ 252 return pyxoo.utils.PyxooStringifier.stringify( self ) 253 254 255 project/trunk/src/pyxoo/model.py
r23 r24 7 7 __author__ = "Alexis Couronne" 8 8 9 class ModelLocator( pyxoo.core. Locator ):9 class ModelLocator( pyxoo.core.AbstractLocator ): 10 10 __instances = pyxoo.utils.HashMap() 11 11 class __PRIVATE:pass … … 25 25 if privateAccess is not self.__PRIVATE: 26 26 raise IllegalAccessException( "Constructor of ModelLocator is private." ) 27 self.__models = pyxoo.utils.HashMap(str, AbstractModel)27 pyxoo.core.AbstractLocator.__init__( self, pyxoo.model.AbstractModel ) 28 28 self.__owner = owner 29 29 … … 32 32 Return owner.""" 33 33 return self.__owner 34 35 def isRegistered( self, key ):36 """isRegistered(String):boolean37 Indicates if ModelLocator contains Model associated to passed-in key."""38 return self.__models.containsKey( key )39 40 def locate( self, key ):41 """locate(String):Model42 Return Model associated to the passed-in key or None value if key not know by the locator."""43 return self.__models.get( key )44 34 45 35 def getModel( self, key ): … … 48 38 return self.locate( key ) 49 39 50 def registerModel( self, key, model ):51 """registerModel(String, Model):void52 Registers passed-in model associated to passed-in key."""53 if not isinstance( model, AbstractModel ):54 raise TypeError( "model param must be an instance of Model class." )55 if self.isRegistered( key ):56 return False57 self.__models.put( key, model )58 return True59 60 def unregisterModel( self, key ):61 """unregisterModel(string):void62 Unregisters model associated to passed-in key."""63 self.__models.remove( key )64 65 40 def release( self ): 66 41 """release():void""" 67 for model in self. __models.values():42 for model in self.getValues(): 68 43 model.release() 69 self.__models.clear()44 pyxoo.core.AbstractLocator.release( self ) 70 45 71 def add( self, dictionnary ):72 """add(dict):void"""73 for key, model in dictionnary.items():74 self.registerModel( key, model )75 76 46 def __str__( self ): 77 47 """__str__():String … … 106 76 """release():void""" 107 77 self.__eventBroadcaster.removeAllListeners() 108 from Pyxoo.Model.locator import ModelLocator 109 ModelLocator( self.getOwner() ).unregisterModel( self.getName() ) 78 pyxoo.model.ModelLocator.getInstance( self.getOwner() ).unregister( self.getName() ) 110 79 self.__name = None 111 80 project/trunk/src/pyxoo/view.py
r23 r24 33 33 """release():void""" 34 34 self._getBroadcaster().removeAllListeners() 35 pyxoo.view.ViewLocator ( self.getOwner() ).unregisterView( self.getName() )35 pyxoo.view.ViewLocator.getInstance( self.getOwner() ).unregister( self.getName() ) 36 36 37 37 def getOwner( self ): … … 93 93 94 94 95 class ViewLocator( pyxoo.core. Locator ):95 class ViewLocator( pyxoo.core.AbstractLocator ): 96 96 __instances = pyxoo.utils.HashMap() 97 97 class __PRIVATE:pass … … 111 111 if privateAccess is not self.__PRIVATE: 112 112 raise IllegalAccessException( "Constructor of ViewLocator is private." ) 113 self.__views = pyxoo.utils.HashMap( str, pyxoo.view.AbstractView )113 pyxoo.core.AbstractLocator.__init__( self, pyxoo.view.AbstractView ) 114 114 self.__owner = owner 115 115 … … 118 118 Return owner.""" 119 119 return self.__owner 120 121 def isRegistered( self, key ):122 """isRegistered(string):boolean123 Indicates if ViewLocator contains View associated to passed-in key."""124 return self.__views.containsKey( key )125 126 def locate( self, key ):127 """locate(string):View128 Return View associated to the passed-in key or None value if key not know by the locator."""129 return self.__views.get( key )130 120 131 121 def getView( self, key ): … … 134 124 return self.locate( key ) 135 125 136 def registerView( self, key, view ):137 """registerView(string, View):boolean138 Registers passed-in view associated to passed-in key."""139 if not isinstance( view, AbstractView ):140 raise TypeError( "view param must be an instance of View class." )141 if self.isRegistered( key ):142 return False143 else:144 self.__views.put( key, view )145 return True146 147 def unregisterView( self, key ):148 """unregisterView(string):void149 Unregisters view associated to passed-in key."""150 self.__views.remove( key )151 152 126 def release( self ): 153 127 """release():void""" 154 for view in self. __views.values():128 for view in self.getValues(): 155 129 view.release() 156 self.__views.clear() 157 158 def add( self, dictionnary ): 159 """add(dict):void""" 160 for key, view in dictionnary.items(): 161 self.registerView( key, view ) 130 pyxoo.core.AbstractLocator.release( self ) 162 131 163 132 def __str__( self ): project/trunk/test/model/TestModelLocator.py
r23 r24 25 25 def setUp( self ): 26 26 self.instance = pyxoo.model.ModelLocator.getInstance() 27 self.instance.release() 27 28 self.m1 = pyxoo.model.AbstractModel() 28 29 self.m2 = pyxoo.model.AbstractModel() … … 38 39 39 40 def testRegisterModel( self ): 40 self.instance.register Model( "m1", self.m1 )41 self.assertRaises( TypeError, self.instance.register Model, "mX", self.otherObject )41 self.instance.register( "m1", self.m1 ) 42 self.assertRaises( TypeError, self.instance.register, "mX", self.otherObject ) 42 43 self.assertTrue( self.instance.isRegistered( "m1" ) ) 43 44 44 45 def testRegisterModelWithPlugin( self ): 45 46 pluginA, pluginB = pyxoo.plugin.AbstractPlugin(), pyxoo.plugin.AbstractPlugin() 46 self.assertTrue( pyxoo.model.ModelLocator.getInstance( pluginA ).registerModel( "v1", self.m1 ))47 self.assert False( pyxoo.model.ModelLocator.getInstance( pluginA ).registerModel( "v1", self.m1 ))48 self.assertTrue( pyxoo.model.ModelLocator.getInstance( pluginB ).registerModel( "v1", self.m1 ))49 self.assert False( pyxoo.model.ModelLocator.getInstance( pluginB ).registerModel( "v1", self.m1 ))47 pyxoo.model.ModelLocator.getInstance( pluginA ).register( "v1", self.m1 ) 48 self.assertRaises( pyxoo.exceptions.IllegalArgumentException, pyxoo.model.ModelLocator.getInstance( pluginA ).register, "v1", self.m1 ) 49 pyxoo.model.ModelLocator.getInstance( pluginB ).register( "v1", self.m1 ) 50 self.assertRaises( pyxoo.exceptions.IllegalArgumentException, pyxoo.model.ModelLocator.getInstance( pluginB ).register, "v1", self.m1 ) 50 51 51 52 def testUnregisterModel( self ): 52 self.instance.register Model( "m1", self.m1 )53 self.instance.register Model( "m2", self.m2 )53 self.instance.register( "m1", self.m1 ) 54 self.instance.register( "m2", self.m2 ) 54 55 self.assertTrue( self.instance.isRegistered( "m1" ) ) 55 56 self.assertTrue( self.instance.isRegistered( "m2" ) ) 56 self.instance.unregister Model( "m1" )57 self.instance.unregister( "m1" ) 57 58 self.assertFalse( self.instance.isRegistered( "m1" ) ) 58 59 self.assertTrue( self.instance.isRegistered( "m2" ) ) 59 60 60 61 def testLocate( self ): 61 self.instance.register Model( "m1", self.m1 )62 self.instance.register Model( "m2", self.m2 )62 self.instance.register( "m1", self.m1 ) 63 self.instance.register( "m2", self.m2 ) 63 64 self.assertEquals( self.m1, self.instance.locate( "m1" ) ) 64 65 self.assertEquals( self.m2, self.instance.locate( "m2" ) ) 65 self.instance.unregister Model( "m1" )66 self.assert Equals( None, self.instance.locate( "m1" ))66 self.instance.unregister( "m1" ) 67 self.assertRaises( pyxoo.exceptions.NoSuchElementException, self.instance.locate, "m1" ) 67 68 project/trunk/test/utils/TestInterface.py
r21 r24 152 152 self.assertTrue( isinstance( event, IEvent ) ) 153 153 self.assertTrue( issubclass( MyEvent, IEvent ) ) 154 self.assertFalse( isinstance( self, MyEvent ) ) 154 155 155 156 project/trunk/test/view/TestViewLocator.py
r23 r24 24 24 def setUp( self ): 25 25 self.instance = pyxoo.view.ViewLocator.getInstance() 26 self.instance.release() 26 27 self.view = pyxoo.view.AbstractView() 27 28 class A:pass … … 37 38 38 39 def testRegisterView( self ): 39 self. assertTrue(self.instance.registerView( "aKey", self.view ))40 self.assert False(self.instance.registerView( "aKey", self.view ))41 self.assertRaises( TypeError, self.instance.register View, "aSecondKey", self.otherObject )40 self.instance.register( "aKey", self.view ) 41 self.assertRaises( pyxoo.exceptions.IllegalArgumentException, self.instance.register, "aKey", self.view ) 42 self.assertRaises( TypeError, self.instance.register, "aSecondKey", self.otherObject ) 42 43 self.assertTrue( self.instance.isRegistered( "aKey" ) ) 43 44 44 45 def testResgisterViewWithPlugin( self ): 45 46 pluginA, pluginB = pyxoo.plugin.AbstractPlugin(), pyxoo.plugin.AbstractPlugin() 46 self.assertTrue( pyxoo.view.ViewLocator.getInstance( pluginA ).registerView( "v1", self.view ))47 self.assert False( pyxoo.view.ViewLocator.getInstance( pluginA ).registerView( "v1", self.view ))48 self.assertTrue( pyxoo.view.ViewLocator.getInstance( pluginB ).registerView( "v1", self.view ))49 self.assert False( pyxoo.view.ViewLocator.getInstance( pluginB ).registerView( "v1", self.view ))47 pyxoo.view.ViewLocator.getInstance( pluginA ).register( "v1", self.view ) 48 self.assertRaises( pyxoo.exceptions.IllegalArgumentException, pyxoo.view.ViewLocator.getInstance( pluginA ).register, "v1", self.view ) 49 pyxoo.view.ViewLocator.getInstance( pluginB ).register( "v1", self.view ) 50 self.assertRaises( pyxoo.exceptions.IllegalArgumentException, pyxoo.view.ViewLocator.getInstance( pluginB ).register, "v1", self.view ) 50 51 51 52 def testUnregisterView( self ): 52 self.instance.register View( "v1", self.view )53 self.instance.register View( "v2", pyxoo.view.AbstractView() )53 self.instance.register( "v1", self.view ) 54 self.instance.register( "v2", pyxoo.view.AbstractView() ) 54 55 self.assertTrue( self.instance.isRegistered( "v1" ) ) 55 56 self.assertTrue( self.instance.isRegistered( "v2" ) ) 56 self.instance.unregister View( "v1" )57 self.instance.unregister( "v1" ) 57 58 self.assertFalse( self.instance.isRegistered( "v1" ) ) 58 59 self.assertTrue( self.instance.isRegistered( "v2" ) ) 59 60 60 61 def testLocate( self ): 61 self.instance.register View( "v1", self.view )62 self.instance.register( "v1", self.view ) 62 63 v2 = pyxoo.view.AbstractView() 63 self.instance.register View( "v2", v2 )64 self.instance.register( "v2", v2 ) 64 65 self.assertEquals( self.view, self.instance.locate( "v1" ) ) 65 66 self.assertEquals( v2, self.instance.locate( "v2" ) ) 66 self.instance.unregister View( "v1" )67 self.assert Equals( None, self.instance.locate( "v1" ) )67 self.instance.unregister( "v1" ) 68 self.assertRaises( pyxoo.exceptions.NoSuchElementException, self.instance.locate, "v1" )
