And given de example on https://criollo.io:
- The class name is CRServer, not CRApplication - The selector is “get:block:” instead of “get_block:”, which also means the block is argument 3 instead of 2. >> objc.registerMetaDataForSelector( >> b'CRServer', >> b’get:block:', >> { >> 'arguments': { >> 3: { >> 'callable': { >> 'arguments': { >> 0:{'type': b'^v'}, >> 1:{'type': b'@'}, >> 2:{'type': b'@'}, >> 3:{'type': b'@'} >> }, >> 'retval': { 'type': b'v' } >> } >> } >> } >> } >> ) and later: >> server.get_block_("/", helloHandler) > — Twitter: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ > On 7 Jan 2020, at 10:00, Ronald Oussoren via Pythonmac-SIG > <pythonmac-sig@python.org> wrote: > > Hi, > > You also need to remove the call to objc.selector. With correct metadata > “blocks” are callables in Python code. > > Ronald > — > > Twitter: @ronaldoussoren > Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/> > >> On 6 Jan 2020, at 23:59, Rand Dvorak <randdvo...@gmail.com >> <mailto:randdvo...@gmail.com>> wrote: >> >> Same result: >> >> Updated code: >> >> import objc >> CRApplication = objc.lookUpClass("CRApplication") >> objc.registerMetaDataForSelector( >> b'CRApplication', >> b'get_block_', >> { >> 'arguments': { >> 2: { >> 'callable': { >> 'arguments': { >> 0:{'type': b'^v'}, >> 1:{'type': b'@'}, >> 2:{'type': b'@'}, >> 3:{'type': b'@'} >> }, >> ' retval': { 'type': b'v' } >> } >> } >> } >> } >> ) >> global server >> >> def helloHandler(self, request, response, handler): >> response.send_("Hello World!") >> handler() >> >> if __name__ == "__main__": >> server = CRApplication.sharedApplication().delegate().server() >> server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@@')) >> server.startListening() >> >> >> results: >> >> Traceback (most recent call last): >> File "main.py", line 37, in <module> >> server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@@')) >> TypeError: Argument 3 is a block, but no signature available >> >> >>> On Jan 6, 2020, at 09:27, Ronald Oussoren <ronaldousso...@mac.com >>> <mailto:ronaldousso...@mac.com>> wrote: >>> >>> >>> >>>> On 6 Jan 2020, at 00:51, Rand Dvorak <randdvo...@gmail.com >>>> <mailto:randdvo...@gmail.com>> wrote: >>>> >>>> >>>> I am trying to implement a simple server in PyObjC for the Criollo HTTP >>>> server. The server has a method to set route handlers by passing a block >>>> to setup the route and then when it receives and HTTP request for the >>>> route it calls the block. The block has the signature: >>>> >>>> typedef void(^CRRouteBlock)(CRRequest* _Nonnull request, CRResponse* >>>> _Nonnull response, CRRouteCompletionBlock _Nonnull completionHandler); >>>> >>>> >>>> So, here is my simple proof of concept: >>>> >>>> import objc >>>> CRApplication = objc.lookUpClass("CRApplication") >>>> global server >>>> >>>> def helloHandler(self, request, response, handler): >>>> response.send_("Hello World!") >>>> handler() >>>> >>>> if __name__ == "__main__": >>>> server = CRApplication.sharedApplication().delegate().server() >>>> server.get_block_("/", objc.selector(helloHandler, >>>> signature=b'v@:@@@‘)) *** error occurs here >>>> server.startListening() >>>> >>>> >>>> But, when I try to setup the route I get the following error: >>>> >>>> Traceback (most recent call last): >>>> File "main.py", line 21, in <module> >>>> server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@')) >>>> TypeError: Argument 3 is a block, but no signature available >>>> >>>> >>>> Any ideas how to workaround this issue and implement the route handlers in >>>> PyObjC? >>> >>> The code below should do the trick, but eas typed directly into this mail >>> and might therefore contain syntax errors. >>> >>> import objc >>> objc.registerMetaDataForSelector( >>> b”CRApplication”, # name of the class implementing “get_block:”, or >>> “NSObject” >>> b”get_block:”, >>> { >>> “arguments”: { >>> 2: { >>> “callable”: { >>> “arguments”: { >>> 0: { “type”: b”^v” }, >>> 1: { “type”: b”@” }, >>> 2: { “type”: b”@” }, >>> 3: { “type”: b”@” } >>> }, >>> “retail”: { “type”: b”v” } >>> } >>> } >>> } >>> ) >>> >>> This tells the bridge the signature for the block argument of the >>> “get_block:” selector, which is information that cannot be retrieved from >>> the Objective-C runtime. Argument 2 is the first real argument of ObjC >>> selectors, after the implicit arguments “self” and “_imp” (which is not >>> available in python code). >>> >>> Ronald >>> — >>> >>> Twitter: @ronaldoussoren >>> Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/> >>>> _______________________________________________ >>>> Pythonmac-SIG maillist - Pythonmac-SIG@python.org >>>> <mailto:Pythonmac-SIG@python.org> >>>> https://mail.python.org/mailman/listinfo/pythonmac-sig >>>> <https://mail.python.org/mailman/listinfo/pythonmac-sig> >>>> unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG >>>> <https://mail.python.org/mailman/options/Pythonmac-SIG> >>> >> > > _______________________________________________ > Pythonmac-SIG maillist - Pythonmac-SIG@python.org > https://mail.python.org/mailman/listinfo/pythonmac-sig > unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG
_______________________________________________ Pythonmac-SIG maillist - Pythonmac-SIG@python.org https://mail.python.org/mailman/listinfo/pythonmac-sig unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG