Turns out the instance of server is indeed a CRHTTPServer, but the class that need the metadata registered is CRRouter.
> On Jan 8, 2020, at 15:41, Ronald Oussoren <ronaldousso...@mac.com> wrote: > > What is the type of ‘server’? > > And I just noticed the metadata block is a bit of, the callable is argument 3 > instead of 2. > > Ronald > > -- > On the road, hence brief. > >> On 8 Jan 2020, at 17:18, Rand Dvorak <randdvo...@gmail.com> wrote: >> >> 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 >>> <mailto: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