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

Reply via email to