fclient-commit Mailing List for fclient (Page 22)
Status: Pre-Alpha
Brought to you by:
jurner
You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(23) |
Nov
(54) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(17) |
Feb
(209) |
Mar
(63) |
Apr
(31) |
May
(7) |
Jun
(39) |
Jul
(390) |
Aug
(122) |
Sep
(6) |
Oct
|
Nov
|
Dec
|
From: <jU...@us...> - 2008-06-30 09:17:19
|
Revision: 437 http://fclient.svn.sourceforge.net/fclient/?rev=437&view=rev Author: jUrner Date: 2008-06-30 02:17:24 -0700 (Mon, 30 Jun 2008) Log Message: ----------- ... Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-06-30 09:12:16 UTC (rev 436) +++ trunk/sandbox/fcp2/client.py 2008-06-30 09:17:24 UTC (rev 437) @@ -885,8 +885,6 @@ ) return True - #NOTE: there is no distinction between ClientPutDiskDir and ClientPutComplexDir - # so a bit of additional work here requestType = msg['RequestType'] if requestType & consts.RequestType.MaskGet: initialRequest = message.ClientGet() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-30 09:12:43
|
Revision: 436 http://fclient.svn.sourceforge.net/fclient/?rev=436&view=rev Author: jUrner Date: 2008-06-30 02:12:16 -0700 (Mon, 30 Jun 2008) Log Message: ----------- fix for PutDiskDir vs PutComplexDir on restore Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-06-30 08:58:39 UTC (rev 435) +++ trunk/sandbox/fcp2/client.py 2008-06-30 09:12:16 UTC (rev 436) @@ -876,7 +876,6 @@ # unknown request... try to restore it if initialRequest is None: - if CancelPersistentRequests: self.sendMessage( message.RemovePersistentRequest( @@ -891,22 +890,16 @@ requestType = msg['RequestType'] if requestType & consts.RequestType.MaskGet: initialRequest = message.ClientGet() - - #FIXME: does not work as expected - # ClientPutdiskDir is just a subtype of ClientPutComplexDir - # items will be passed as Files.N.* container - - elif requestType == consts.RequestType.PutMultiple: + elif requestType & (onsts.RequestType.PutDir | consts.RequestType.PutMultiple): + #NOTE: PutDiskDir is just a subtype of PutComplexDir initialRequest = message.ClientPutComplexDir() - elif requestType == consts.RequestType.PutDir: - initialRequest = message.ClientPutdiskDir() else: initialRequest = message.ClientPut() initialRequest.params.update(msg.params) self._requests[initialRequest['Identifier']] = initialRequest - #FIX: remove Started param from PersistentGet / Put + #FIX: remove Started param from PersistentGet / Put, not interesting if 'Started' in initialRequest.params: del initialRequest.params['Started'] initialRequest['RequestStatus'] |= consts.RequestStatus.Restored This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-30 08:58:32
|
Revision: 435 http://fclient.svn.sourceforge.net/fclient/?rev=435&view=rev Author: jUrner Date: 2008-06-30 01:58:39 -0700 (Mon, 30 Jun 2008) Log Message: ----------- more tests Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_client.py Modified: trunk/sandbox/fcp2/test_fcp/test_client.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-30 08:57:58 UTC (rev 434) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-30 08:58:39 UTC (rev 435) @@ -341,8 +341,6 @@ ('DisconnectReason', consts.DisconnectReason.Close), ) - - #*********************************************************************************** # #*********************************************************************************** @@ -356,8 +354,9 @@ self.failIf(self.client.isOpen()) #*********************************************************************************** -#TODO: not idea how to test this +# #*********************************************************************************** +#TODO: not idea how to test this class Test_connect(BaseTestClient): pass @@ -642,10 +641,10 @@ self.closeClient() #*********************************************************************************** -# TODO: no idea how t test this +# #*********************************************************************************** +# TODO: no idea how t test this class Test_startNode(BaseTestClient): - pass #*********************************************************************************** @@ -659,25 +658,21 @@ self.client.setConnectionName('foo') self.failIf(self.client.getConnectionName() != 'foo') - #*********************************************************************************** # #*********************************************************************************** class Test_get_setDebugVerbosity(BaseTestClient): - def test_get_setDebugVerbosity(self): oldVerbosity = self.client.getDebugVerbosity() self.client.setDebugVerbosity(self.client.consts.DebugVerbosity.Quiet) self.client.setDebugVerbosity(oldVerbosity) - #*********************************************************************************** # #*********************************************************************************** class Test_versionCheckNodeHello(BaseTestClient): - def test_get_versionCheckNodeHello(self): msg = { @@ -716,8 +711,9 @@ self.failUnless(result == True) #*********************************************************************************** -# TODO: not tested +# #*********************************************************************************** +# TODO: not tested class Test_handleMessage(BaseTestClient): pass @@ -764,13 +760,12 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.failUnless(self.ioOpen()) - #*********************************************************************************** -#TODO: not tested yet +# #*********************************************************************************** +#TODO: not tested class Test_run(BaseTestClient): - pass #*********************************************************************************** @@ -869,9 +864,8 @@ self.assertHasNextMessage(None) self.failUnless(self.ioOpen()) - #*********************************************************************************** -# NOTE: all the in depth tests for getFile() getKeyInfo() are performed here +# #*********************************************************************************** class Test_getData(BaseTestClient): @@ -1885,11 +1879,7 @@ #*********************************************************************************** # #*********************************************************************************** -#TODO: -# -# x. check if TargetFilename handling is ok for CHKs -# - +#TODO: check if TargetFilename handling is ok for CHKs class Test_putData(BaseTestClient): def test_putData_Success(self): @@ -1959,93 +1949,16 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.failIf(requestsAll) - - #*********************************************************************************** # -#*********************************************************************************** -class Test_putRedirect(BaseTestClient): - - - def testPutRedirect_Success(self): +#*********************************************************************************** +class Test_putDir(BaseTestClient): + def test_putDir_Success(self): self.connectClient() - - # request a arbitrary file - myRedirect = self.client.key.KSK('foo') - myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData) - myIdentifier = self.client.putRedirect( - myRedirect, - myKey, - ) - myRequest = self.client.getRequest(myIdentifier) - requestsAll = self.client.getRequests() - - self.assertHasNextMessage(consts.Message.ClientPut) - self.failUnless(myIdentifier in requestsAll) - - self.sendResponseMessage( - 'PutSuccessful', - Identifier=myIdentifier, - URI=myRedirect - ) - self.assertHasNextEvent( - self.client.events.RequestCompleted, - consts.Message.ClientPut, - ('RequestStatus', consts.RequestStatus.Success | - consts.RequestStatus.RemovedFromQueue | - consts.RequestStatus.Completed - ), - ) - - self.assertHasNextEvent(None) - self.assertHasNextMessage(None) - self.failIf(requestsAll) - - - def testPutRedirect_Failure(self): - self.connectClient() - - # request a arbitrary file - myRedirect = self.client.key.KSK('foo') - myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData) - myIdentifier = self.client.putRedirect( - myRedirect, + myKey = self.client.key.KSK('foo') + myIdentifier = self.client.putDir( myKey, - ) - myRequest = self.client.getRequest(myIdentifier) - requestsAll = self.client.getRequests() - - self.assertHasNextMessage(consts.Message.ClientPut) - self.failUnless(myIdentifier in requestsAll) - - self.sendResponseMessage( - 'PutFailed', - Identifier=myIdentifier, - Code='5', # rout not found - ) - - self.assertHasNextEvent( - self.client.events.RequestFailed, - consts.Message.ClientPut, - ('RequestStatus', consts.RequestStatus.Error | - consts.RequestStatus.RemovedFromQueue | - consts.RequestStatus.Completed - ), - ) - - self.assertHasNextEvent(None) - self.assertHasNextMessage(None) - self.failIf(requestsAll) - - - - -class Test_clientPut(BaseTestClient): - - def XXXtestCHKPutDir_Success(self): - # request a arbitrary file - myIdentifier = self.client.chkPutDir( 'myDirectory' ) myRequest = self.client.getRequest(myIdentifier) @@ -2057,7 +1970,7 @@ self.sendResponseMessage( 'PutSuccessful', Identifier=myIdentifier, - URI='CHK@my-redirect-name' + URI=myKey ) self.assertHasNextEvent( @@ -2071,12 +1984,15 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) - self.failIf(requestsAll) - + self.failIf(requestsAll) + + + def test_putDir_Failure(self): + self.connectClient() - def XXXtestCHKPutDir_Failure(self): - # request a arbitrary file - myIdentifier = self.client.chkPutDir( + myKey = self.client.key.KSK('foo') + myIdentifier = self.client.putDir( + myKey, 'myDirectory' ) myRequest = self.client.getRequest(myIdentifier) @@ -2104,10 +2020,17 @@ self.assertHasNextMessage(None) self.failIf(requestsAll) - - def XXXtestCHKPutFile_Success(self): - # request a arbitrary file - myIdentifier = self.client.chkPutFile( +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putFile(BaseTestClient): + + def test_putFile_Success(self): + self.connectClient() + + myKey = self.client.key.KSK('foo') + myIdentifier = self.client.putFile( + myKey, 'myFile.txt' ) myRequest = self.client.getRequest(myIdentifier) @@ -2119,7 +2042,7 @@ self.sendResponseMessage( 'PutSuccessful', Identifier=myIdentifier, - URI='CHK@my-redirect-name' + URI=myKey ) self.assertHasNextEvent( @@ -2134,11 +2057,14 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.failIf(requestsAll) - + + + def test_putFile_Failure(self): + self.connectClient() - def XXXtestCHKPutFile_Failure(self): - # request a arbitrary file - myIdentifier = self.client.chkPutFile( + myKey = self.client.key.KSK('foo') + myIdentifier = self.client.putFile( + myKey, 'myFile.txt' ) myRequest = self.client.getRequest(myIdentifier) @@ -2164,11 +2090,14 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) - self.failIf(requestsAll) + self.failIf(requestsAll) - - - def XXXtestCHKPutMultiple_Success(self): +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putMultiple(BaseTestClient): + def test_putMultiple_Success(self): + self.connectClient() items = [ { @@ -2194,7 +2123,9 @@ ] # request a arbitrary file - myIdentifier = self.client.chkPutMultiple( + myKey = self.client.key.KSK('foo') + myIdentifier = self.client.putMultiple( + myKey, items ) myRequest = self.client.getRequest(myIdentifier) @@ -2229,7 +2160,7 @@ self.sendResponseMessage( 'PutSuccessful', Identifier=myIdentifier, - URI='CHK@my-redirect-name' + URI=myKey ) self.assertHasNextEvent( @@ -2243,11 +2174,11 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) - self.failIf(requestsAll) + self.failIf(requestsAll) - - def XXXtestCHKPutMultiple_ItemErrors(self): - + + def test_putMultiple_ItemErrors(self): + self.connectClient() # upload directory is not allowed items = [ @@ -2257,7 +2188,8 @@ 'Name': 'myItem0', }, ] - self.assertRaises(ValueError, self.client.chkPutMultiple, items) + myKey = self.client.key.KSK('foo') + self.assertRaises(ValueError, self.client.putMultiple, myKey, items) #TODO: how to test required params? # ...just some samples below @@ -2270,7 +2202,7 @@ 'Name': 'myItem0', }, ] - self.assertRaises(ValueError, self.client.chkPutMultiple, items) + self.assertRaises(ValueError, self.client.putMultiple, myKey, items) # param missing (we enforce all required parameters) items = [ @@ -2280,26 +2212,91 @@ #'Name': 'myItem0', }, ] - self.assertRaises(ValueError, self.client.chkPutMultiple, items) + self.assertRaises(ValueError, self.client.putMultiple, myKey, items) +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putRedirect(BaseTestClient): - # some sloppy tests for other key types - def testSSKPutData(self): - myIdentifier = self.client.chkPutData( - 'arbitrary data' + + def testPutRedirect_Success(self): + self.connectClient() + + # request a arbitrary file + myRedirect = self.client.key.KSK('foo') + myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData) + myIdentifier = self.client.putRedirect( + myRedirect, + myKey, ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(consts.Message.ClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myRedirect + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + consts.Message.ClientPut, + ('RequestStatus', consts.RequestStatus.Success | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) - + + def testPutRedirect_Failure(self): + self.connectClient() + + # request a arbitrary file + myRedirect = self.client.key.KSK('foo') + myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData) + myIdentifier = self.client.putRedirect( + myRedirect, + myKey, + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(consts.Message.ClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutFailed', + Identifier=myIdentifier, + Code='5', # rout not found + ) + + self.assertHasNextEvent( + self.client.events.RequestFailed, + consts.Message.ClientPut, + ('RequestStatus', consts.RequestStatus.Error | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) - - - #*********************************************************************************** # #*********************************************************************************** -class Test_requests(BaseTestClient): - - def test_3000_ModifyRequest_Persistent(self): +class Test_modifyRequest(BaseTestClient): + + def test_modifyRequest_Persistent(self): self.connectClient() @@ -2349,7 +2346,7 @@ self.failIf(requestsAll) - def test_3001_ModifyRequest_NonPersistent(self): + def test_modifyRequest_NonPersistent(self): self.connectClient() # request a arbitrary file @@ -2397,9 +2394,12 @@ del requestsAll[myIdentifier] self.failIf(requestsAll) +#*********************************************************************************** +# +#*********************************************************************************** +class Test_removeRequest(BaseTestClient): - - def test_3002_RemoveRequest(self): + def test_removeRequest(self): self.connectClient() # request a file @@ -2454,82 +2454,32 @@ self.assertHasNextMessage(None) self.failIf(requestsAll) - - def test_3005_ResendRequest_Persistent(self): - self.connectClient() - - myKey = self.client.key.key('KSK@foo') - myIdentifier = self.client.getData(myKey, persistence=consts.Persistence.Reboot) - myRequest = self.client.getRequest(myIdentifier) - requestsAll = self.client.getRequests() - self.assertHasNextMessage(consts.Message.ClientGet) - - newIdentifier = self.client.resendRequest(myRequest) - self.failIf(myIdentifier == newIdentifier) - self.failUnless(newIdentifier in requestsAll) - - # client should remove request from nodes queue - self.assertHasNextMessage( - consts.Message.RemoveRequest, - ('Identifier', myIdentifier) - ) - self.assertHasNextMessage( - consts.Message.ClientGet, - ('Identifier', newIdentifier) - ) - self.sendResponseMessage( - 'GetFailed', - Code='25', - Identifier=myIdentifier, - ) - - - - self.assertHasNextEvent( - self.client.events.RequestRemoved, - consts.Message.ClientGet, - ('RequestStatus', consts.RequestStatus.Removed | - consts.RequestStatus.RemovedFromQueue | - consts.RequestStatus.Completed - ), - ) - - self.failUnless(newIdentifier in requestsAll) - self.failIf(myIdentifier in requestsAll) - - del requestsAll[newIdentifier] - self.failIf(requestsAll) - - #*********************************************************************************** # #*********************************************************************************** #TODO: testRestoreClientPut and friends class Test_restoreRequests(BaseTestClient): - def test_4000_RestorePersistentGet_InvalidClientToken(self): + def test_restorePersistentGet_invalidClientToken(self): + self.connectClient() # throw an invalid PersistentRequest at the client myIdentifier = '123456789' - self.sendResponseMessage( - 'PersistentGet', - Identifier=myIdentifier, - Global='false', - ClientToken='i-am-invalid', - ReturnType='disk', - Verbosity='1', - PersistenceType='forever', - Started='false', - Global='false', - ) + self.assertRaises( + consts.MessageParseError, + self.sendResponseMessage, + 'PersistentGet', + Identifier=myIdentifier, + Global='false', + ClientToken='i-am-invalid', # me is invalid ...me! + ReturnType='disk', + Verbosity='1', + PersistenceType='forever', + Started='false', + Global='false', + ) - # the client should now to cancel the request - self.assertHasNextMessage( - consts.Message.RemovePersistentRequest, - ('Identifier', myIdentifier) - ) - requests = self.client.getRequests() self.failIf(requests) @@ -2538,11 +2488,13 @@ self.assertHasNextMessage(None) - def test_4001_RestorePersistentGet_ValidIdentifier(self): - + def test_restorePersistentGet_validIdentifier(self): + self.connectClient() + # we need a valid identifier to restore a request, so hack a bit + myKey = self.client.key.key('KSK@foo') myIdentifier = self.client.getFile( - 'arbitrary-uri', + myKey, 'arbitryry.txt' ) myRequest = self.client.getRequest(myIdentifier) @@ -2555,9 +2507,9 @@ 'PersistentRequestRemoved', Identifier=myIdentifier, ) - self.messages = [] - self.events = [] - + self.assertHasNextMessage(self.client.message.RemoveRequest.name) + self.assertHasNextEvent(self.client.events.RequestRemoved) + # throw a PersistentGet at the client with the identifier we hacked self.sendResponseMessage( 'PersistentGet', @@ -2591,10 +2543,9 @@ #TODO: testDDAReadDenied_ReadDissallowed #TODO: testDDAWriteDenied #TODO: testDDAWriteDenied_WriteDisallowed - class Test_DDA(BaseTestClient): - def test_5000_DDAWriteDenied(self): + def test_DDAWriteDenied(self): self.connectClient() # request a file @@ -2696,7 +2647,7 @@ #*********************************************************************************** class TestCollisions(BaseTestClient): - def test_6000_IdentifierCollision(self): + def test_identifierCollision(self): self.connectClient() # request a file @@ -2740,7 +2691,7 @@ self.failIf(requestsAll) - def test_6001_FilenameCollision_HandleRename(self): + def test_filenameCollision_HandleRename(self): self.connectClient() # request a file @@ -2796,7 +2747,7 @@ self.failIf(requestsAll) - def test_6002_FilenameCollision_HandleNever(self): + def test_filenameCollision_HandleNever(self): self.connectClient() # request a file @@ -2848,113 +2799,6 @@ #*********************************************************************************** # #*********************************************************************************** -#TODO: some tests not yet implemented -class Test_resendRequests(BaseTestClient): - - def test_resend_CHK(self): - myKey = 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo' - msg = message.ClientPut( - URI=myKey, - Persistence=consts.Persistence.Connection, - ) - self.client._registerRequest(msg, consts.RequestType.PutData) - myIdentifier = msg['Identifier'] - requestsAll = self.client.getRequests() - - newIdentifier = self.client.resendRequest(msg) - - self.failIf(myIdentifier in requestsAll) - self.failUnless(newIdentifier in requestsAll) - - self.assertHasNextMessage( - consts.Message.ClientPut, - ('URI', 'CHK@') - ) - - def test_resend_SSK(self): - myKey = 'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA' - msg = message.ClientPut( - URI=myKey + '/foo', - Persistence=consts.Persistence.Connection, - ) - self.client._registerRequest(msg, consts.RequestType.PutData) - msg['PrivateKey'] = myKey - myIdentifier = msg['Identifier'] - requestsAll = self.client.getRequests() - - newIdentifier = self.client.resendRequest(msg) - - self.failIf(myIdentifier in requestsAll) - self.failUnless(newIdentifier in requestsAll) - - self.assertHasNextMessage( - consts.Message.ClientPut, - ('URI', myKey + '/foo') - ) - - - def test_resend_USK(self): - myKey = 'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA' - msg = message.ClientPut( - URI=myKey + '/foo/0', - Persistence=consts.Persistence.Connection, - ) - self.client._registerRequest(msg, consts.RequestType.PutData) - msg['PrivateKey'] = myKey - myIdentifier = msg['Identifier'] - requestsAll = self.client.getRequests() - - newIdentifier = self.client.resendRequest(msg) - - self.failIf(myIdentifier in requestsAll) - self.failUnless(newIdentifier in requestsAll) - - self.assertHasNextMessage( - consts.Message.ClientPut, - ('URI', myKey + '/foo') - ) - - def test_resend_KSK(self): - myKey = 'KSK@abs' - msg = message.ClientPut( - URI=myKey, - Persistence=consts.Persistence.Connection, - ) - self.client._registerRequest(msg, consts.RequestType.PutData) - msg['PrivateKey'] = myKey - myIdentifier = msg['Identifier'] - requestsAll = self.client.getRequests() - - newIdentifier = self.client.resendRequest(msg) - - self.failIf(myIdentifier in requestsAll) - self.failUnless(newIdentifier in requestsAll) - - self.assertHasNextMessage( - consts.Message.ClientPut, - ('URI', myKey) - ) - - - - def test_resend_getKeyInfo(self): - pass - - def test_resend_getData(self): - pass - - def test_resend_getFile(self): - pass - - def test_resend_getFile(self): - pass - - def test_resend_unsupportedRequest(self): - pass - -#*********************************************************************************** -# -#*********************************************************************************** class Test_plugins(BaseTestClient): @@ -3136,11 +2980,7 @@ self.assertHasNextMessage(None) self.failIf(requestsAll) - #*********************************************************************************** -#TODO: class TestConfig(BaseTestConnectedClient): - -#*********************************************************************************** # #*********************************************************************************** class Test_generateKeypair(BaseTestClient): @@ -3166,8 +3006,8 @@ self.client.events.KeypairGenerated, consts.Message.GenerateSSK, ('Identifier', myIdentifier), - ('PublicKey',pub), - ('PrivateKey',priv), + ('RequestURI',pub), + ('InsertURI',priv), ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | consts.RequestStatus.Completed @@ -3204,8 +3044,8 @@ self.client.events.KeypairGenerated, consts.Message.GenerateSSK, ('Identifier', myIdentifier), - ('PublicKey',pub), - ('PrivateKey',priv), + ('RequestURI',pub), + ('InsertURI',priv), ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | consts.RequestStatus.Completed @@ -3289,16 +3129,15 @@ Test_getKeyInfo, Test_putData, + Test_putDir, + Test_putFile, + Test_putMultiple, Test_putRedirect, + + Test_modifyRequest, + Test_removeRequest, - #Test_putData, - #Test_clientPut, - - #Test_clientGet, - - Test_requests, - #Test_restoreRequests, - #Test_resendRequests, + Test_restoreRequests, Test_DDA, TestCollisions, Test_plugins, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-30 08:58:05
|
Revision: 434 http://fclient.svn.sourceforge.net/fclient/?rev=434&view=rev Author: jUrner Date: 2008-06-30 01:57:58 -0700 (Mon, 30 Jun 2008) Log Message: ----------- removed some leftover code ++ beautifications Modified Paths: -------------- trunk/sandbox/fcp2/message.py Modified: trunk/sandbox/fcp2/message.py =================================================================== --- trunk/sandbox/fcp2/message.py 2008-06-30 08:57:07 UTC (rev 433) +++ trunk/sandbox/fcp2/message.py 2008-06-30 08:57:58 UTC (rev 434) @@ -218,7 +218,7 @@ # param types for config message # # ..bit more efford here, cos we need types for user input checking -# ...a slpoppy implementation of a dict should be enough +# ...a sloppy implementation of a dict should be enough # #*************************************************************************************** class _ConfigMessageParamTypes(object): @@ -415,8 +415,12 @@ raise ValueError('Unknown param class in: %r' % paramName) ConfigMessageParamTypes = _ConfigMessageParamTypes() + #******************************************************************************** -# equipment for messages with persustent params and additional params +# equipp Get / Put messages with some persistent params +# +# these params are stored in ClientToken +# #******************************************************************************** class PeristentParamsGet(pmstruct.PoorMansStruct): _fields_ = ( @@ -427,62 +431,13 @@ PeristentParamsPut = PeristentParamsGet - -class PersistentParams(object): - - def __init__(self, mapping): - self.mapping = mapping - - def fromString(self, string): - pass - - - -PeerMessageParamTypes = { - 'ark.number': types.FcpTypeInt, - 'auth.negTypes': types.FcpTypeInt, - - 'location': types.FcpTypeFloat, - 'opennet': types.FcpTypeBool, - 'testnet': types.FcpTypeBool, - - 'metadata.timeLastConnected': types.FcpTypeTime, - 'metadata.timeLastReceivedPacket': types.FcpTypeTime, - 'metadata.timeLastRoutable': types.FcpTypeTime, - 'metadata.timeLastSuccess': types.FcpTypeTime, - 'metadata.routableConnectionCheckCount': types.FcpTypeInt, - 'metadata.hadRoutableConnectionCount': types.FcpTypeInt, - - 'volatile.averagePingTime': types.FcpTypeFloat, - 'volatile.overloadProbability': types.FcpTypePercent, - 'volatile.routingBackoff': types.FcpTypeInt, - 'volatile.routingBackoffPercent': types.FcpTypePercent, - 'volatile.totalBytesIn': types.FcpTypeInt, - 'volatile.totalBytesOut': types.FcpTypeInt, - 'volatile.routingBackoffLength': types.FcpTypeInt, - } - -'''all other Peer message params here.... - ->> identity=YIrE.................. ->> lastGoodVersion=Fred,0.7,1.0,1106 ->> physical.udp=00.000.000.000:00000 ->> version=Fred,0.7,1.0,1107 ->> dsaGroup.q=ALFDN............... ->> dsaGroup.p=AIYIrE.................. ->> dsaPubKey.y=YSlb............ ->> dsaGroup.g=UaRa............... ->> ark.pubURI=SSK@...................... ->> ->> metadata.detected.udp=000.000.000.000:00000 - ->> volatile.lastRoutingBackoffReason=ForwardRejectedOverload ->> volatile.percentTimeRoutableConnection=99.4735................. ->> volatile.status=CONNECTED - -''' - - +#******************************************************************************** +# at runtime we store a few additional params in msg.params +# +# for uniformity reasons we store them in msg.params and mark them +# as private so they don't get send to the node +# +#******************************************************************************** AdditionalGetParams = { # persistent params that will go into identifier @@ -496,12 +451,8 @@ PrivateParam('ErrorMessage'): None, # error message in case an error occured PrivateParam('UserData'): None, # any user defined runtime data here - # params for SSKKeypair - PrivateParam('PrivateParamKey'): None, - PrivateParam('PublicKey'): None, - # params from DataFound - PrivateParam('MetadataContentType'): '', # contecnt type + PrivateParam('MetadataContentType'): '', # content type PrivateParam('MetadataSize'): 0, # content size # params from PersistentRequestModified @@ -533,10 +484,6 @@ PrivateParam('ErrorMessage'): None, # error message in case an error occured PrivateParam('UserData'): None, # any user defined runtime data here - # params for SSKKeypair - PrivateParam('PrivateParamKey'): None, - PrivateParam('PublicKey'): None, - # params from DataFound PrivateParam('MetadataContentType'): '', # contecnt type PrivateParam('MetadataSize'): 0, # content size @@ -559,8 +506,6 @@ PrivateParam('RequestType'): consts.RequestType.Null, # identifies sub message types PrivateParam('RequestStatus'): consts.RequestStatus.Null, PrivateParam('InitTime'): 0, # when was the request started? - PrivateParam('PrivateKey'): None, - PrivateParam('PublicKey'): None, } AdditionalSubscribeUSKParams = { @@ -614,7 +559,7 @@ #******************************************************************************** # #******************************************************************************** -#TODO: register new message type? +#TODO: do we need this? def newMessageType(name, paramTypes=None, additionalParams=None, persistentParams=None): kws = { 'name': name, @@ -624,11 +569,8 @@ } return type(name, (MessageBase, ), kws) - -#TODO: _persistent_params_ ...define in all message classes or not? Bogus for most, -# but makes customization of individual classes harder for useres #******************************************************************************** -# some additional messages we define for uniformity +# some messages defined by the client #******************************************************************************** class ClientDisconnected(MessageBase): name = consts.Message.ClientDisconnected @@ -651,12 +593,54 @@ } #******************************************************************************** -# +# fcp messages #******************************************************************************** class AddPeer(MessageBase): name = consts.Message.AddPeer _additional_params_ = {} - _param_types_ = PeerMessageParamTypes + _param_types_ = { + 'ark.number': types.FcpTypeInt, + 'auth.negTypes': types.FcpTypeInt, + 'ark.pubURI': key.FcpTypeKey, + + 'location': types.FcpTypeFloat, + 'opennet': types.FcpTypeBool, + 'testnet': types.FcpTypeBool, + + # passed in Peer message + 'metadata.timeLastConnected': types.FcpTypeTime, + 'metadata.timeLastReceivedPacket': types.FcpTypeTime, + 'metadata.timeLastRoutable': types.FcpTypeTime, + 'metadata.timeLastSuccess': types.FcpTypeTime, + 'metadata.routableConnectionCheckCount': types.FcpTypeInt, + 'metadata.hadRoutableConnectionCount': types.FcpTypeInt, + + 'volatile.averagePingTime': types.FcpTypeFloat, + 'volatile.overloadProbability': types.FcpTypePercent, + 'volatile.routingBackoff': types.FcpTypeInt, + 'volatile.routingBackoffPercent': types.FcpTypePercent, + 'volatile.totalBytesIn': types.FcpTypeInt, + 'volatile.totalBytesOut': types.FcpTypeInt, + 'volatile.routingBackoffLength': types.FcpTypeInt, + } + +'''all other Peer message params here.... + +>> identity=YIrE.................. +>> lastGoodVersion=Fred,0.7,1.0,1106 +>> physical.udp=00.000.000.000:00000 +>> version=Fred,0.7,1.0,1107 +>> dsaGroup.q=ALFDN............... +>> dsaGroup.p=AIYIrE.................. +>> dsaPubKey.y=YSlb............ +>> dsaGroup.g=UaRa............... +>> +>> metadata.detected.udp=000.000.000.000:00000 + +>> volatile.lastRoutingBackoffReason=ForwardRejectedOverload +>> volatile.percentTimeRoutableConnection=99.4735................. +>> volatile.status=CONNECTED +''' class AllData(MessageBase): @@ -1103,7 +1087,7 @@ class Peer(MessageBase): name = consts.Message.Peer _additional_params_ = {} - _param_types_ = PeerMessageParamTypes + _param_types_ = AddPeer._param_types_ class PeerNote(MessageBase): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-30 08:57:01
|
Revision: 433 http://fclient.svn.sourceforge.net/fclient/?rev=433&view=rev Author: jUrner Date: 2008-06-30 01:57:07 -0700 (Mon, 30 Jun 2008) Log Message: ----------- typo Modified Paths: -------------- trunk/sandbox/fcp2/scripts/gen_docs.py Modified: trunk/sandbox/fcp2/scripts/gen_docs.py =================================================================== --- trunk/sandbox/fcp2/scripts/gen_docs.py 2008-06-30 08:56:39 UTC (rev 432) +++ trunk/sandbox/fcp2/scripts/gen_docs.py 2008-06-30 08:57:07 UTC (rev 433) @@ -27,7 +27,7 @@ if not os.path.isdir(directory): os.makedirs(directory) -def enshure_doc_dir_dxists(): +def enshure_doc_dir_exists(): """enshures epydoc docdir exists""" save_create_dir(EPYDOC_DIR) @@ -43,7 +43,7 @@ def main(): """""" pprint('dumping docs to:', EPYDOC_DIR) - enshure_doc_dir_dxists() + enshure_doc_dir_exists() pprint('calling epydoc') sys.argv = [ __file__, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-30 08:56:40
|
Revision: 432 http://fclient.svn.sourceforge.net/fclient/?rev=432&view=rev Author: jUrner Date: 2008-06-30 01:56:39 -0700 (Mon, 30 Jun 2008) Log Message: ----------- all methods now have a test case ++ some fixes Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-06-30 08:55:28 UTC (rev 431) +++ trunk/sandbox/fcp2/client.py 2008-06-30 08:56:39 UTC (rev 432) @@ -431,7 +431,6 @@ ## connection related methods ## ############################################################### - #TESTED def close(self): """Closes the client @note: make shure to call close() when done with the client @@ -441,7 +440,7 @@ ) self._close(msg) - #TESTED + def closeNode(self): """Shuts down the freenet node""" self.sendMessage(message.Shutdown()) @@ -461,7 +460,7 @@ pass return nodeHello - #TESTED + def isOpen(self): """Checks if the clients connection is open @return: (bool) True if so, False otherwise @@ -469,7 +468,7 @@ return self.ioHandler.isOpen() - #TESTED + def iterConnect(self, host=DefaultFcpHost, port=DefaultFcpPort, duration=20, timeout=0.5): """Iterator to stablish a connection to a freenet node @param host: (str) host of th node @@ -532,14 +531,14 @@ self._close(disconnectMsg) raise StopIteration - #TESTED + def getConnectionName(self): """Returns the connection name used by the client @return: (str) connection name """ return self._connectionName - #TESTED + def setConnectionName(self, connectionName=None): """Sets the connection name to be used by the client @param connectionName: (str) connection name or None to use an arbitrary connection name @@ -548,7 +547,7 @@ self._connectionName = self._newUuid() if connectionName is None else connectionName return self._connectionName - #TESTED + def getDebugVerbosity(self): """Returns the current verbosity level of the client @return: L{consts.DebugVerbosity} @@ -556,7 +555,7 @@ return consts.Logger.Client.getEffectiveLevel() - #TESTED + def setDebugVerbosity(self, debugVerbosity): """Sets the verbosity level of the client @param debugVerbosity: L{consts.DebugVerbosity} @@ -564,7 +563,7 @@ consts.Logger.Client.setLevel(debugVerbosity) - #TESTED + def startNode(self, cmdline): """Starts the freenet node @param cmdline: commandline to start freenet (like '/freenet/run.sh start' or 'c:\freenet\start.bat') @@ -581,7 +580,7 @@ stdout, stderr = p.communicate() return stdout - #TESTED + def versionCheckNodeHello(self, nodeHelloMessage): """Performa a version check of the client against the specified NodeHello message @return: (bool) True if version is ok, False otherwise @@ -598,7 +597,6 @@ ## runtime related methods ## ######################################################### - #TESTED def handleMessage(self, msg): """Handles a message from the freenet node @param msg: (Message) to handle @@ -952,19 +950,16 @@ self.events.RequestModified(initialRequest) return True - - # don't handle PersistentRequestRemoved. instead we handle it in Get/PutFailed - # ??? why ??? - # - #elif msg == message.PersistentRequestRemoved: - # if initialRequest is None: - # return False + #NOTE: fcp sends a GetFailed / PutFailed if the request was still running (code=canceled) + elif msg == message.PersistentRequestRemoved: + if initialRequest is None: + return False - # initialRequest['RequestStatus'] |= consts.RequestStatus.Removed - # self._finalizeRequest(msg, initialRequest, self.events.RequestRemoved) - # return True - - + initialRequest['RequestStatus'] |= consts.RequestStatus.Removed | consts.RequestStatus.Completed | consts.RequestStatus.RemovedFromQueue + del self._requests[requestIdentifier] + self.events.RequestRemoved(initialRequest) + return True + elif msg == message.SimpleProgress: if initialRequest is None: return False @@ -1103,16 +1098,14 @@ if initialRequest is None: return False - #TODO:no idea if the node may pass uris with prefixes like 'freenet:'... strip it anyways insertURI = msg['InsertURI'] requestURI = msg['RequestURI'] if initialRequest['RequestType'] == consts.RequestType.GenerateUSKKeypair: insertURI = key.USK(insertURI.keyData, filename=insertURI.filename) requestURI = key.USK(requestURI.keyData, filename=requestURI.filename) - - initialRequest['PrivateKey'] = insertURI - initialRequest['PublicKey'] = requestURI + initialRequest['InsertURI'] = insertURI + initialRequest['RequestURI'] = requestURI initialRequest['RequestStatus'] |= consts.RequestStatus.Success self._finalizeRequest(msg, initialRequest, self.events.KeypairGenerated) return True @@ -1129,7 +1122,7 @@ # default return False - #TESTED + def next(self, dispatch=True): """Pumps the next message waiting @param dispatch: if True the message is dispatched to L{handleMessage} @@ -1153,7 +1146,7 @@ self.handleMessage(msg) return msg - #TESTED + def run(self): """Runs the client unconditionally untill all requests have completed @note: a KeyboardInterrupt will stop the client @@ -1196,7 +1189,7 @@ if msg == message.ClientSocketDied: break - #TESTED + def sendMessage(self, msg): """Sends a message to freenet @param msg: (L{message.Message}) message to send @@ -1225,7 +1218,6 @@ ## config related methods ## ######################################################### - #TESTED def getConfig(self, withCurrent=True, withDefaults=True, @@ -1253,7 +1245,7 @@ ) - #TESTED + def modifyConfig(self, params): """Modifies node configuration values @param params: (dict) containing parameters to modify @@ -1268,7 +1260,7 @@ ## ######################################################## def clientGet(self, - key, + uri, requestType, userData, persistentUserData, @@ -1276,7 +1268,7 @@ **messageParams ): """Requests a key from the node - @param key: (L{key.KeyBase}) key to request + @param uri: (L{key.KeyBase}) key to request @param requestType: (L{consts.RequestType}) sub type of the message @param userData: any non persistent data to associate to the request or None @param persistentUserData: any string to associate to the request as persistent data or None @@ -1286,7 +1278,7 @@ @return: (str) request identifier """ - msg = message.ClientGet(URI=key) + msg = message.ClientGet(URI=uri) for paramName, value in messageParams.items(): if value is not None: msg[paramName] = value @@ -1302,9 +1294,9 @@ return msg['Identifier'] - #TESTED + def getData(self, - key, + uri, allowedMimeTypes=None, binaryBlob=False, @@ -1320,7 +1312,7 @@ ): """Requests datae from the node - @param key: (L{key.KeyBase}) key to request + @param uri: (L{key.KeyBase}) key to request @param allowedMimeTypes: (str) list of allowed mime types @param binaryBlob: (bool) if True, the file is retrieved as binary blob file @@ -1346,7 +1338,7 @@ as soon as it completes or failes """ return self.clientGet( - key, + uri, consts.RequestType.GetData, userData, persistentUserData, @@ -1368,9 +1360,9 @@ ) - #TESTED + def getFile(self, - key, + uri, filename, allowedMimeTypes=None, @@ -1388,7 +1380,7 @@ ): """Requests a file from the node - @param key: (L{key.KeyBase}) key to request + @param uri: (L{key.KeyBase}) key to request @param filename: (full path) filename to store the file to @param allowedMimeTypes: (str) list of allowed mime types @@ -1415,7 +1407,7 @@ as soon as it completes or failes """ return self.clientGet( - key, + uri, consts.RequestType.GetFile, userData, persistentUserData, @@ -1438,9 +1430,9 @@ ) - #TESTED + def getKeyInfo(self, - key, + uri, dsOnly=False, ignoreDS=False, @@ -1453,7 +1445,7 @@ ): """Requests info about a key - @param key: (L{key.KeyBase}) key to request + @param uri: (L{key.KeyBase}) key to request @param dsOnly: if True, retrieves the file from the local data store only @param ignoreDS: If True, ignores the local data store @@ -1476,7 +1468,7 @@ """ # how to retrieve meta info about a key? ...idea is to provoke a GetFailed (TooBig) return self.clientGet( - key, + uri, consts.RequestType.GetKeyInfo, userData, persistentUserData, @@ -1496,8 +1488,8 @@ ) - #TESTED - def subscribeUSK(self, key, dontPoll=True): + + def subscribeUSK(self, uri, dontPoll=True): """Asks the node to notify the client when an USK is updated @param key: (L{key.USK}) key to subscribe to @param dontPoll: if True, does whatever ??? @@ -1509,7 +1501,7 @@ @todo: looks like USK subscribes will persist untill connection is closed. Can they be removed somehow? """ msg = message.SubscribeUSK( - URI=key, + URI=uri, DontPoll=dontPoll, ) self._registerRequest(msg, consts.RequestType.SubscribeUSK) @@ -1525,7 +1517,7 @@ ######################################################## def clientPut(self, requestType, - key, + uri, userData, persistentUserData, data=None, @@ -1534,7 +1526,7 @@ ): """Uploads to the node @param requestType: (L{consts.RequestType}). Can be PutData, PutDir or PutMultiple - @param key: (str) key or Uri + @param uri: (str) key or Uri @param data: (str) for L{consts.RequestType.PutData} data to upload or None @param persistentUserData: (str) persistent data to be assosiated to the request @param userData: (any) any data to be associated to the request at runtime @@ -1571,12 +1563,12 @@ msgClass = message.ClientPutComplexDir else: raise ValueError('Unsupported request type') - msg = msgClass(URI=key) + msg = msgClass(URI=uri) # add params - if key.KeyType == consts.KeyType.CHK: - if key.filename is not None: - msg['TargetFilename'] = key.filename + if uri.KeyType == consts.KeyType.CHK: + if uri.filename is not None: + msg['TargetFilename'] = uri.filename for param, value in msgParams.items(): if value is not None: msg[param] = value @@ -1664,9 +1656,9 @@ self.sendMessage(msg) return msg['Identifier'] - #TESTED + def putData(self, - key, + uri, data, contentType=None, @@ -1680,7 +1672,7 @@ ): """Uploads data - @param key: (L{key.KeyBase}) key under wich to upload the data + @param uri: (L{key.KeyBase}) key under wich to upload the data @param data: (bytes) data to upload @param contentType: (str) content type. If not specified, the node will guess the content type @@ -1695,7 +1687,7 @@ @event: (L{events.Events.RequestFailed}) triggered when the request failes @event: (L{events.Events.RequestFetchable}) triggered as soon as the request is fetchable @event: (L{events.Events.RequestCompressionStarted}) triggered when the request is about to be compressed - @event: (L{events.Events.RequestCompressionComopleted}) triggered as soon as compressing of the request is completed + @event: (L{events.Events.RequestCompressionCompleted}) triggered as soon as compressing of the request is completed @note: if the upload is successful the node will create a L{consts.KeyType.CHK} key under wich the data can be retreieved. The key can be accessed as 'URI' member of the request as soon @@ -1706,7 +1698,7 @@ """ return self.clientPut( consts.RequestType.PutData, - key, + uri, userData, persistentUserData, data=data, @@ -1726,114 +1718,15 @@ Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, ) - #TESTED - def putRedirect(self, - key, - targetKey, - maxRetries=None, - persistence=consts.Persistence.Connection, - priorityClass=consts.Priority.Medium, - userData=None, - persistentUserData='', - ): - """Uploads a redirect to another key - @param key: (L{key.KSK}) to insert as redirect - @param targetKey: (key.KeyBase) key to redirect to - @param maxRetries: (int) maximum number of tretries or -1 to leave the decission up to the node - @param persistence: (L{consts.Persistence}) of the request - @param priorityClass: (L{consts.Priority}) priority of the request - @param persistentUserData: (str) persistent data to be assosiated to the request - @param userData: (any) any data to be associated to the request at runtime - @return: (str) request identifier - """ - return self.clientPut( - consts.RequestType.PutRedirect, - key, - userData, - persistentUserData, - Persistence=persistence, - PriorityClass=priorityClass, - TargetURI=targetKey, - UploadFrom=consts.UploadFrom.Redirect, - ) - ######################################################### - ######################################################### - ######################################################### - ######################################################### - ######################################################### - - #CHK - def chkPutData(self, - data, - - contentType=None, - dontCompress=None, - maxRetries=None, - persistence=consts.Persistence.Connection, - priorityClass=consts.Priority.Medium, - targetFilename=None, - - userData=None, - persistentUserData='', - ): - """Uploads data - @param data: (bytes) data to upload - - @param contentType: (str) content type. If not specified, the node will guess the content type - @param dontCompress: (bool) if True, the node won't try to compress the data - @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide - @param priorityClass: (L{consts.Priority}) priority of the request - @param targetFilename: (str) filename to append to the key (may not contain slashes) - - @param userData: any non persistent data to associate to the request - @param persistentUserData: any string to associate to the request as persistent data - - @event: (L{events.Events.RequestCompleted}) triggered when the request is complete - @event: (L{events.Events.RequestFailed}) triggered when the request failes - @event: (L{events.Events.RequestFetchable}) triggered as soon as the request is fetchable - @event: (L{events.Events.RequestCompressionStarted}) triggered when the request is about to be compressed - @event: (L{events.Events.RequestCompressionComopleted}) triggered as soon as compressing of the request is completed - - @note: if the upload is successful the node will create a L{consts.KeyType.CHK} key under wich - the data can be retreieved. The key can be accessed as 'URI' member of the request as soon - as the L{events.Events.RequestFetchable} or the L{events.Events.RequestCompleted} event - is triggered. - - @todo: EarlyEncode and GetCHKOnly message params not implemented - """ - return self.clientPut( - consts.RequestType.PutData, - consts.KeyType.CHK, - - data=data, - persistentUserData=persistentUserData, - userData=userData, - - # fcp params - ContentType=contentType, - DataLength=len(data), - #EarlyEncode='false', - #GetCHKOnly='false', - Global=False, - Identifier=None, - MaxRetries=maxRetries, - DontCompress=dontCompress, - Persistence=persistence, - PriorityClass=priorityClass, - TargetFilename=targetFilename, - UploadFrom=consts.UploadFrom.Direct, - Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, - ) - - - def chkPutDir(self, + def putDir(self, + uri, directory, allowUnreadableFiles=False, - + defaultName=None, contentType=None, + dontCompress=None, - defaultName=None, maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, @@ -1845,11 +1738,14 @@ ): """Uploads the contents of a directory + @param uri: (L{key.KeyBase}) key under wich to upload the directory @param directory: (str) directory to upload @param allowUnreadableFiles: if True, unreadable files in the directory are ignored, if False the request fails - if it encounters an unreadavle file. + if it encounters an unreadavle file + @param defaultName: name of the directory item that should be displayed when accessing the directory + without any filename appended to the uri - @note: for other params see L{chkPutData} + @note: for other params see L{putData} @note: once uploaded, items of the directory can be accessed under Key/MyItemName/MyItemSubname @todo: EarlyEncode and GetCHKOnly message params not implemented @@ -1857,18 +1753,15 @@ """ return self.clientPut( consts.RequestType.PutDir, - consts.KeyType.CHK, - - data=None, - persistentUserData=persistentUserData, - userData=userData, - + uri, + userData, + persistentUserData, + # fcp params - Filename=directory, - AllowUnreadableFiles=allowUnreadableFiles, ContentType=contentType, DefaultName=defaultName, #EarlyEncode='false', + Filename=directory, #GetCHKOnly='false', Global=False, Identifier=None, @@ -1876,44 +1769,42 @@ DontCompress=dontCompress, Persistence=persistence, PriorityClass=priorityClass, - TargetFilename=targetFilename, UploadFrom=consts.UploadFrom.Disk, Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, ) - - def chkPutFile(self, + + def putFile(self, + uri, filename, contentType=None, dontCompress=None, maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, - targetFilename=None, - + userData=None, persistentUserData='', ): """Uploads a file - @param filename: (bytes) data to upload + @param uri: (L{key.KeyBase}) key under wich to upload the file + @param filename: (str) file to upload - @note: for other params see L{chkPutData} + @note: for other params see L{putData} @todo: EarlyEncode and GetCHKOnly message params not implemented """ return self.clientPut( consts.RequestType.PutFile, - consts.KeyType.CHK, - - data=None, - persistentUserData=persistentUserData, - userData=userData, - + uri, + userData, + persistentUserData, + # fcp params - Filename=filename, ContentType=contentType, - #EarlyEncode='false', + #EarlyEncode='false', + Filename=filename, #GetCHKOnly='false', Global=False, Identifier=None, @@ -1921,18 +1812,14 @@ DontCompress=dontCompress, Persistence=persistence, PriorityClass=priorityClass, - TargetFilename=targetFilename, UploadFrom=consts.UploadFrom.Disk, Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, ) - - - def chkPutMultiple(self, + def putMultiple(self, + uri, items, - allowUnreadableFiles=False, - contentType=None, defaultName=None, dontCompress=None, maxRetries=None, @@ -1946,9 +1833,10 @@ ): """Uploads multiple items at once to be retrievable under one key + @param uri: (L{key.KeyBase}) key under wich to upload the file @param items: (list) list of items to upload - @note: for other params see L{chkPutData} + @note: for other params see L{chkPutDir} @note: to upload multiple items at once pass a dict for each item containig the following members: - RequestType: L{consts.RequestType.PutData}, L{consts.RequestType.PutFile} or L{consts.RequestType.PutRedirect} @@ -1966,16 +1854,12 @@ """ return self.clientPut( consts.RequestType.PutMultiple, - consts.KeyType.CHK, - - data=None, - persistentUserData=persistentUserData, - userData=userData, + uri, + userData, + persistentUserData, items=items, - + # fcp params - AllowUnreadableFiles=allowUnreadableFiles, - ContentType=contentType, DefaultName=defaultName, #EarlyEncode='false', #GetCHKOnly='false', @@ -1985,132 +1869,42 @@ DontCompress=dontCompress, Persistence=persistence, PriorityClass=priorityClass, - TargetFilename=targetFilename, UploadFrom=consts.UploadFrom.Disk, Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, ) - ######################################################## - ## - ## SSK ClientPut related methods - ## - ######################################################## - def sskPutData(self, - data, - privateKey, - - contentType=None, - dontCompress=None, - maxRetries=None, - persistence=consts.Persistence.Connection, - priorityClass=consts.Priority.Medium, - targetFilename=None, - - userData=None, - persistentUserData='', - ): - """Uploads data that can be updated by the owner - @param data: (bytes) data to upload - @param privateKey: see: private key as generated by L{generateKeypair} + '/' + name - - @note: for other params see L{chkPutData} - @note: use this method to upload updatable data. First you need to create a public / private - keypair. The private key is used for uploading, the public key for retrieving the data. - You should add a name to the keypairs like: "privateKey/MyData" and "publicKey/MyData". - This may aswell be used to implement a basic edition scheme: "privateKey/MyEdition-0", - "privateKey/MyEdition-1" - """ - return self.clientPut( - consts.RequestType.PutData, - privateKey, - - data=data, - persistentUserData=persistentUserData, - userData=userData, - - # fcp params - ContentType=contentType, - DataLength=len(data), - - #EarlyEncode='false', - #GetCHKOnly='false', - Global=False, - Identifier=None, - MaxRetries=maxRetries, - DontCompress=dontCompress, - Persistence=persistence, - PriorityClass=priorityClass, - UploadFrom=consts.UploadFrom.Direct, - Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, - ) - - def sskPutDir(self): - pass - def sskPutFile(self): - pass - - def sskPutMultiple(self): - pass - - ######################################################## - ## - ## USK ClientPut related methods - ## - ######################################################## - def uskPutData(self, - data, - privateKey, - - contentType=None, - dontCompress=None, + def putRedirect(self, + uri, + targetKey, maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, - targetFilename=None, - userData=None, - persistentUserData='' + persistentUserData='', ): - """Uploads data - + """Uploads a redirect to another key + @param uri: (L{key.KSK}) to insert as redirect + @param targetKey: (key.KeyBase) key to redirect to + @param maxRetries: (int) maximum number of tretries or -1 to leave the decission up to the node + @param persistence: (L{consts.Persistence}) of the request + @param priorityClass: (L{consts.Priority}) priority of the request + @param persistentUserData: (str) persistent data to be assosiated to the request + @param userData: (any) any data to be associated to the request at runtime + @return: (str) request identifier """ - - return self.clientPut( - consts.RequestType.PutData, - privateKey, - #insertURI + 'foo/0/', - userData=userData, - persistentUserData=persistentUserData, - data=data, - - # fcp params - ContentType=contentType, - DataLength=len(data), - #EarlyEncode='false', - #GetCHKOnly='false', - Global=False, - Identifier=None, - MaxRetries=maxRetries, - DontCompress=dontCompress, - Persistence=persistence, - TargetFilename=targetFilename, - UploadFrom=consts.UploadFrom.Direct, - Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, - ) - - def uskPutDir(self): - pass + consts.RequestType.PutRedirect, + uri, + userData, + persistentUserData, + Persistence=persistence, + PriorityClass=priorityClass, + TargetURI=targetKey, + UploadFrom=consts.UploadFrom.Redirect, + ) - def uskPutFile(self): - pass - - - def uskPutMultiple(self): - pass - ######################################################## ## ## request related methods @@ -2198,66 +1992,6 @@ del self._requests[requestIdentifier] - def resendRequest(self, request): - """Resends a request - @param request: (L{message.Message}) - @return: (str) request identifier - - @note: you can use this method to resend get / put requests.All attempts to resend other requests - will fail - @note: actually a new request is created and registered. Todo so, the request passed is copied. If it is a persistent - request, it will be removed. The new request will have FcInitTime reset and FcUserData amd FcPersistentUserData - taken over from the old request - - @note: for SSK and USK puts, the private key is taken from request['PrivateKey']. Adjust private (and public - key) if necessary - - @todo: reset init time or not? Currently it is not reset. - """ - requestType = request.get('RequestType', consts.RequestType.Null) - if not requestType & (consts.RequestType.MaskGet | consts.RequestType.MaskPut): - raise ValueError('Can not resend request: %s' % request.name) - - # we don't know what UserData may be, so back it up before copying - oldIdentifier = request['Identifier'] - oldUserData, request['UserData'] = request['UserData'], None - newRequest = copy.deepcopy(request) - - # reset key if necessary - if requestType & consts.RequestType.MaskPut: - requestKey = key.KeyBase.fcpToPython(request['URI']) - if requestKey is None: - raise ValueError('Ups, URI of the request seems not to be valid') - - if requestKey.KeyType == consts.KeyType.CHK: - newRequest['URI'] = consts.KeyType.CHK - elif requestKey.KeyType == consts.KeyType.SSK: - newRequest['URI'] = request['PrivateKey'] - if requestKey.filename: - newRequest['URI'] += '/' + requestKey.filename - elif requestKey.KeyType == consts.KeyType.USK: - newRequest['URI'] = request['PrivateKey'] - if requestKey.filename: - newRequest['URI'] += '/' + requestKey.filename - - - filenameCollision = newRequest.get('FilenameCollision', None) - self._registerRequest( - newRequest, - requestType, - filenameCollision= None if filenameCollision is None else filenameCollision & consts.FilenameCollision.MaskHandle, - #initTime=time.time(), - persistentUserData=newRequest['PersistentUserData'], - userData=oldUserData, - ) - - if oldIdentifier in self._requests: - request['UserData'] = oldUserData - self.removeRequest(request['Identifier']) - - self.sendMessage(newRequest) - return newRequest['Identifier'] - ######################################################## ## ## Peer related methods @@ -2402,7 +2136,7 @@ @return: (L{message.FCPPluginMessage}) @note: the client does not keep track of messages send to a plugin, because the plugin - may or may not return. If the plugin sends a reply, a L{events.PluginMessage} is triggered. + may or may not return. If the plugin sends a reply, a L{events.Events.PluginMessage} is triggered. If something goes wrong, L{events.Events.ProtocolError} or an is L{events.Events.IdentifierCollision} is triggered. Use the identifier passed to identify responses. @@ -2434,7 +2168,7 @@ @event: L{events.Events.KeypairGenerated} triggered as soon as the request is complete """ if keypairType not in (consts.KeyType.SSK, consts.KeyType.USK): - raise ValueError('keypairType must be %s or %s' % (consts.KeyType.SSK, consts.KeyType.USK)) + raise ValueError('keypairType must be SSK or USK') requestType = consts.RequestType.GenerateSSKKeypair if keypairType == consts.KeyType.SSK else consts.RequestType.GenerateUSKKeypair msg = message.GenerateSSK() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-30 08:55:46
|
Revision: 431 http://fclient.svn.sourceforge.net/fclient/?rev=431&view=rev Author: jUrner Date: 2008-06-30 01:55:28 -0700 (Mon, 30 Jun 2008) Log Message: ----------- epydoc did not like whitespace in doctests Modified Paths: -------------- trunk/sandbox/fcp2/fcp_lib/pmstruct.py Modified: trunk/sandbox/fcp2/fcp_lib/pmstruct.py =================================================================== --- trunk/sandbox/fcp2/fcp_lib/pmstruct.py 2008-06-30 08:54:21 UTC (rev 430) +++ trunk/sandbox/fcp2/fcp_lib/pmstruct.py 2008-06-30 08:55:28 UTC (rev 431) @@ -50,41 +50,41 @@ Field names must corrospond to mapping names >>> p = S.toString({'IAmInvalid': 123456, 'Bar': 'abcdefg'}) Traceback (most recent call last): - ... + ... KeyError: 'Foo' All field names must be present in the mapping passed >>> p = S.toString({'Bar': 'abcdefg'}) Traceback (most recent call last): - ... + ... KeyError: 'Foo' types of the mapping have to corrospond to field types >>> p = S.toString({'Foo': 'invalid-int', 'Bar': 'abcdefg'}) Traceback (most recent call last): - ... + ... ValueError: Invalid type for field "Foo, expected: <type 'int'>" invalid field types are detected on converting the string back to a mapping >>> p = 'invalid-int\\x01YWJjZGVmZw==' >>> S.fromString(p) Traceback (most recent call last): - ... + ... ValueError: Invalid field #0: (invalid literal for int() with base 10: 'invalid-int') too few fields in the input strig will be recognized >>> p = 'YWJjZGVmZw==' >>> S.fromString(p) Traceback (most recent call last): - ... + ... ValueError: Too few fields in input string ...aswell as too many >>> p = '999\x01123456\x01YWJjZGVmZw==' >>> S.fromString(p) Traceback (most recent call last): - ... + ... ValueError: Too many fields in input string """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-30 08:54:24
|
Revision: 430 http://fclient.svn.sourceforge.net/fclient/?rev=430&view=rev Author: jUrner Date: 2008-06-30 01:54:21 -0700 (Mon, 30 Jun 2008) Log Message: ----------- whitespace and typos Modified Paths: -------------- trunk/sandbox/fcp2/key.py Modified: trunk/sandbox/fcp2/key.py =================================================================== --- trunk/sandbox/fcp2/key.py 2008-06-29 16:21:17 UTC (rev 429) +++ trunk/sandbox/fcp2/key.py 2008-06-30 08:54:21 UTC (rev 430) @@ -16,7 +16,6 @@ from fcp2 import consts - del hack #<-- rel import hack #************************************************************************************** @@ -90,6 +89,7 @@ #************************************************************************************** # #************************************************************************************** +#TODO: too bad, can not move this to types.py ...cross import class FcpTypeKey(object): """key type for type conversions @@ -146,7 +146,6 @@ return key.toString() - def key(string): """creates a key object from a string @return: L{KeyBase} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 16:21:12
|
Revision: 429 http://fclient.svn.sourceforge.net/fclient/?rev=429&view=rev Author: jUrner Date: 2008-06-29 09:21:17 -0700 (Sun, 29 Jun 2008) Log Message: ----------- added tests for putData and putRedirect Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_client.py Modified: trunk/sandbox/fcp2/test_fcp/test_client.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 16:21:01 UTC (rev 428) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 16:21:17 UTC (rev 429) @@ -1887,16 +1887,18 @@ #*********************************************************************************** #TODO: # -# SSK@, USK@ -# putFile / PutDir TestDDA +# x. check if TargetFilename handling is ok for CHKs +# -class Test_clientPut(BaseTestClient): - - def testPutRedirect_Success(self): - # request a arbitrary file - myIdentifier = self.client.putRedirect( - 'my-redirect-name', - 'SSK@arbitrary-uri', +class Test_putData(BaseTestClient): + + def test_putData_Success(self): + self.connectClient() + + myKey = self.client.key.KSK('foo') + myIdentifier = self.client.putData( + myKey, + 'any data here' ) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() @@ -1907,7 +1909,7 @@ self.sendResponseMessage( 'PutSuccessful', Identifier=myIdentifier, - URI='KSK@my-redirect-name' + URI=myKey ) self.assertHasNextEvent( @@ -1921,15 +1923,18 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) - self.failIf(requestsAll) - + self.failIf(requestsAll) - def testPutRedirect_Failure(self): - # request a arbitrary file - myIdentifier = self.client.putRedirect( - 'my-redirect-name', - 'SSK@arbitrary-uri', + + def test_putData_Failure(self): + self.connectClient() + + myKey = self.client.key.KSK('foo') + myIdentifier = self.client.putData( + myKey, + 'any data here' ) + myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() @@ -1954,12 +1959,23 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.failIf(requestsAll) - - def testCHKPutData_Success(self): + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putRedirect(BaseTestClient): + + + def testPutRedirect_Success(self): + self.connectClient() + # request a arbitrary file - myIdentifier = self.client.chkPutData( - 'arbitrary data' + myRedirect = self.client.key.KSK('foo') + myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData) + myIdentifier = self.client.putRedirect( + myRedirect, + myKey, ) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() @@ -1970,7 +1986,7 @@ self.sendResponseMessage( 'PutSuccessful', Identifier=myIdentifier, - URI='CHK@my-redirect-name' + URI=myRedirect ) self.assertHasNextEvent( @@ -1987,10 +2003,15 @@ self.failIf(requestsAll) - def testCHKPutData_Failure(self): + def testPutRedirect_Failure(self): + self.connectClient() + # request a arbitrary file - myIdentifier = self.client.chkPutData( - 'arbitrary data' + myRedirect = self.client.key.KSK('foo') + myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData) + myIdentifier = self.client.putRedirect( + myRedirect, + myKey, ) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() @@ -2016,9 +2037,13 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.failIf(requestsAll) - - def testCHKPutDir_Success(self): + + + +class Test_clientPut(BaseTestClient): + + def XXXtestCHKPutDir_Success(self): # request a arbitrary file myIdentifier = self.client.chkPutDir( 'myDirectory' @@ -2049,7 +2074,7 @@ self.failIf(requestsAll) - def testCHKPutDir_Failure(self): + def XXXtestCHKPutDir_Failure(self): # request a arbitrary file myIdentifier = self.client.chkPutDir( 'myDirectory' @@ -2080,7 +2105,7 @@ self.failIf(requestsAll) - def testCHKPutFile_Success(self): + def XXXtestCHKPutFile_Success(self): # request a arbitrary file myIdentifier = self.client.chkPutFile( 'myFile.txt' @@ -2111,7 +2136,7 @@ self.failIf(requestsAll) - def testCHKPutFile_Failure(self): + def XXXtestCHKPutFile_Failure(self): # request a arbitrary file myIdentifier = self.client.chkPutFile( 'myFile.txt' @@ -2143,7 +2168,7 @@ - def testCHKPutMultiple_Success(self): + def XXXtestCHKPutMultiple_Success(self): items = [ { @@ -2221,7 +2246,7 @@ self.failIf(requestsAll) - def testCHKPutMultiple_ItemErrors(self): + def XXXtestCHKPutMultiple_ItemErrors(self): # upload directory is not allowed @@ -3245,23 +3270,32 @@ Test_iterConnect, Test_CloseConnectionDuplicateClientName, Test_closeNode, + Test_disconnectReason, + Test_get_setConnectionName, Test_get_setDebugVerbosity, Test_startNode, Test_versionCheckNodeHello, + Test_handleMessage, Test_next, Test_run, Test_sendMessage, Test_getConfig, Test_modifyConfig, + Test_getData, Test_getFile, Test_getKeyInfo, - Test_disconnectReason, + Test_putData, + Test_putRedirect, + + #Test_putData, + #Test_clientPut, + #Test_clientGet, - #Test_clientPut, + Test_requests, #Test_restoreRequests, #Test_resendRequests, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 16:20:54
|
Revision: 428 http://fclient.svn.sourceforge.net/fclient/?rev=428&view=rev Author: jUrner Date: 2008-06-29 09:21:01 -0700 (Sun, 29 Jun 2008) Log Message: ----------- reworked putData and putRedirect Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-06-29 15:19:30 UTC (rev 427) +++ trunk/sandbox/fcp2/client.py 2008-06-29 16:21:01 UTC (rev 428) @@ -1526,9 +1526,9 @@ def clientPut(self, requestType, key, + userData, + persistentUserData, data=None, - persistentUserData='', - userData=None, items=None, **msgParams ): @@ -1540,7 +1540,7 @@ @param userData: (any) any data to be associated to the request at runtime @param items: for L{consts.RequestType.PutMultiple}, items to upload @param msgParams: (dict) Fcp parameters to pass along with the message - + @note: the Fcp message parameter 'Metadata.ContentType' may be passed as 'ContentType' to this method @note: to upload multiple items at once pass a dict for each item containig the following members: @@ -1555,31 +1555,38 @@ All items will be accessible under one single key as 'Uri/Name'. The default item (the item when only 'Uri' is requested from freenet) is always the first item in the list. """ - if requestType in (consts.RequestType.PutData, consts.RequestType.PutFile): - msgName = message.ClientPut.name - elif requestType == consts.RequestType.PutDir: - msgName = message.ClientPutDiskDir.name - elif requestType == consts.RequestType.PutMultiple: - msgName = message.ClientPutComplexDir.name - else: - raise ValueError('Unsupported request type') - msg = message.MessagesAll[msgName](URI=key) + #FIX: enables passing params as python keywords contentType = msgParams.get('ContentType', None) if contentType is not None: del msgParams['ContentType'] msgParams['Metadata.ContentType'] = contentType + + # find out wich message to use + if requestType & (consts.RequestType.PutData | consts.RequestType.PutFile | consts.RequestType.PutRedirect): + msgClass = message.ClientPut + elif requestType == consts.RequestType.PutDir: + msgClass = message.ClientPutDiskDir + elif requestType == consts.RequestType.PutMultiple: + msgClass = message.ClientPutComplexDir + else: + raise ValueError('Unsupported request type') + msg = msgClass(URI=key) + + # add params + if key.KeyType == consts.KeyType.CHK: + if key.filename is not None: + msg['TargetFilename'] = key.filename for param, value in msgParams.items(): if value is not None: msg[param] = value if data is not None: if requestType != consts.RequestType.PutData: - raise ValueError('Data can only be passed along with PutData uploads') + raise ValueError('Data can only be passed along with putData uploads') msg.data = data if items is not None: - if requestType != consts.RequestType.PutMultiple: raise ValueError('Items can only be passed along with PutMultiple uploads') @@ -1647,7 +1654,7 @@ if data: msg.data = data - # + # finally self._registerRequest( msg, requestType, @@ -1657,7 +1664,7 @@ self.sendMessage(msg) return msg['Identifier'] - + #TESTED def putData(self, key, data, @@ -1667,20 +1674,43 @@ maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, - targetFilename=None, - + userData=None, persistentUserData='', ): + """Uploads data + @param key: (L{key.KeyBase}) key under wich to upload the data + @param data: (bytes) data to upload + + @param contentType: (str) content type. If not specified, the node will guess the content type + @param dontCompress: (bool) if True, the node won't try to compress the data + @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide + @param priorityClass: (L{consts.Priority}) priority of the request + + @param userData: any non persistent data to associate to the request + @param persistentUserData: any string to associate to the request as persistent data + + @event: (L{events.Events.RequestCompleted}) triggered when the request is complete + @event: (L{events.Events.RequestFailed}) triggered when the request failes + @event: (L{events.Events.RequestFetchable}) triggered as soon as the request is fetchable + @event: (L{events.Events.RequestCompressionStarted}) triggered when the request is about to be compressed + @event: (L{events.Events.RequestCompressionComopleted}) triggered as soon as compressing of the request is completed + + @note: if the upload is successful the node will create a L{consts.KeyType.CHK} key under wich + the data can be retreieved. The key can be accessed as 'URI' member of the request as soon + as the L{events.Events.RequestFetchable} or the L{events.Events.RequestCompleted} event + is triggered. + + @todo: EarlyEncode and GetCHKOnly message params not implemented + """ return self.clientPut( consts.RequestType.PutData, key, - + userData, + persistentUserData, data=data, - persistentUserData=persistentUserData, - userData=userData, - + # fcp params ContentType=contentType, DataLength=len(data), @@ -1692,16 +1722,14 @@ DontCompress=dontCompress, Persistence=persistence, PriorityClass=priorityClass, - TargetFilename=targetFilename, UploadFrom=consts.UploadFrom.Direct, Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, ) - - + #TESTED def putRedirect(self, - name, - targetURI, + key, + targetKey, maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, @@ -1709,8 +1737,8 @@ persistentUserData='', ): """Uploads a redirect to another key - @param name: name of the redirect - @param targetURI: (str) uri to redirect to + @param key: (L{key.KSK}) to insert as redirect + @param targetKey: (key.KeyBase) key to redirect to @param maxRetries: (int) maximum number of tretries or -1 to leave the decission up to the node @param persistence: (L{consts.Persistence}) of the request @param priorityClass: (L{consts.Priority}) priority of the request @@ -1718,22 +1746,23 @@ @param userData: (any) any data to be associated to the request at runtime @return: (str) request identifier """ - msg = message.ClientPut( - URI=consts.KeyType.KSK + name, - Persistence=persistence, - PriorityClass=priorityClass, - TargetURI=targetURI, - UploadFrom=consts.UploadFrom.Redirect, - ) - self._registerRequest( - msg, - consts.RequestType.PutRedirect, - persistentUserData=persistentUserData, - userData=userData, - ) - self.sendMessage(msg) - return msg['Identifier'] + return self.clientPut( + consts.RequestType.PutRedirect, + key, + userData, + persistentUserData, + Persistence=persistence, + PriorityClass=priorityClass, + TargetURI=targetKey, + UploadFrom=consts.UploadFrom.Redirect, + ) + ######################################################### + ######################################################### + ######################################################### + ######################################################### + ######################################################### + #CHK def chkPutData(self, data, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 15:19:21
|
Revision: 427 http://fclient.svn.sourceforge.net/fclient/?rev=427&view=rev Author: jUrner Date: 2008-06-29 08:19:30 -0700 (Sun, 29 Jun 2008) Log Message: ----------- logging Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-06-29 15:19:20 UTC (rev 426) +++ trunk/sandbox/fcp2/iohandler.py 2008-06-29 15:19:30 UTC (rev 427) @@ -125,7 +125,7 @@ if p == '': raise socket.error('Socket closed by host') except socket.timeout, details: - raise consts.IOTimeoutError(details, consts.Logger.IO.debug) + raise consts.IOTimeoutError(details, consts.Logger.IO.log, consts.DebugVerbosity.Chatty) except socket.error, details: self.close() raise consts.IOBrokenError(details, consts.Logger.IO.error) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 15:19:11
|
Revision: 426 http://fclient.svn.sourceforge.net/fclient/?rev=426&view=rev Author: jUrner Date: 2008-06-29 08:19:20 -0700 (Sun, 29 Jun 2008) Log Message: ----------- logging Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-06-29 15:19:09 UTC (rev 425) +++ trunk/sandbox/fcp2/client.py 2008-06-29 15:19:20 UTC (rev 426) @@ -288,7 +288,9 @@ ## ############################################################### def _captureEvent(self, event, request): - if event != self.events.Idle: + if event == self.events.Idle: + consts.Logger.Event.log(consts.DebugVerbosity.Chatty, consts.LogMessages.EventTriggered + event.name) + else: consts.Logger.Event.info(consts.LogMessages.EventTriggered + event.name) @@ -1562,7 +1564,6 @@ else: raise ValueError('Unsupported request type') - #TODO: autoconvert keys to python classes??? msg = message.MessagesAll[msgName](URI=key) contentType = msgParams.get('ContentType', None) if contentType is not None: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 15:19:01
|
Revision: 425 http://fclient.svn.sourceforge.net/fclient/?rev=425&view=rev Author: jUrner Date: 2008-06-29 08:19:09 -0700 (Sun, 29 Jun 2008) Log Message: ----------- more fine grained logging support Modified Paths: -------------- trunk/sandbox/fcp2/consts.py Modified: trunk/sandbox/fcp2/consts.py =================================================================== --- trunk/sandbox/fcp2/consts.py 2008-06-29 15:18:28 UTC (rev 424) +++ trunk/sandbox/fcp2/consts.py 2008-06-29 15:19:09 UTC (rev 425) @@ -7,44 +7,29 @@ #***************************************************************************** # exceptions #***************************************************************************** -class MessageParseError(Exception): - """Exception raised when a message could not be parsed succesfuly""" - def __init__(self, message, logMethod=None): +class FcpError(Exception): + def __init__(self, message, logMethod=None, logLevel=None): if logMethod is not None: - logMethod(self.__class__.__name__ + ': %s' % message) + if logLevel is None: + logMethod(self.__class__.__name__ + ': %s' % message) + else: + logMethod(logLevel, self.__class__.__name__ + ': %s' % message) Exception.__init__(self, message) - -class IOConnectFailedError(Exception): +class MessageParseError(FcpError): + """Exception raised when a message could not be parsed succesfuly""" + +class IOConnectFailedError(FcpError): """Exception raised if the object can not be connected""" - def __init__(self, message, logMethod=None): - if logMethod is not None: - logMethod(self.__class__.__name__ + ': %s' % message) - Exception.__init__(self, message) - -class IOClosedError(Exception): +class IOClosedError(FcpError): """Exception raised if the object is closed""" - def __init__(self, message, logMethod=None): - if logMethod is not None: - logMethod(self.__class__.__name__ + ': %s' % message) - Exception.__init__(self, message) - -class IOBrokenError(Exception): +class IOBrokenError(FcpError): """Exception raised if the IO connection is broken""" - def __init__(self, message, logMethod=None): - if logMethod is not None: - logMethod(self.__class__.__name__ + ': %s' % message) - Exception.__init__(self, message) - class IOTimeoutError(Exception): """Exception raised when the io connection is closed""" - def __init__(self, message, logMethod=None): - if logMethod is not None: - logMethod(self.__class__.__name__ + ': %s' % message) - Exception.__init__(self, message) #************************************************************************ # @@ -155,6 +140,7 @@ class DebugVerbosity: """Consts indicating the verbosity level for debugging""" + Chatty = logging.DEBUG - 1 Debug = logging.DEBUG Info = logging.INFO Warning = logging.WARNING @@ -291,11 +277,12 @@ IOHandler =logging.getLogger('Fcp.Client.IOHandler') IO =logging.getLogger('Fcp.Client.IOHandler.IO') Message = logging.getLogger('Fcp.Client.Message') - +logging.addLevelName(DebugVerbosity.Chatty, 'chatty') +logging.addLevelName(DebugVerbosity.Quiet, 'quiet') logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) -logging.addLevelName(DebugVerbosity.Quiet, '') + class LogMessages: """Strings used for log infos""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 15:18:21
|
Revision: 424 http://fclient.svn.sourceforge.net/fclient/?rev=424&view=rev Author: jUrner Date: 2008-06-29 08:18:28 -0700 (Sun, 29 Jun 2008) Log Message: ----------- stringify msg params for readability Modified Paths: -------------- trunk/sandbox/fcp2/message.py Modified: trunk/sandbox/fcp2/message.py =================================================================== --- trunk/sandbox/fcp2/message.py 2008-06-29 12:39:15 UTC (rev 423) +++ trunk/sandbox/fcp2/message.py 2008-06-29 15:18:28 UTC (rev 424) @@ -123,6 +123,12 @@ for param, value in self.params.items(): if isinstance(param, PrivateParam): continue + + # convert python to fcp value if necessary + paramType = self._param_types_.get(param, None) + if paramType is not None: + value = paramType.pythonToFcp(value) + out.append('>> %s=%s' % (param, value)) if self.data is None: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 12:39:07
|
Revision: 423 http://fclient.svn.sourceforge.net/fclient/?rev=423&view=rev Author: jUrner Date: 2008-06-29 05:39:15 -0700 (Sun, 29 Jun 2008) Log Message: ----------- got most of the tests to work again Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_client.py Modified: trunk/sandbox/fcp2/test_fcp/test_client.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 12:38:23 UTC (rev 422) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 12:39:15 UTC (rev 423) @@ -360,8 +360,7 @@ #*********************************************************************************** class Test_connect(BaseTestClient): pass - - + #*********************************************************************************** # #*********************************************************************************** @@ -1346,104 +1345,38 @@ self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.failUnless(self.ioOpen()) - - -#*********************************************************************************** -# -#*********************************************************************************** -class Test_subscribeUSK(BaseTestClient): - def test_100_subscribeUSK_accepts_key_object(self): - self.connectClient() - key = self.client.key.USK(client.key.DummyKeyData, 'foo', 0) - myIdentifier = self.client.subscribeUSK(key) - self.assertHasNextMessage( - 'SubscribeUSK', - ('URI', key), - ) - - - def XXXtest_200_subscribeUSK(self): - self.connectClient() - myIdentifier = self.client.subscribeUSK('arbitrary-key') - myRequest = self.client.getRequest(myIdentifier) - requestsAll = self.client.getRequests() - self.failUnless(myIdentifier in requestsAll) - myRequest = self.client.getRequest(myIdentifier) - self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.SubscribeUSK) - - self.assertHasNextMessage( - 'SubscribeUSK', - ('URI', 'arbitrary-key'), - ) - self.failUnless(myIdentifier in requestsAll) - - # usk update requests are permanent, so the completed flag shuld always be set - myRequest['RequestStatus'] == self.client.consts.RequestStatus.Completed - - self.sendResponseMessage( - 'SubscribedUSKUpdate', - Edition=99, - Identifier=myIdentifier, - URI='arbitrary-uri' - ) - - self.assertHasNextEvent( - self.client.events.USKUpdated, - 'SubscribeUSK', - ('Edition', 99), - ('Identifier', myIdentifier), - ('URI', 'arbitrary-key'), - ) - - - - -################################################### -################################################### -################################################### - - #*********************************************************************************** # #*********************************************************************************** -class TestDisconnectReason(BaseTestClient): +class Test_disconnectReason(BaseTestClient): def test_1000_DuplicateClientName(self): - + self.connectClient() self.sendResponseMessage('CloseConnectionDuplicateClientName') msg = self.assertHasNextEvent( self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.DuplicateClientName), ) - self.failUnless('Param' in msg.params) - self.assertEqual(msg['Param'], None) - + self.failIf(self.ioOpen()) self.assertHasNextEvent(None) - #print self.client.test_messagesSend[0].name self.assertHasNextMessage(None) - - self.connectClient() + - def test_1001_SocketDied_Receive(self): - + self.connectClient() self.getIO().setBroken(True) - self.assertRaises(iohandler.IOBroken, self.client.next) + self.assertRaises(consts.IOBrokenError, self.client.next) # check if ClientDisconnected events has been triggered msg = self.assertHasNextEvent( self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, - ('DisconnectReason', consts.DisconnectReason.SocketDied), - #('Param', ClientSocketDiedMessage) # can not test here + ('DisconnectReason', consts.DisconnectReason.ConnectionDied), ) - self.failUnless('Param' in msg.params) - # Param is now details of IOBroken exception, no idea how to test - #self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied) - + self.failIf(self.ioOpen()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) @@ -1451,23 +1384,19 @@ def test_1002_SocketDied_Send(self): - + self.connectClient() self.getIO().setBroken(True) # send a test message - self.assertRaises(iohandler.IOBroken, self.client.sendMessage, message.newMessageType('test')()) + self.assertRaises(consts.IOBrokenError, self.client.sendMessage, message.newMessageType('test')()) # check if ClientDisconnected events has been triggered msg = self.assertHasNextEvent( self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, - ('DisconnectReason', consts.DisconnectReason.SocketDied), - #('Param', ClientSocketDiedMessage) # can not test here + ('DisconnectReason', consts.DisconnectReason.ConnectionDied), ) - self.failUnless('Param' in msg.params) - # Param is now details of IOBroken exception, no idea how to test - #self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied) - + self.failIf(self.ioOpen()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) @@ -1475,9 +1404,9 @@ def test_1003_Shutdown(self): + self.connectClient() + self.client.closeNode() - self.client.closeFreenet() - msg = self.assertHasNextMessage(consts.Message.Shutdown) self.sendResponseMessage( 'ProtocolError', @@ -1488,13 +1417,9 @@ msg = self.assertHasNextEvent( self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, - ('DisconnectReason', consts.DisconnectReason.Shutdown) - #('Param', NodeHelloMessage) # can not test here + ('DisconnectReason', consts.DisconnectReason.NodeClosing) ) - self.failUnless('Param' in msg.params) - self.assertEqual(msg['Param'], None) - self.failIf(self.ioOpen()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) @@ -1503,9 +1428,8 @@ def test_1004_VersionMismatch(self): - for n, nodeHello in enumerate(self.client.iterConnect(duration=1, timeout=0.1)): - if n == 1: + if n == 2: self.assertHasNextMessage( consts.Message.ClientHello ) @@ -1530,11 +1454,8 @@ self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.VersionMissmatch) - #('Param', NodeHelloMessage) # can not test here ) - self.failUnless('Param' in msg.params) - self.assertEqual(msg['Param'].name, consts.Message.NodeHello) - + self.failIf(self.ioOpen()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) @@ -1543,7 +1464,7 @@ #*********************************************************************************** # #*********************************************************************************** -class TestClientGet(BaseTestClient): +class Test_clientGet(BaseTestClient): def test_2000_ClientGetRegistered(self): @@ -1969,7 +1890,7 @@ # SSK@, USK@ # putFile / PutDir TestDDA -class TestClientPut(BaseTestClient): +class Test_clientPut(BaseTestClient): def testPutRedirect_Success(self): # request a arbitrary file @@ -2351,13 +2272,16 @@ #*********************************************************************************** # #*********************************************************************************** -class TestRequests(BaseTestClient): +class Test_requests(BaseTestClient): def test_3000_ModifyRequest_Persistent(self): - + self.connectClient() + + # request a arbitrary file + myKey = self.client.key.key('KSK@foo') myIdentifier = self.client.getFile( - 'arbitrary-uri', + myKey, 'arbitryry.txt', persistentUserData='foo', priorityClass=consts.Priority.Medium, @@ -2401,10 +2325,12 @@ def test_3001_ModifyRequest_NonPersistent(self): - + self.connectClient() + # request a arbitrary file + myKey = self.client.key.key('KSK@foo') myIdentifier = self.client.getFile( - 'arbitrary-uri', + myKey, 'arbitryry.txt', persistentUserData='foo', priorityClass=consts.Priority.Medium, @@ -2448,11 +2374,13 @@ self.failIf(requestsAll) - def test_3002_RemoveRequest_NonPersistent(self): - + def test_3002_RemoveRequest(self): + self.connectClient() + # request a file + myKey = self.client.key.key('KSK@foo') myIdentifier = self.client.getFile( - 'arbitrary-uri', + myKey, 'arbitrary.txt' ) myRequest = self.client.getRequest(myIdentifier) @@ -2472,125 +2400,42 @@ # now cancel request self.client.removeRequest(myIdentifier) + self.assertHasNextMessage('RemoveRequest') - # of our request should be removed emidiately, + # of our request should be marked as removed self.assertEqual(myRequest['RequestStatus'], consts.RequestStatus.Removed | - consts.RequestStatus.RemovedFromQueue | consts.RequestStatus.Completed ) - self.failIf(myIdentifier in self.client.getRequests()) - - # now the request should have been removed - self.assertHasNextEvent( - self.client.events.RequestRemoved, - consts.Message.ClientGet, - ('RequestStatus', consts.RequestStatus.Removed | - consts.RequestStatus.RemovedFromQueue | - consts.RequestStatus.Completed - ), - ) - self.failIf(self.client.getRequests()) - self.assertHasNextEvent(None) - self.assertHasNextMessage(None) - self.failIf(requestsAll) - - - def test_3003_RemoveRequest_persistent(self): - - # request a file - myIdentifier = self.client.getFile( - 'arbitrary-uri', - 'arbitrary.txt', - persistence=consts.Persistence.Reboot, - ) - myRequest = self.client.getRequest(myIdentifier) - requestsAll = self.client.getRequests() - - self.assertHasNextMessage(consts.Message.ClientGet) - - # respond to the file request + # respond with a Getfailed self.sendResponseMessage( - 'PersistentGet', - Started='false', - **myRequest.params + 'GetFailed', + Code='25', # fetch error canceled + Identifier=myIdentifier, ) - - # ignore events and messages so far - self.events = [] - self.messages = [] - - # now cancel request - self.client.removeRequest(myIdentifier) - # status of our request should be set to removed emidiately, but it should - # not be removed from the client - self.assertEqual(myRequest['RequestStatus'], consts.RequestStatus.Removed | consts.RequestStatus.Completed) - self.failUnless(myIdentifier in self.client.getRequests()) - # client schould send a RemovePersistentRequest - self.assertHasNextMessage(consts.Message.RemovePersistentRequest) - - # respond with a PersistentRequestRemoved - self.sendResponseMessage( - 'PersistentRequestRemoved', - Identifier=myIdentifier, - ) - # now the request should have been removed - self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.RemovedFromQueue) - self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent( self.client.events.RequestRemoved, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Removed | - consts.RequestStatus.RemovedFromQueue | - consts.RequestStatus.Completed - ), + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), ) - - self.failIf(self.client.getRequests()) - self.assertHasNextEvent(None) - self.assertHasNextMessage(None) - - self.failIf(requestsAll) - - - - def test_3004_ResendRequest_NonPersistent(self): - - myIdentifier = self.client.getData('any-key') - myRequest = self.client.getRequest(myIdentifier) - requestsAll = self.client.getRequests() - self.assertHasNextMessage(consts.Message.ClientGet) - - newIdentifier = self.client.resendRequest(myRequest) - - # client should remove old request emidiately - self.failIf(myIdentifier == newIdentifier) self.failIf(myIdentifier in requestsAll) - self.failUnless(newIdentifier in requestsAll) - self.assertHasNextEvent( - self.client.events.RequestRemoved, - consts.Message.ClientGet, - ('RequestStatus', consts.RequestStatus.Removed | - consts.RequestStatus.RemovedFromQueue | - consts.RequestStatus.Completed - ), - ) - - self.assertHasNextMessage(consts.Message.ClientGet) - self.assertHasNextEvent(None) self.assertHasNextMessage(None) - del requestsAll[newIdentifier] self.failIf(requestsAll) + - def test_3005_ResendRequest_Persistent(self): + self.connectClient() - myIdentifier = self.client.getData('any-key', persistence=consts.Persistence.Reboot) + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=consts.Persistence.Reboot) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -2601,7 +2446,7 @@ # client should remove request from nodes queue self.assertHasNextMessage( - consts.Message.RemovePersistentRequest, + consts.Message.RemoveRequest, ('Identifier', myIdentifier) ) self.assertHasNextMessage( @@ -2609,9 +2454,13 @@ ('Identifier', newIdentifier) ) self.sendResponseMessage( - 'PersistentRequestRemoved', + 'GetFailed', + Code='25', Identifier=myIdentifier, ) + + + self.assertHasNextEvent( self.client.events.RequestRemoved, consts.Message.ClientGet, @@ -2632,7 +2481,7 @@ # #*********************************************************************************** #TODO: testRestoreClientPut and friends -class TestRestoreRequests(BaseTestClient): +class Test_restoreRequests(BaseTestClient): def test_4000_RestorePersistentGet_InvalidClientToken(self): @@ -2718,13 +2567,15 @@ #TODO: testDDAWriteDenied #TODO: testDDAWriteDenied_WriteDisallowed -class TestDDA(BaseTestClient): +class Test_DDA(BaseTestClient): def test_5000_DDAWriteDenied(self): - + self.connectClient() + # request a file + myKey = self.client.key.key('KSK@foo') myIdentifier = self.client.getFile( - 'arbitrary-uri', + myKey, os.path.join(DIR, 'DDATest.txt') ) myRequest = self.client.getRequest(myIdentifier) @@ -2821,10 +2672,12 @@ class TestCollisions(BaseTestClient): def test_6000_IdentifierCollision(self): - + self.connectClient() + # request a file + myKey = self.client.key.key('KSK@foo') myIdentifier = self.client.getFile( - 'arbitrary-uri', + myKey, os.path.join(DIR, 'test.txt') ) myRequest = self.client.getRequest(myIdentifier) @@ -2863,14 +2716,16 @@ def test_6001_FilenameCollision_HandleRename(self): - + self.connectClient() + # request a file fpath = os.path.join(DIR, 'test.txt') open(fpath, 'wb').close() self.tmpfiles.append(fpath) + myKey = self.client.key.key('KSK@foo') myIdentifier = self.client.getFile( - 'arbitrary-uri', + myKey, fpath, filenameCollision=consts.FilenameCollision.HandleRename, ) @@ -2917,14 +2772,16 @@ def test_6002_FilenameCollision_HandleNever(self): - + self.connectClient() + # request a file fpath = os.path.join(DIR, 'test.txt') open(fpath, 'wb').close() self.tmpfiles.append(fpath) + myKey = self.client.key.key('KSK@foo') myIdentifier = self.client.getFile( - 'arbitrary-uri', + myKey, fpath, filenameCollision=consts.FilenameCollision.HandleNever, ) @@ -2967,7 +2824,7 @@ # #*********************************************************************************** #TODO: some tests not yet implemented -class TestResendRequests(BaseTestClient): +class Test_resendRequests(BaseTestClient): def test_resend_CHK(self): myKey = 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo' @@ -3073,11 +2930,11 @@ #*********************************************************************************** # #*********************************************************************************** -class TestPlugins(BaseTestClient): +class Test_plugins(BaseTestClient): def testGet_8000_PluginInfo_Success(self): - + self.connectClient() myIdentifier = self.client.getPluginInfo('hi there') myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() @@ -3117,6 +2974,7 @@ def test_8001_GetPluginInfo_Failure(self): + self.connectClient() myIdentifier = self.client.getPluginInfo('hi there') myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() @@ -3155,7 +3013,7 @@ def test_8002_SendPluginMessage_Success(self): - + self.connectClient() myIdentifier = '123456789' myRequest = self.client.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) requestsAll = self.client.getRequests() @@ -3190,6 +3048,7 @@ def test_8003_GetSendPluginMessage_Failure(self): + self.connectClient() myIdentifier = '1234567889' myRequest = self.client.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) requestsAll = self.client.getRequests() @@ -3222,6 +3081,7 @@ def test_8003_GetSendPluginMessage_Identifiercollision(self): + self.connectClient() myIdentifier = '1234567889' myRequest = self.client.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) requestsAll = self.client.getRequests() @@ -3258,27 +3118,31 @@ #*********************************************************************************** # #*********************************************************************************** -class TestGenerateKeypair(BaseTestClient): +class Test_generateKeypair(BaseTestClient): def test_10000_GeberateSSKKeypair(self): + self.connectClient() + myIdentifier = self.client.generateKeypair(consts.KeyType.SSK) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.GenerateSSK) + priv = self.client.key.key('SSK@' + self.client.key.DummyKeyData + '/priv') + pub = self.client.key.key('SSK@' + self.client.key.DummyKeyData + '/pub') self.sendResponseMessage( 'SSKKeypair', Identifier=myIdentifier, - RequestURI='SSK@public', - InsertURI='SSK@private', + RequestURI=pub, + InsertURI=priv, ) msg = self.assertHasNextEvent( self.client.events.KeypairGenerated, consts.Message.GenerateSSK, ('Identifier', myIdentifier), - ('PublicKey','SSK@public'), - ('PrivateKey','SSK@private'), + ('PublicKey',pub), + ('PrivateKey',priv), ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | consts.RequestStatus.Completed @@ -3293,24 +3157,30 @@ def test_10001_GeberateUSKKeypair(self): + self.connectClient() + myIdentifier = self.client.generateKeypair(consts.KeyType.USK) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.GenerateSSK) + priv = self.client.key.key('SSK@' + self.client.key.DummyKeyData + '/priv') + pub = self.client.key.key('SSK@' + self.client.key.DummyKeyData + '/pub') self.sendResponseMessage( 'SSKKeypair', Identifier=myIdentifier, - RequestURI='SSK@public', - InsertURI='SSK@private', + RequestURI=pub, + InsertURI=priv, ) + priv = self.client.key.USK(priv.keyData, filename=priv.filename) + pub = self.client.key.USK(pub.keyData, filename=pub.filename) msg = self.assertHasNextEvent( self.client.events.KeypairGenerated, consts.Message.GenerateSSK, ('Identifier', myIdentifier), - ('PublicKey','USK@public'), - ('PrivateKey','USK@private'), + ('PublicKey',pub), + ('PrivateKey',priv), ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | consts.RequestStatus.Completed @@ -3323,44 +3193,46 @@ self.assertHasNextMessage(None) self.failIf(requestsAll) - #*********************************************************************************** # #*********************************************************************************** -class TestSubscribeUSK(BaseTestClient): - - - def test_11000_Subscribe(self): - myIdentifier = self.client.subscribeUSK('arbitrary') +class Test_subscribeUSK(BaseTestClient): + + def test_100_subscribeUSK(self): + self.connectClient() + + myKey = self.client.key.USK(client.key.DummyKeyData, 'foo', 0) + myIdentifier = self.client.subscribeUSK(myKey) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() - self.failUnless(myIdentifier in requestsAll) - self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.SubscribeUSK) + + self.assertHasNextMessage( + 'SubscribeUSK', + ('URI', myKey), + ) + self.failUnless(myIdentifier in requestsAll) - self.assertHasNextMessage(consts.Message.SubscribeUSK) + # usk update requests are permanent, so the completed flag shuld always be set + myRequest['RequestStatus'] == self.client.consts.RequestStatus.Completed + self.sendResponseMessage( 'SubscribedUSKUpdate', - Identifier=myIdentifier, Edition=99, - URI='arbitryry/99/', + Identifier=myIdentifier, + URI=myKey ) - - msg = self.assertHasNextEvent( + + self.assertHasNextEvent( self.client.events.USKUpdated, - consts.Message.SubscribedUSKUpdate, - ('Identifier', myIdentifier), + 'SubscribeUSK', ('Edition', 99), - ('URI', 'arbitryry/99/'), + ('Identifier', myIdentifier), + ('URI', myKey), ) - self.assertHasNextEvent(None) - self.assertHasNextMessage(None) - - del requestsAll[myIdentifier] - self.failIf(requestsAll) - - - + #********************************************************************************* # #********************************************************************************* @@ -3386,19 +3258,18 @@ Test_getData, Test_getFile, Test_getKeyInfo, - Test_subscribeUSK, + Test_disconnectReason, - #TestDisconnectReason, - #TestClientGet, - #TestClientPut, - #TestRequests, - #TestRestoreRequests, - #TestResendRequests, - #TestDDA, - #TestCollisions, - #TestPlugins, - #TestGenerateKeypair, - #TestSubscribeUSK, + #Test_clientGet, + #Test_clientPut, + Test_requests, + #Test_restoreRequests, + #Test_resendRequests, + Test_DDA, + TestCollisions, + Test_plugins, + Test_generateKeypair, + Test_subscribeUSK, ) suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 12:38:16
|
Revision: 422 http://fclient.svn.sourceforge.net/fclient/?rev=422&view=rev Author: jUrner Date: 2008-06-29 05:38:23 -0700 (Sun, 29 Jun 2008) Log Message: ----------- SubscribedUSKUpdate was broken. fixed Modified Paths: -------------- trunk/sandbox/fcp2/message.py Modified: trunk/sandbox/fcp2/message.py =================================================================== --- trunk/sandbox/fcp2/message.py 2008-06-29 12:37:43 UTC (rev 421) +++ trunk/sandbox/fcp2/message.py 2008-06-29 12:38:23 UTC (rev 422) @@ -1306,7 +1306,7 @@ _additional_params_ = {} _param_types_ = { 'Edition': types.FcpTypeInt, - 'URI': key.KeyBase, + 'URI': key.FcpTypeKey, } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 12:37:35
|
Revision: 421 http://fclient.svn.sourceforge.net/fclient/?rev=421&view=rev Author: jUrner Date: 2008-06-29 05:37:43 -0700 (Sun, 29 Jun 2008) Log Message: ----------- SSKKeypair was broken. fixed ++ some other changes Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-06-29 12:36:50 UTC (rev 420) +++ trunk/sandbox/fcp2/client.py 2008-06-29 12:37:43 UTC (rev 421) @@ -22,10 +22,11 @@ # everything went well ..we are connected now Request data associated to a freenet key:: - myRequestIdentifier = client.getData('CHK@ABCDE.......') - myRequest = c.getRequest(myIdentifier) - client.run() - print myRequest.data + myKey = client.key.key('CHK@ABCDE.......') + myRequestIdentifier = client.getData(myKey) + myRequest = c.getRequest(myIdentifier) + client.run() + print myRequest.data Usually you would connect handlers to client events to do processing or handle errors:: def handleSuccess(event, request): @@ -34,17 +35,18 @@ def handleFailure(event, request): print 'Too bad, something went wrong' - client.events.RequestCompleted += handleSuccess - client.events.RequestFailed += handleFailure + client.events.RequestCompleted += handleSuccess + client.events.RequestFailed += handleFailure + myKey = client.key.key('CHK@ABCDE.......') + client.getData(myKey) + c.run() - client.getData('CHK@ABCDE.......') - c.run() - Instead of calling run() you may run the client step by step:: - client.getData('CHK@ABCDE.......') - for i in xrange(50): - client.next() + myKey = client.key.key('CHK@ABCDE.......') + client.getData(myKey) + for i in xrange(50): + client.next() You may disconnect event handlers aswell:: @@ -936,7 +938,7 @@ # So no way. #TODO: ??? try ...except - initialRequest.restorePersistentParams() + initialRequest._restoreParams(msg.params) # check if PriorityClass has changed priorityClass = msg.get('PriorityClass', None) @@ -950,6 +952,7 @@ # don't handle PersistentRequestRemoved. instead we handle it in Get/PutFailed + # ??? why ??? # #elif msg == message.PersistentRequestRemoved: # if initialRequest is None: @@ -1099,12 +1102,12 @@ return False #TODO:no idea if the node may pass uris with prefixes like 'freenet:'... strip it anyways - insertURI = key.stripKey(msg['InsertURI']) - requestURI = key.stripKey(msg['RequestURI']) + insertURI = msg['InsertURI'] + requestURI = msg['RequestURI'] if initialRequest['RequestType'] == consts.RequestType.GenerateUSKKeypair: - insertURI = insertURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) - requestURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) + insertURI = key.USK(insertURI.keyData, filename=insertURI.filename) + requestURI = key.USK(requestURI.keyData, filename=requestURI.filename) initialRequest['PrivateKey'] = insertURI initialRequest['PublicKey'] = requestURI This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 12:36:42
|
Revision: 420 http://fclient.svn.sourceforge.net/fclient/?rev=420&view=rev Author: jUrner Date: 2008-06-29 05:36:50 -0700 (Sun, 29 Jun 2008) Log Message: ----------- make filename optional for SSK and USK Modified Paths: -------------- trunk/sandbox/fcp2/key.py Modified: trunk/sandbox/fcp2/key.py =================================================================== --- trunk/sandbox/fcp2/key.py 2008-06-29 10:59:46 UTC (rev 419) +++ trunk/sandbox/fcp2/key.py 2008-06-29 12:36:50 UTC (rev 420) @@ -238,7 +238,7 @@ KeyPattern = re.compile(_key_pattern_, re.I | re.X) ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X) - def __init__(self, keyData, filename): + def __init__(self, keyData, filename=None): self.filename = filename self.keyData = keyData @@ -303,7 +303,7 @@ KeyPattern = re.compile(_key_pattern_, re.I | re.X) ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X) - def __init__(self, keyData, filename, edition=0): + def __init__(self, keyData, filename=None, edition=0): """Creates a USK key @param keyData: (str) public key @param filename: (str) filename This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 10:59:37
|
Revision: 419 http://fclient.svn.sourceforge.net/fclient/?rev=419&view=rev Author: jUrner Date: 2008-06-29 03:59:46 -0700 (Sun, 29 Jun 2008) Log Message: ----------- added one or the other unittest Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_key.py Modified: trunk/sandbox/fcp2/test_fcp/test_key.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_key.py 2008-06-29 10:59:31 UTC (rev 418) +++ trunk/sandbox/fcp2/test_fcp/test_key.py 2008-06-29 10:59:46 UTC (rev 419) @@ -15,6 +15,7 @@ from fcp2.client import Client from fcp2 import consts +from fcp2 import key from fcp2 import types @@ -24,17 +25,39 @@ #**************************************************************************************** # #**************************************************************************************** -class TestKeys(unittest.TestCase): +class Test_CHK(unittest.TestCase): - pass + def test_fromString(self): + + p = 'CHK@' + key.DummyKeyData + '/' + myKey = key.CHK.fromString(p) + self.assertEqual(myKey.keyData, key.DummyKeyData) + self.failUnless(myKey.filename is None) + self.assertEqual(myKey.toString(), p) + + p = 'CHK@' + key.DummyKeyData + '/foo/' + myKey = key.CHK.fromString(p) + self.assertEqual(myKey.keyData, key.DummyKeyData) + self.assertEqual(myKey.filename, 'foo') + self.assertEqual(myKey.toString(), p) + p = 'CHK@' + myKey = key.CHK.fromString(p) + self.failUnless(myKey is None) + + + def test_toString(self): + pass + + + #********************************************************************************* # #********************************************************************************* def suite(): tests = ( - TestKeys, + Test_CHK, ) suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 10:59:22
|
Revision: 418 http://fclient.svn.sourceforge.net/fclient/?rev=418&view=rev Author: jUrner Date: 2008-06-29 03:59:31 -0700 (Sun, 29 Jun 2008) Log Message: ----------- adapt to recent changes Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_client.py Modified: trunk/sandbox/fcp2/test_fcp/test_client.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 10:59:13 UTC (rev 417) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 10:59:31 UTC (rev 418) @@ -196,7 +196,6 @@ self.assertEqual(value1, msg[param1]) if param2 is not None: param2, value2 = param2 - self.failUnless(param2 in msg.params) self.assertEqual(value2, msg[param2]) if param3 is not None: param3, value3 = param3 @@ -879,28 +878,23 @@ def test_100_request_registered(self): self.connectClient() - myIdentifier = self.client.getData('arbitrary-key') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey) requestsAll = self.client.getRequests() self.failUnless(myIdentifier in requestsAll) myRequest = self.client.getRequest(myIdentifier) self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.GetData) - def test_200_key_object_is_accepted(self): - self.connectClient() - key = self.client.key.CHK() - myIdentifier = self.client.getData(key) - requestsAll = self.client.getRequests() - - def test_300_message_send(self): self.connectClient() - myIdentifier = self.client.getData('arbitrary-key') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey) requestsAll = self.client.getRequests() self.assertHasNextMessage( 'ClientGet', - ('URI', 'arbitrary-key'), + ('URI', myKey), ) self.assertHasNextEvent(None) @@ -911,7 +905,8 @@ def test_400_progress(self): self.connectClient() - myIdentifier = self.client.getData('arbitrary-key') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey) requestsAll = self.client.getRequests() self.assertHasNextMessage('ClientGet') @@ -938,7 +933,8 @@ def test_500_completed_successfuly(self): self.connectClient() - myIdentifier = self.client.getData('arbitrary-key') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey) requestsAll = self.client.getRequests() self.assertHasNextMessage('ClientGet') @@ -984,7 +980,8 @@ def test_600_completed_with_error(self): self.connectClient() - myIdentifier = self.client.getData('arbitrary-key') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey) requestsAll = self.client.getRequests() self.assertHasNextMessage('ClientGet') @@ -1015,7 +1012,8 @@ def test_700_peristent_request_auto_retrieve_data(self): self.connectClient() - myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=self.client.consts.Persistence.Forever) requestsAll = self.client.getRequests() self.assertHasNextMessage('ClientGet') @@ -1042,7 +1040,8 @@ def test_800_peristent_request_not_removed_on_success(self): self.connectClient() - myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=self.client.consts.Persistence.Forever) requestsAll = self.client.getRequests() self.assertHasNextMessage('ClientGet') @@ -1067,7 +1066,8 @@ def test_900_peristent_request_not_removed_on_error(self): self.connectClient() - myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=self.client.consts.Persistence.Forever) requestsAll = self.client.getRequests() self.assertHasNextMessage('ClientGet') @@ -1107,7 +1107,8 @@ def test_920_restore_peristent_request_success(self): self.connectClient() requestsAll = self.client.getRequests() - myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=self.client.consts.Persistence.Forever) self.failUnless(myIdentifier in requestsAll) myRequest = self.client.getRequest(myIdentifier) del requestsAll[myIdentifier] @@ -1134,7 +1135,8 @@ def test_100_request_registered(self): self.connectClient() - myIdentifier = self.client.getFile('arbitrary-key', 'foo.txt') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getFile(myKey, 'foo.txt') requestsAll = self.client.getRequests() self.failUnless(myIdentifier in requestsAll) myRequest = self.client.getRequest(myIdentifier) @@ -1143,17 +1145,16 @@ def test_200_key_object_is_accepted(self): self.connectClient() - key = self.client.key.CHK() - - myIdentifier = self.client.getFile(key, 'foo.txt') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getFile(myKey, 'foo.txt') requestsAll = self.client.getRequests() def test_300_dda_denied(self): self.connectClient() - + myKey = self.client.key.key('KSK@foo') myIdentifier = self.client.getFile( - 'arbitrary-uri', + myKey, os.path.join(DIR, 'DDATest.txt') ) myRequest = self.client.getRequest(myIdentifier) @@ -1235,7 +1236,8 @@ def test_100_request_registered(self): self.connectClient() - myIdentifier = self.client.getKeyInfo('arbitrary-key') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) requestsAll = self.client.getRequests() self.failUnless(myIdentifier in requestsAll) myRequest = self.client.getRequest(myIdentifier) @@ -1243,15 +1245,16 @@ def test_200_key_object_is_accepted(self): self.connectClient() - key = self.client.key.CHK() + myKey = self.client.key.key('KSK@foo') - myIdentifier = self.client.getKeyInfo(key) + myIdentifier = self.client.getKeyInfo(myKey) requestsAll = self.client.getRequests() def test_300_getKeyInfo_Success(self): self.connectClient() - myIdentifier = self.client.getKeyInfo('arbitrary-uri') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() @@ -1287,7 +1290,8 @@ # test specdial case where ProtocolError.TooBig is handled as success # request a arbitrary uri - myIdentifier = self.client.getKeyInfo('arbitrary-uri') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() @@ -1317,7 +1321,8 @@ self.connectClient() # request a arbitrary file - myIdentifier = self.client.getKeyInfo('arbitrary-uri') + myKey = self.client.key.key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() @@ -1350,15 +1355,15 @@ def test_100_subscribeUSK_accepts_key_object(self): self.connectClient() - key = self.client.key.USK('123456789', 'foo', 0) + key = self.client.key.USK(client.key.DummyKeyData, 'foo', 0) myIdentifier = self.client.subscribeUSK(key) self.assertHasNextMessage( 'SubscribeUSK', - ('URI', key.toString()), + ('URI', key), ) - def test_200_subscribeUSK(self): + def XXXtest_200_subscribeUSK(self): self.connectClient() myIdentifier = self.client.subscribeUSK('arbitrary-key') myRequest = self.client.getRequest(myIdentifier) @@ -3326,11 +3331,10 @@ def test_11000_Subscribe(self): - myIdentifier = self.client.subscribeUSK('arbitrary') myRequest = self.client.getRequest(myIdentifier) requestsAll = self.client.getRequests() - + self.failUnless(myIdentifier in requestsAll) self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 10:59:05
|
Revision: 417 http://fclient.svn.sourceforge.net/fclient/?rev=417&view=rev Author: jUrner Date: 2008-06-29 03:59:13 -0700 (Sun, 29 Jun 2008) Log Message: ----------- get / put methods expect a key object now Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-06-29 10:58:33 UTC (rev 416) +++ trunk/sandbox/fcp2/client.py 2008-06-29 10:59:13 UTC (rev 417) @@ -968,7 +968,7 @@ initialRequest['ProgressRequired'] = msg['Required'] initialRequest['ProgressFailed'] = msg['Failed'] initialRequest['ProgressFatalyFailed'] = msg['FatallyFailed'] - initialRequest['ProgressSucceeeded'] = msg['Succeeded'] + initialRequest['ProgressSucceeded'] = msg['Succeeded'] self.events.RequestProgress(initialRequest) return True @@ -1271,7 +1271,7 @@ **messageParams ): """Requests a key from the node - @param key: (str) key or Uri of the file to request (may contain prefixes like 'freenet:' or 'http://') + @param key: (L{key.KeyBase}) key to request @param requestType: (L{consts.RequestType}) sub type of the message @param userData: any non persistent data to associate to the request or None @param persistentUserData: any string to associate to the request as persistent data or None @@ -1279,11 +1279,8 @@ @param messageParams: keyword arguments to pass along with the ClientGet message (uppercase first letter!!). If the value of a keyword is None, it is ignored. - @return: (str) identifier of the request + @return: (str) request identifier """ - if hasattr(key, 'toString'): - key = key.toString() - msg = message.ClientGet(URI=key) for paramName, value in messageParams.items(): if value is not None: @@ -1318,7 +1315,7 @@ ): """Requests datae from the node - @param key: (str) key or Uri of the data to request (may contain prefixes like 'freenet:' or 'http://') + @param key: (L{key.KeyBase}) key to request @param allowedMimeTypes: (str) list of allowed mime types @param binaryBlob: (bool) if True, the file is retrieved as binary blob file @@ -1386,7 +1383,7 @@ ): """Requests a file from the node - @param key: (str) key or Uri of the file to request (may contain prefixes like 'freenet:' or 'http://') + @param key: (L{key.KeyBase}) key to request @param filename: (full path) filename to store the file to @param allowedMimeTypes: (str) list of allowed mime types @@ -1451,7 +1448,7 @@ ): """Requests info about a key - @param key: (str) key or Uri of the file to request (may contain prefixes like 'freenet:' or 'http://') + @param key: (L{key.KeyBase}) key to request @param dsOnly: if True, retrieves the file from the local data store only @param ignoreDS: If True, ignores the local data store @@ -1497,17 +1494,15 @@ #TESTED def subscribeUSK(self, key, dontPoll=True): """Asks the node to notify the client when an USK is updated - @param key: (str) key or Uri of the USK to subscribe to + @param key: (L{key.USK}) key to subscribe to @param dontPoll: if True, does whatever ??? @return: (str) identifer of the request - @note: this request can not be removed or modified and the {consts.RequestStatus.Completed} + @note: this request can not be removed or modified so the L{consts.RequestStatus.Completed} flag is always set @todo: looks like USK subscribes will persist untill connection is closed. Can they be removed somehow? """ - if hasattr(key, 'toString'): - key = key.toString() msg = message.SubscribeUSK( URI=key, DontPoll=dontPoll, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 10:58:24
|
Revision: 416 http://fclient.svn.sourceforge.net/fclient/?rev=416&view=rev Author: jUrner Date: 2008-06-29 03:58:33 -0700 (Sun, 29 Jun 2008) Log Message: ----------- implemented autoconvert fcp keys to python keys Modified Paths: -------------- trunk/sandbox/fcp2/message.py Modified: trunk/sandbox/fcp2/message.py =================================================================== --- trunk/sandbox/fcp2/message.py 2008-06-29 10:57:31 UTC (rev 415) +++ trunk/sandbox/fcp2/message.py 2008-06-29 10:58:33 UTC (rev 416) @@ -16,6 +16,7 @@ from fcp2 import consts from fcp2 import types +from fcp2 import key from fcp2.fcp_lib import pmstruct from fcp2.fcp_lib import node from fcp2.fcp_lib import uuid @@ -143,7 +144,7 @@ paramType = self._param_types_.get(param, None) if paramType is not None: value = paramType.pythonToFcp(value) - + out.append('%s=%s' % (param, value)) if self.data is None: @@ -330,11 +331,11 @@ 'node.scheduler.SSKinserter_priority_policy': types.FcpTypeChoicePriorityPolicy, 'node.scheduler.SSKrequester_priority_policy': types.FcpTypeChoicePriorityPolicy, - 'node.updater.URI': types.FcpTypeUri, + 'node.updater.URI': key.FcpTypeKey, 'node.updater.autoupdate': types.FcpTypeBool, 'node.updater.enabled': types.FcpTypeBool, - 'node.updater.extURI': types.FcpTypeUri, - 'node.updater.revocationURI': types.FcpTypeUri, + 'node.updater.extURI': key.FcpTypeKey, + 'node.updater.revocationURI': key.FcpTypeKey, 'pluginmanager.loadplugin': types.FcpTypeStringList, 'pluginmanager2.loadedPlugins': types.FcpTypeStringList, @@ -676,6 +677,7 @@ 'MaxRetries': types.FcpTypeInt, 'MaxSize': types.FcpTypeInt, 'MaxTempSize': types.FcpTypeInt, + 'URI': key.FcpTypeKey, 'Verbosity': types.FcpTypeInt, } @@ -712,6 +714,7 @@ 'GetCHKOnly': types.FcpTypeBool, 'Global': types.FcpTypeBool, 'MaxRetries': types.FcpTypeInt, + 'URI': key.FcpTypeKey, 'Verbosity': types.FcpTypeInt, } @@ -861,6 +864,7 @@ 'Fatal': types.FcpTypeBool, 'FinalizedExpected': types.FcpTypeBool, 'Global': types.FcpTypeBool, + 'RedirectURI': key.FcpTypeKey, } @@ -969,6 +973,7 @@ _additional_params_ = {} _param_types_ = { 'ark.number': types.FcpTypeInt, + 'ark.privURI': key.FcpTypeKey, 'auth.negTypes': types.FcpTypeInt, 'location': types.FcpTypeFloat, 'opennet': types.FcpTypeBool, @@ -1210,6 +1215,7 @@ _additional_params_ = {} _param_types_ = { 'Code': types.FcpTypeInt, + 'ExpectedURI': key.FcpTypeKey, 'Global': types.FcpTypeBool, } @@ -1219,6 +1225,7 @@ _additional_params_ = {} _param_types_ = { 'Global': types.FcpTypeBool, + 'URI': key.FcpTypeKey, } ##################################### @@ -1230,6 +1237,7 @@ _additional_params_ = {} _param_types_ = { 'Global': types.FcpTypeBool, + 'URI': key.FcpTypeKey, } @@ -1252,6 +1260,8 @@ name = consts.Message. SSKKeypair _additional_params_ = {} _param_types_ = { + 'InsertURI': key.FcpTypeKey, + 'RequestURI': key.FcpTypeKey, } @@ -1287,6 +1297,7 @@ _additional_params_ = AdditionalSubscribeUSKParams _param_types_ = { 'DontPoll': types.FcpTypeBool, + 'URI': key.FcpTypeKey, } @@ -1295,6 +1306,7 @@ _additional_params_ = {} _param_types_ = { 'Edition': types.FcpTypeInt, + 'URI': key.KeyBase, } @@ -1334,6 +1346,7 @@ name = consts.Message.URIGenerated _additional_params_ = {} _param_types_ = { + 'URI': key.FcpTypeKey, } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-29 10:57:32
|
Revision: 415 http://fclient.svn.sourceforge.net/fclient/?rev=415&view=rev Author: jUrner Date: 2008-06-29 03:57:31 -0700 (Sun, 29 Jun 2008) Log Message: ----------- added support to autoconvert fcp keys to python key ++ many changes and fixes Modified Paths: -------------- trunk/sandbox/fcp2/key.py Modified: trunk/sandbox/fcp2/key.py =================================================================== --- trunk/sandbox/fcp2/key.py 2008-06-28 08:42:30 UTC (rev 414) +++ trunk/sandbox/fcp2/key.py 2008-06-29 10:57:31 UTC (rev 415) @@ -25,6 +25,9 @@ ReMatchExact = '\A%s\Z' KeyTypesAll = {} +# for testing, arbitrary but valid key data +DummyKeyData = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA' + #************************************************************************************** # freenet base64 for keys #************************************************************************************** @@ -51,7 +54,10 @@ @param key: (str) key to strip @return: (str) key """ - return urlparse.urlsplit(key)[2] + result = urlparse.urlsplit(key)[2] + if result.startswith('/'): + result = result[1:] + return result #**************************************************************************************** # freenet keys @@ -84,56 +90,95 @@ #************************************************************************************** # #************************************************************************************** -class KeyBase(object): - """Base class for freenet keys +class FcpTypeKey(object): + """key type for type conversions - >>> key = KeyBase.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo') - >>> key.pythonToFcp() + >>> key = FcpTypeKey.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo') + >>> key.toString() 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/' - >>> key = KeyBase.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/') - >>> key.pythonToFcp() + >>> key = FcpTypeKey.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/') + >>> key.toString() 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/' - >>> key = KeyBase.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo') - >>> key.pythonToFcp() + >>> key = FcpTypeKey.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo') + >>> key.toString() 'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/' - >>> key = KeyBase.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/') - >>> key.pythonToFcp() + >>> key = FcpTypeKey.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/') + >>> key.toString() 'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/' - >>> key = KeyBase.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0') - >>> key.pythonToFcp() + >>> key = FcpTypeKey.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0') + >>> key.toString() 'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/' - >>> key = KeyBase.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/') - >>> key.pythonToFcp() + >>> key = FcpTypeKey.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/') + >>> key.toString() 'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/' - >>> key = KeyBase.fcpToPython('KSK@abcde') - >>> key.pythonToFcp() + >>> key = FcpTypeKey.fcpToPython('KSK@abcde') + >>> key.toString() 'KSK@abcde/' - >>> key = KeyBase.fcpToPython('KSK@abcde/') - >>> key.pythonToFcp() + >>> key = FcpTypeKey.fcpToPython('KSK@abcde/') + >>> key.toString() 'KSK@abcde/' """ - - __metaclass__ = KeyMeta - KeyType = None - + @classmethod def fcpToPython(clss, string): + """converts a fcp key to a python key + @param string: (str) fcp key + @return: python key object + @raise ValueError: if the string can not be converted + @note: use this method to convert an arbirary key to the corrosponding python key object + """ key = stripKey(string) for clssKeyType in KeyTypesAll.values(): result = clssKeyType.fromString(key) if result is not None: return result + raise ValueError('Invalid key: %s' % string) + @classmethod + def pythonToFcp(self, key): + """returns the key as string + @return: (str) fcp key + """ + return key.toString() + + + +def key(string): + """creates a key object from a string + @return: L{KeyBase} + """ + return FcpTypeKey.fcpToPython(string) - def toString(self): - """Returns the key as string""" - return self.pythonToFcp() +#************************************************************************************** +# +#************************************************************************************** +class KeyBase(object): + """Base class for freenet keys + """ + + __metaclass__ = KeyMeta + KeyType = None + + def __eq__(self, other): + return self.toString() == other.toString() + + def __ne__(self, other): + return self.pytoString() != other.toString() + @classmethod + def fromString(clss, string): + """should create a key object from a string + """ + raise NotImplementedError() + def toString(self): + """should return the key as string""" + raise NotImplementedError() + class CHK(KeyBase): """""" @@ -144,21 +189,22 @@ (?P<cryptoKey>[a-z0-9\-~]{43}), (?P<extra>[a-z0-9\-~]{7}) ) - (?: / (?P<filename>[^/]+?) (?: /)?)? + (?: / (?P<filename>[^/]+?)? (?: /)?)? ''' KeyType = consts.KeyType.CHK KeyPattern = re.compile(_key_pattern_, re.I | re.X) ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X) - def __init__(self, filename=None): + def __init__(self, keyData=None, filename=None): """Creates a CHK key + @param keyData: (str) key data or None @param filename: (str) filename to add to the key or None """ - self.keyData = None + self.keyData = keyData self.filename = filename - def pythonToFcp(self): + def toString(self): out = self.KeyType if self.keyData is not None: out += self.keyData + '/' @@ -168,12 +214,11 @@ @classmethod def fromString(clss, string): - result = clss.ExactKeyPattern.match(string) + result = clss.ExactKeyPattern.match(stripKey(string)) if result is not None: d = result.groupdict() - clss = clss(filename=d['filename']) - clss.keyData = d['keyData'] - return clss + key = clss(d['keyData'], filename=d['filename']) + return key class SSK(KeyBase): @@ -197,7 +242,7 @@ self.filename = filename self.keyData = keyData - def pythonToFcp(self): + def toString(self): out = self.KeyType if self.keyData is not None: out += self.keyData + '/' @@ -207,7 +252,7 @@ @classmethod def fromString(clss, string): - result = clss.ExactKeyPattern.match(string) + result = clss.ExactKeyPattern.match(stripKey(string)) if result is not None: d = result.groupdict() return clss(d['keyData'], d['filename']) @@ -227,7 +272,7 @@ def __init__(self, filename): self.filename = filename - def pythonToFcp(self): + def toString(self): out = self.KeyType if self.filename is not None: out += self.filename + '/' @@ -235,11 +280,10 @@ @classmethod def fromString(clss, string): - result = clss.ExactKeyPattern.match(string) + result = clss.ExactKeyPattern.match(stripKey(string)) if result is not None: d = result.groupdict() - clss = clss(filename=d['filename']) - return clss + return clss(filename=d['filename']) class USK(KeyBase): @@ -270,7 +314,7 @@ self.filename = filename self.keyData = keyData - def pythonToFcp(self): + def toString(self): out = self.KeyType if self.keyData is not None: out += self.keyData + '/' @@ -282,14 +326,14 @@ @classmethod def fromString(clss, string): - result = clss.ExactKeyPattern.match(string) + result = clss.ExactKeyPattern.match(stripKey(string)) if result is not None: d = result.groupdict() return clss(d['keyData'], d['filename'], edition=d['edition']) - + #***************************************************************************** # #***************************************************************************** if __name__ == '__main__': import doctest - doctest.testmod() + print 'doctests failed: %s/%s' % doctest.testmod() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-28 08:42:23
|
Revision: 414 http://fclient.svn.sourceforge.net/fclient/?rev=414&view=rev Author: jUrner Date: 2008-06-28 01:42:30 -0700 (Sat, 28 Jun 2008) Log Message: ----------- beautifications Modified Paths: -------------- trunk/sandbox/fcp2/consts.py Modified: trunk/sandbox/fcp2/consts.py =================================================================== --- trunk/sandbox/fcp2/consts.py 2008-06-28 08:39:08 UTC (rev 413) +++ trunk/sandbox/fcp2/consts.py 2008-06-28 08:42:30 UTC (rev 414) @@ -144,6 +144,48 @@ ) +class ConnectReason: + """Reason for connecting to the node + @cvar Connect: reason is a regualr connect + @cvar Reconnect: reason is a reconnect + """ + Connect = 1 + Reconnect = 2 + + +class DebugVerbosity: + """Consts indicating the verbosity level for debugging""" + Debug = logging.DEBUG + Info = logging.INFO + Warning = logging.WARNING + Error = logging.ERROR + Critical = logging.CRITICAL + Quiet = 1000000 + + +class DisconnectReason(BaseBitFlags): + """Reasons for client disconnect + @cvar Close: the clent is about to close down + @cvar ConnectionDied: the connection died unexpectedly + @cvar DuplicateClientName: another client opend a connection with the same connection name + @cvar IOConnectFailed: io connection could not be established + @cvar NodeClosing: freenet node is closing down + @cvar NoNodeHello: NodeHello message did not arrive in time + @cvar Reconnect: the clent is about to be reconnected + @cvar UnknonNodeHello: some unknow message insteadof NodeHello was encountered durin g connect + @cvar VersionMissmatch: nodebuild or Fcp version did not match + """ + Close = 0 + ConnectionDied = 1 + DuplicateClientName = 2 + IOConnectFailed = 3 + NodeClosing = 4 + NoNodeHello = 5 + Reconnect = 6 + UnknownNodeHello = 7 + VersionMissmatch = 8 + + class FetchError(Exception): """All fetch errors supported by the client""" @@ -188,6 +230,21 @@ NotAllDataFound = 28 +class FilenameCollision(BaseBitFlags): + """Filename collision flags + @cvar HandleNever: don't handle filename collisions + @cvar HandleRename: rename file on collisions + @cvar MaskHandle: bitmask indicating if collisions are hadled or not + @cvar CollisonHandled: if this bit is set, a collision has actually been handled + """ + HandleNever = 0x0 + HandleRename = 0x1 + + MaskHandle = HandleRename + + CollisionHandled = 0x10000000 # a filename collision has already been handled + + class InsertError(Exception): """All insert errors supported by the client""" @@ -214,63 +271,6 @@ Canceled = 10 -class ConnectReason: - """Reason for connecting to the node - @cvar Connect: reason is a regualr connect - @cvar Reconnect: reason is a reconnect - """ - Connect = 1 - Reconnect = 2 - - -class DebugVerbosity: - """Consts indicating the verbosity level for debugging""" - Debug = logging.DEBUG - Info = logging.INFO - Warning = logging.WARNING - Error = logging.ERROR - Critical = logging.CRITICAL - Quiet = 1000000 - - -class DisconnectReason(BaseBitFlags): - """Reasons for client disconnect - @cvar Close: the clent is about to close down - @cvar ConnectionDied: the connection died unexpectedly - @cvar DuplicateClientName: another client opend a connection with the same connection name - @cvar IOConnectFailed: io connection could not be established - @cvar NodeClosing: freenet node is closing down - @cvar NoNodeHello: NodeHello message did not arrive in time - @cvar Reconnect: the clent is about to be reconnected - @cvar UnknonNodeHello: some unknow message insteadof NodeHello was encountered durin g connect - @cvar VersionMissmatch: nodebuild or Fcp version did not match - """ - Close = 0 - ConnectionDied = 1 - DuplicateClientName = 2 - IOConnectFailed = 3 - NodeClosing = 4 - NoNodeHello = 5 - Reconnect = 6 - UnknownNodeHello = 7 - VersionMissmatch = 8 - - -class FilenameCollision(BaseBitFlags): - """Filename collision flags - @cvar HandleNever: don't handle filename collisions - @cvar HandleRename: rename file on collisions - @cvar MaskHandle: bitmask indicating if collisions are hadled or not - @cvar CollisonHandled: if this bit is set, a collision has actually been handled - """ - HandleNever = 0x0 - HandleRename = 0x1 - - MaskHandle = HandleRename - - CollisionHandled = 0x10000000 # a filename collision has already been handled - - class KeyType: """Supported key types""" SSK = 'SSK@' @@ -398,6 +398,44 @@ ClientDisconnected = 'FcClientDisconnected' +class PeerNodeStatus: + Connected = 'CONNECTED' + BackedOff = 'BACKED OFF' + TooNew = 'TOO NEW' + TooOld = 'TOO OLD' + Disconnected = 'DISCONNECTED' + NeverConnected = 'NEVER CONNECTED' + Disabled = 'DISABLED' + ClockProblem = 'CLOCK PROBLEM' + ConnectionError = 'CONNECTION ERROR' + RoutingDisabled = 'ROUTING DISABLED' + ListenOnly = 'LISTEN ONLY' + Listening = 'LISTENING' + Bursting = 'BURSTING' + Disconnecting = 'DISCONNECTING' + Unknown = 'UNKNOWN STATUS' + + +class PeerNoteType: + """All known peer note types""" + Private = '1' + + +class Persistence: + Connection = 'connection' + Reboot = 'reboot' + Forever = 'forever' + +class Priority: + Highest = '0' + Higher = '1' + High = '2' + Medium = '3' + Low = '4' + Lower = '5' + Lowest = '6' + + class ProtocolError(Exception): """All protocol errors supported by the client""" @@ -446,46 +484,7 @@ NoSuchPlugin = 32 -class PeerNodeStatus: - Connected = 'CONNECTED' - BackedOff = 'BACKED OFF' - TooNew = 'TOO NEW' - TooOld = 'TOO OLD' - Disconnected = 'DISCONNECTED' - NeverConnected = 'NEVER CONNECTED' - Disabled = 'DISABLED' - ClockProblem = 'CLOCK PROBLEM' - ConnectionError = 'CONNECTION ERROR' - RoutingDisabled = 'ROUTING DISABLED' - ListenOnly = 'LISTEN ONLY' - Listening = 'LISTENING' - Bursting = 'BURSTING' - Disconnecting = 'DISCONNECTING' - Unknown = 'UNKNOWN STATUS' - - -class PeerNoteType: - """All known peer note types""" - Private = '1' - - -class Persistence: - Connection = 'connection' - Reboot = 'reboot' - Forever = 'forever' - - -class Priority: - Highest = '0' - Higher = '1' - High = '2' - Medium = '3' - Low = '4' - Lower = '5' - Lowest = '6' - - -class PutDirType. +class PutDirType: Complex = 'complex' Disk = 'disk' @@ -561,10 +560,8 @@ MaskGenerateKeypair = GenerateSSKKeypair | GenerateUSKKeypair MaskPlugin = PluginInfo | PluginMessage MaskPut = PutData | PutFile | PutDir | PutMultiple | PutRedirect - - class ReturnType: Direct = 'direct' Disk = 'disk' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-06-28 08:38:58
|
Revision: 413 http://fclient.svn.sourceforge.net/fclient/?rev=413&view=rev Author: jUrner Date: 2008-06-28 01:39:08 -0700 (Sat, 28 Jun 2008) Log Message: ----------- added new PutDirType consts Modified Paths: -------------- trunk/sandbox/fcp2/consts.py Modified: trunk/sandbox/fcp2/consts.py =================================================================== --- trunk/sandbox/fcp2/consts.py 2008-06-28 08:38:50 UTC (rev 412) +++ trunk/sandbox/fcp2/consts.py 2008-06-28 08:39:08 UTC (rev 413) @@ -485,6 +485,11 @@ Lowest = '6' +class PutDirType. + Complex = 'complex' + Disk = 'disk' + + class RequestModified(BaseBitFlags): """Flags indicating what aspect of a request has been modified @cvar Filename: the filename has been modified This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |