And given de example on 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/

> On 7 Jan 2020, at 10:00, Ronald Oussoren via Pythonmac-SIG 
> <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
> 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

Reply via email to