Same result: File "main.py", line 40, in <module> server.get_block_("/", helloHandler) TypeError: Argument 3 is a block, but no signature available
> On Jan 8, 2020, at 03:20, Ronald Oussoren <ronaldousso...@mac.com> wrote: > > Please change “get_block_” to “get:block:” in the call to > objc.registerMetadataForSelector. > > Ronald > — > > Twitter: @ronaldoussoren > Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/> > >> On 8 Jan 2020, at 02:04, Rand Dvorak <randdvo...@gmail.com >> <mailto:randdvo...@gmail.com>> wrote: >> >> 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 >>> <mailto: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 >>>> <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