← Back to team overview

ladon-dev-team team mailing list archive

Re: REST implementation

 

Will you make a fork as I proposed?

2012/10/23 Mykhailo Stadnyk <mikhus@xxxxxxxxx>

> Renamed to RegD :)
>
> http://packages.python.org/regd/
> https://github.com/Mikhus/regd
>
> I'll build an example you've requested and put it to separate branch in
> few hours
>
>
> 2012/10/23 Jakob Simon-Gaarde <jakobsg@xxxxxxxxx>
>
>> I'm afraid so.
>>
>> / Jakob
>>
>>
>> 2012/10/23 Mykhailo Stadnyk <mikhus@xxxxxxxxx>
>>
>>> How to change the name on pypi? remove/add?
>>>
>>>
>>> 2012/10/23 Jakob Simon-Gaarde <jakobsg@xxxxxxxxx>
>>>
>>>> Or the shorter: regd
>>>>
>>>> / Jakob
>>>>
>>>>
>>>> 2012/10/23 Jakob Simon-Gaarde <jakobsg@xxxxxxxxx>
>>>>
>>>>> then how about: dregistry
>>>>>
>>>>>
>>>>> 2012/10/23 Mykhailo Stadnyk <mikhus@xxxxxxxxx>
>>>>>
>>>>>> The problem that "dtrace" and "decotrace" names are not free :)
>>>>>>
>>>>>> 2012/10/23 Jakob Simon-Gaarde <jakobsg@xxxxxxxxx>
>>>>>>
>>>>>>> Suggestions tracepyd names: dtrace, decotrace anything not
>>>>>>> containing "pyd" :-)
>>>>>>>
>>>>>>> Mike could I ask you to create a fork where you _only_ introduce
>>>>>>> "tracepyd" that shows how it would integrate into Ladon. Also an example
>>>>>>> that shows if the end-user needs to do something special to use more than
>>>>>>> one decorator.
>>>>>>>
>>>>>>>
>>>>>>> / Jakob
>>>>>>>
>>>>>>> 2012/10/22 Mykhailo Stadnyk <mikhus@xxxxxxxxx>
>>>>>>>
>>>>>>>> I'm not very clever to give the names :) Actually tracepyd means "*
>>>>>>>> trace* *py*thon *d*ecorators". Anyway, thanks for your remark,
>>>>>>>> I'll take it into account further
>>>>>>>>
>>>>>>>>
>>>>>>>> 2012/10/22 Jakob Simon-Gaarde <jakobsg@xxxxxxxxx>
>>>>>>>>
>>>>>>>>> Just a remark about the package name tracepyd. That might be an
>>>>>>>>> unfortunate package name, cause on that odd platform called Windows
>>>>>>>>> pyd-files are binary python modules. Just a remark :-)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> 2012/10/22 Jakob Simon-Gaarde <jakobsg@xxxxxxxxx>
>>>>>>>>>
>>>>>>>>>> Hi Mike.
>>>>>>>>>>
>>>>>>>>>> Let's talk about tracepyd first, does it solve this bug:
>>>>>>>>>>
>>>>>>>>>> https://bugs.launchpad.net/ladon/+bug/877727
>>>>>>>>>>
>>>>>>>>>> rpclib has a terribly ugly solution for this, as you can see in
>>>>>>>>>> the bug, and we want to be better than rpclib :-)
>>>>>>>>>>
>>>>>>>>>> / Jakob
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> 2012/10/22 Jakob Simon-Gaarde <jakobsg@xxxxxxxxx>
>>>>>>>>>>
>>>>>>>>>>> Hi Mike
>>>>>>>>>>>
>>>>>>>>>>> Looking into this now, you will have my reply today :-)
>>>>>>>>>>>
>>>>>>>>>>> / Jakob
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> 2012/10/22 Mykhailo Stadnyk <mikhus@xxxxxxxxx>
>>>>>>>>>>>
>>>>>>>>>>>> Currently it's an experimental feature which is not ready to be
>>>>>>>>>>>> integrated. I didn't test it at all (keep working on it).
>>>>>>>>>>>>
>>>>>>>>>>>> So here is my personal road-map for this feature:
>>>>>>>>>>>>   1. Resolve problem with decorators dependencies (something I
>>>>>>>>>>>> described in previous message)
>>>>>>>>>>>>   2. Write tests and test the functionality
>>>>>>>>>>>>   3. I've not checked how does it deal with requests containing
>>>>>>>>>>>> multipart boundaries and binary data
>>>>>>>>>>>>   4. Not sure what to do with service description (currently
>>>>>>>>>>>> I've just removed, but have an idea we can use it to describe service any
>>>>>>>>>>>> way, even as long as REST does not specify this)
>>>>>>>>>>>>   5. Write documentation/examples
>>>>>>>>>>>>
>>>>>>>>>>>> But I'm stuck on issue #1. I want to know:
>>>>>>>>>>>>  * do you agree to add dependency in Ladon to tracepyd module
>>>>>>>>>>>> or not?
>>>>>>>>>>>>  * If not - do you agree to include tracepyd's implementation
>>>>>>>>>>>> into Ladon (not as dependency, but to place it somewhere in tools)?
>>>>>>>>>>>>  * If not - do you agree to modify @ladonize decorator
>>>>>>>>>>>> functionality to add extra-params for REST (for me its ugly).
>>>>>>>>>>>>  * If not - which ideas do you have then? :)
>>>>>>>>>>>>
>>>>>>>>>>>> I'd like to suggest to add dependency to tracepyd. Currently I
>>>>>>>>>>>> have a version locally which works fine, so I can publish this solution to
>>>>>>>>>>>> my branch to let you see.
>>>>>>>>>>>>
>>>>>>>>>>>> Thank you in advance for your time and advice,
>>>>>>>>>>>> Mike
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> 2012/10/22 Jakob Simon-Gaarde <jakobsg@xxxxxxxxx>
>>>>>>>>>>>>
>>>>>>>>>>>>> Interesting :-)
>>>>>>>>>>>>>
>>>>>>>>>>>>> I'll look at it later - we must make sure that it doesn't
>>>>>>>>>>>>> break anything.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> 2012/10/22 Mykhailo Stadnyk <mikhus@xxxxxxxxx>
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi Jacob.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> As I told I'm trying to implement RESTful services support by
>>>>>>>>>>>>>> Ladon. The basic functionality is implemented - you can check my branch:
>>>>>>>>>>>>>> lp:~mikhus/ladon/rest<https://code.launchpad.net/~mikhus/ladon/rest> to
>>>>>>>>>>>>>> see how does it work. Here is an example of RESTful service you may run to
>>>>>>>>>>>>>> see:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> from ladon.ladonizer import ladonize, restfulize
>>>>>>>>>>>>>> from ladon.compat import PORTABLE_STRING
>>>>>>>>>>>>>> from ladon.types.ladontype import LadonType
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> class User(LadonType):
>>>>>>>>>>>>>>  name = PORTABLE_STRING
>>>>>>>>>>>>>> email = PORTABLE_STRING
>>>>>>>>>>>>>> passwd = PORTABLE_STRING
>>>>>>>>>>>>>>  def __init__():
>>>>>>>>>>>>>>  self.name = ""
>>>>>>>>>>>>>>  self.email = ""
>>>>>>>>>>>>>>  self.passwd = ""
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> class UserService( object) :
>>>>>>>>>>>>>>  @restfulize(method="PUT")
>>>>>>>>>>>>>>  @ladonize(str, str, str, rtype=User)
>>>>>>>>>>>>>> def newUser( self, u_name, u_email, u_passwd) :
>>>>>>>>>>>>>>  user = User() # where User is LadonType object
>>>>>>>>>>>>>> user.name   = u_name
>>>>>>>>>>>>>>  user.email  = u_email
>>>>>>>>>>>>>> user.passwd = u_passwd
>>>>>>>>>>>>>> return user
>>>>>>>>>>>>>>  @restfulize(method="GET")
>>>>>>>>>>>>>> @ladonize(int, rtype=[User])
>>>>>>>>>>>>>>  def getUser(self, u_id) :
>>>>>>>>>>>>>> return User()
>>>>>>>>>>>>>>  @restfulize(method="GET")
>>>>>>>>>>>>>> @ladonize(int, rtype=[User])
>>>>>>>>>>>>>> def getUsers(self) :
>>>>>>>>>>>>>>  return [User(), User(), User()]
>>>>>>>>>>>>>>  @restfulize(method="POST")
>>>>>>>>>>>>>>  @ladonize(int, str, str, str, rtype=User)
>>>>>>>>>>>>>> def updUser( self, u_id, u_name, u_email, u_passwd):
>>>>>>>>>>>>>>  user = User()
>>>>>>>>>>>>>> user.name   = u_name
>>>>>>>>>>>>>> user.email  = u_email
>>>>>>>>>>>>>>  user.passwd = u_passwd
>>>>>>>>>>>>>> return user
>>>>>>>>>>>>>>  @restfulize(method="DELETE")
>>>>>>>>>>>>>> @ladonize(int, rtype=bool)
>>>>>>>>>>>>>> def delUser( self, u_id) :
>>>>>>>>>>>>>>  return True
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> By the way, there is at least one issue I don't know how to
>>>>>>>>>>>>>> solve better, so I want your advice.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> As you see I've implemented specific decorator to mark
>>>>>>>>>>>>>> service methods as RESTful. It's @restfulize decorator. The problem that it
>>>>>>>>>>>>>> is implemented now as:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> def restfulize( *dargs, **dkwargs):
>>>>>>>>>>>>>>  def decorator(fn):
>>>>>>>>>>>>>> * minfo = fn._ladon_method_info*
>>>>>>>>>>>>>> if 'method' in dkwargs:
>>>>>>>>>>>>>>  if not minfo.restfulize( **dkwargs):
>>>>>>>>>>>>>> raise RestfulMethodConfigMismatch( fn.func_name)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> return fn # returns ladonized method
>>>>>>>>>>>>>> return decorator
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The problem is highlighted with bold. Will be good to make
>>>>>>>>>>>>>> this decorator independent of what @ladonize defined in it's private props.
>>>>>>>>>>>>>> But, as far as "fn" here is a reference to ladon's "injector" function I
>>>>>>>>>>>>>> have no way to determine correctly which real method in which class is
>>>>>>>>>>>>>> decorated. It means that in such case I have no way to extract
>>>>>>>>>>>>>> LadonMethodInfo associated to "fn" in other way but implemented for the
>>>>>>>>>>>>>> moment.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The real problem is when I want to override @ladonize
>>>>>>>>>>>>>> decorator. In this case @resftulize becomes nonoperational because I loose
>>>>>>>>>>>>>> reference to "_ladon_method_info" and means that I should take care to
>>>>>>>>>>>>>> bypass all the existing private properties in 3-d party override
>>>>>>>>>>>>>> implementation, which is not good at all. So I want to have @restfulize and
>>>>>>>>>>>>>> @ladonize implemented without hard dependency between them.
>>>>>>>>>>>>>> Via global_service_collection() it's possible to do but you
>>>>>>>>>>>>>> need to determine real method function in some way.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> So I see the following ways to fix it:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> 1. Via decorator registry (Here we solved such kind of
>>>>>>>>>>>>>> problem by creating DecoratorRegistry (I've published it as
>>>>>>>>>>>>>> http://pypi.python.org/pypi/tracepyd))
>>>>>>>>>>>>>> 2. By adding REST functionality to @ladonize decorator
>>>>>>>>>>>>>> itself, to have something like:
>>>>>>>>>>>>>>     @ladonize(PORTABLE_STRING, rtype=[PORTABLE_STRING], *rest={
>>>>>>>>>>>>>> "method" : "GET", "produces": "XML" }*)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Maybe you can point me to some other ideas you know how to
>>>>>>>>>>>>>> resolve such kind of problem.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>>> Mike
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>>>>> Med venlig hilsen / Best regards
>>>>>>>>>>>>> Jakob Simon-Gaarde
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Med venlig hilsen / Best regards
>>>>>>>>>>> Jakob Simon-Gaarde
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Med venlig hilsen / Best regards
>>>>>>>>>> Jakob Simon-Gaarde
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Med venlig hilsen / Best regards
>>>>>>>>> Jakob Simon-Gaarde
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Med venlig hilsen / Best regards
>>>>>>> Jakob Simon-Gaarde
>>>>>>>
>>>>>>> --
>>>>>>> Mailing list: https://launchpad.net/~ladon-dev-team
>>>>>>> Post to     : ladon-dev-team@xxxxxxxxxxxxxxxxxxx
>>>>>>> Unsubscribe : https://launchpad.net/~ladon-dev-team
>>>>>>> More help   : https://help.launchpad.net/ListHelp
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Med venlig hilsen / Best regards
>>>>> Jakob Simon-Gaarde
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Med venlig hilsen / Best regards
>>>> Jakob Simon-Gaarde
>>>>
>>>> --
>>>> Mailing list: https://launchpad.net/~ladon-dev-team
>>>> Post to     : ladon-dev-team@xxxxxxxxxxxxxxxxxxx
>>>> Unsubscribe : https://launchpad.net/~ladon-dev-team
>>>> More help   : https://help.launchpad.net/ListHelp
>>>>
>>>>
>>>
>>
>>
>> --
>> Med venlig hilsen / Best regards
>> Jakob Simon-Gaarde
>>
>> --
>> Mailing list: https://launchpad.net/~ladon-dev-team
>> Post to     : ladon-dev-team@xxxxxxxxxxxxxxxxxxx
>> Unsubscribe : https://launchpad.net/~ladon-dev-team
>> More help   : https://help.launchpad.net/ListHelp
>>
>>
>


-- 
Med venlig hilsen / Best regards
Jakob Simon-Gaarde

Follow ups

References