[Pythonmac-SIG] PyObjC and Criollo HTTP server
Ronald Oussoren
ronaldoussoren at mac.com
Wed Jan 8 15:41:20 EST 2020
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 <randdvorak at 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 <ronaldoussoren at mac.com> wrote:
>>
>> 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 <randdvorak at 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 <ronaldoussoren at mac.com> wrote:
>>>>
>>>> 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 at 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/
>>>>>
>>>>>> On 6 Jan 2020, at 23:59, Rand Dvorak <randdvorak at 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 <ronaldoussoren at mac.com> wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> On 6 Jan 2020, at 00:51, Rand Dvorak <randdvorak at 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/
>>>>>>>> _______________________________________________
>>>>>>>> Pythonmac-SIG maillist - Pythonmac-SIG at python.org
>>>>>>>> https://mail.python.org/mailman/listinfo/pythonmac-sig
>>>>>>>> unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG
>>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Pythonmac-SIG maillist - Pythonmac-SIG at python.org
>>>>> https://mail.python.org/mailman/listinfo/pythonmac-sig
>>>>> unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythonmac-sig/attachments/20200108/391e5a86/attachment-0001.html>
More information about the Pythonmac-SIG
mailing list