Same results with this code: import objc CRApplication = objc.lookUpClass("CRApplication") objc.registerMetaDataForSelector( b'CRServer', 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(request, response, handler): response.send_("Hello World!") handler() if __name__ == "__main__": server = CRApplication.sharedApplication().delegate().server() server.get_block_("/", helloHandler) server.startListening() > On Jan 7, 2020, at 04:47, Ronald Oussoren <ronaldousso...@mac.com> wrote: > > And given de example on https://criollo.io: <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/ <https://blog.ronaldoussoren.net/> > >> On 7 Jan 2020, at 10:00, Ronald Oussoren via Pythonmac-SIG >> <pythonmac-sig@python.org <mailto: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 >> <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 >
_______________________________________________ Pythonmac-SIG maillist - Pythonmac-SIG@python.org https://mail.python.org/mailman/listinfo/pythonmac-sig unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG