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 <[email protected]> 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 <[email protected]
>> <mailto:[email protected]>> 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 <[email protected]
>>> <mailto:[email protected]>> 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
>>>> <[email protected] <mailto:[email protected]>> 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 <[email protected]
>>>>> <mailto:[email protected]>> 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 <[email protected]
>>>>>> <mailto:[email protected]>> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>> On 6 Jan 2020, at 00:51, Rand Dvorak <[email protected]
>>>>>>> <mailto:[email protected]>> 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 - [email protected]
>>>>>>> <mailto:[email protected]>
>>>>>>> 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 - [email protected]
>>>> <mailto:[email protected]>
>>>> 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 - [email protected]
https://mail.python.org/mailman/listinfo/pythonmac-sig
unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG