Please change “get_block_” to “get:block:” in the call to 
objc.registerMetadataForSelector.

Ronald
—

Twitter: @ronaldoussoren
Blog: https://blog.ronaldoussoren.net/

> On 8 Jan 2020, at 02:04, Rand Dvorak <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

Reply via email to