payload: {"action":"created","issue":{"url":"https://api.github.com/repos/conan-io/conan/issues/5410","repository_url":"https://api.github.com/repos/conan-io/conan","labels_url":"https://api.github.com/repos/conan-io/conan/issues/5410/labels{/name}","comments_url":"https://api.github.com/repos/conan-io/conan/issues/5410/comments","events_url":"https://api.github.com/repos/conan-io/conan/issues/5410/events","html_url":"https://github.com/conan-io/conan/issues/5410","id":461587106,"node_id":"MDU6SXNzdWU0NjE1ODcxMDY=","number":5410,"title":"Stop requiring class properties on recipes","user":{"login":"thejohnfreeman","id":1133852,"node_id":"MDQ6VXNlcjExMzM4NTI=","avatar_url":"https://avatars3.githubusercontent.com/u/1133852?v=4","gravatar_id":"","url":"https://api.github.com/users/thejohnfreeman","html_url":"https://github.com/thejohnfreeman","followers_url":"https://api.github.com/users/thejohnfreeman/followers","following_url":"https://api.github.com/users/thejohnfreeman/following{/other_user}","gists_url":"https://api.github.com/users/thejohnfreeman/gists{/gist_id}","starred_url":"https://api.github.com/users/thejohnfreeman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thejohnfreeman/subscriptions","organizations_url":"https://api.github.com/users/thejohnfreeman/orgs","repos_url":"https://api.github.com/users/thejohnfreeman/repos","events_url":"https://api.github.com/users/thejohnfreeman/events{/privacy}","received_events_url":"https://api.github.com/users/thejohnfreeman/received_events","type":"User","site_admin":false},"labels":[{"id":1120604848,"node_id":"MDU6TGFiZWwxMTIwNjA0ODQ4","url":"https://api.github.com/repos/conan-io/conan/labels/stage:%20triaging","name":"stage: triaging","color":"fff5aa","default":false}],"state":"open","locked":false,"assignee":{"login":"memsharded","id":15367152,"node_id":"MDQ6VXNlcjE1MzY3MTUy","avatar_url":"https://avatars2.githubusercontent.com/u/15367152?v=4","gravatar_id":"","url":"https://api.github.com/users/memsharded","html_url":"https://github.com/memsharded","followers_url":"https://api.github.com/users/memsharded/followers","following_url":"https://api.github.com/users/memsharded/following{/other_user}","gists_url":"https://api.github.com/users/memsharded/gists{/gist_id}","starred_url":"https://api.github.com/users/memsharded/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/memsharded/subscriptions","organizations_url":"https://api.github.com/users/memsharded/orgs","repos_url":"https://api.github.com/users/memsharded/repos","events_url":"https://api.github.com/users/memsharded/events{/privacy}","received_events_url":"https://api.github.com/users/memsharded/received_events","type":"User","site_admin":false},"assignees":[{"login":"memsharded","id":15367152,"node_id":"MDQ6VXNlcjE1MzY3MTUy","avatar_url":"https://avatars2.githubusercontent.com/u/15367152?v=4","gravatar_id":"","url":"https://api.github.com/users/memsharded","html_url":"https://github.com/memsharded","followers_url":"https://api.github.com/users/memsharded/followers","following_url":"https://api.github.com/users/memsharded/following{/other_user}","gists_url":"https://api.github.com/users/memsharded/gists{/gist_id}","starred_url":"https://api.github.com/users/memsharded/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/memsharded/subscriptions","organizations_url":"https://api.github.com/users/memsharded/orgs","repos_url":"https://api.github.com/users/memsharded/repos","events_url":"https://api.github.com/users/memsharded/events{/privacy}","received_events_url":"https://api.github.com/users/memsharded/received_events","type":"User","site_admin":false}],"milestone":null,"comments":5,"created_at":"2019-06-27T15:09:49Z","updated_at":"2019-07-10T17:28:13Z","closed_at":null,"author_association":"NONE","body":"Conan has the annoying requirement that some attributes *must* be given as \"static\" class properties instead of instance properties. If I want to lazily compute an attribute with a function, I cannot use the built-in `@property` decorator; I must write my own `@classproperty` decorator that takes advantage of an [accident of Python descriptors](https://github.com/python/mypy/issues/244) (they are intended to return *themselves* when accessed from a class instead of an instance, but I need them to return the value of the attribute). This is not Pythonic. Conan should construct the recipe object before accessing any attributes."},"comment":{"url":"https://api.github.com/repos/conan-io/conan/issues/comments/510154834","html_url":"https://github.com/conan-io/conan/issues/5410#issuecomment-510154834","issue_url":"https://api.github.com/repos/conan-io/conan/issues/5410","id":510154834,"node_id":"MDEyOklzc3VlQ29tbWVudDUxMDE1NDgzNA==","user":{"login":"memsharded","id":15367152,"node_id":"MDQ6VXNlcjE1MzY3MTUy","avatar_url":"https://avatars2.githubusercontent.com/u/15367152?v=4","gravatar_id":"","url":"https://api.github.com/users/memsharded","html_url":"https://github.com/memsharded","followers_url":"https://api.github.com/users/memsharded/followers","following_url":"https://api.github.com/users/memsharded/following{/other_user}","gists_url":"https://api.github.com/users/memsharded/gists{/gist_id}","starred_url":"https://api.github.com/users/memsharded/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/memsharded/subscriptions","organizations_url":"https://api.github.com/users/memsharded/orgs","repos_url":"https://api.github.com/users/memsharded/repos","events_url":"https://api.github.com/users/memsharded/events{/privacy}","received_events_url":"https://api.github.com/users/memsharded/received_events","type":"User","site_admin":false},"created_at":"2019-07-10T17:28:13Z","updated_at":"2019-07-10T17:28:13Z","author_association":"CONTRIBUTOR","body":"Thanks very much for all the feedback, really appreciated. The pattern that I see is not that directly related to the class attributes by themselves, but related to python inheritance/extensions (and likely python_requires)\r\n\r\nThe truth is that python_requires are a very complicated feature because of the inversion of control. They need to be resolved at python parsing time, and that is very challenging. \r\n\r\nI agree that metaclasses come with their own challenges too. I am starting to consider and investigate some possibility to recover the inverted control, without requiring users to write metaclasses, but use metaprogramming internally. Looks challenging too, to be honest, but I think worth investigating."}}
other: {"actor":{"display_login":"memsharded"}}