{"action":"closed","number":862,"pull_request":{"url":"https://api.github.com/repos/pypa/setuptools/pulls/862","id":95374031,"html_url":"https://github.com/pypa/setuptools/pull/862","diff_url":"https://github.com/pypa/setuptools/pull/862.diff","patch_url":"https://github.com/pypa/setuptools/pull/862.patch","issue_url":"https://api.github.com/repos/pypa/setuptools/issues/862","number":862,"state":"closed","locked":false,"title":"Metadata and options are now could be set in configuration files","user":{"login":"idlesign","id":145644,"avatar_url":"https://avatars.githubusercontent.com/u/145644?v=3","gravatar_id":"","url":"https://api.github.com/users/idlesign","html_url":"https://github.com/idlesign","followers_url":"https://api.github.com/users/idlesign/followers","following_url":"https://api.github.com/users/idlesign/following{/other_user}","gists_url":"https://api.github.com/users/idlesign/gists{/gist_id}","starred_url":"https://api.github.com/users/idlesign/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/idlesign/subscriptions","organizations_url":"https://api.github.com/users/idlesign/orgs","repos_url":"https://api.github.com/users/idlesign/repos","events_url":"https://api.github.com/users/idlesign/events{/privacy}","received_events_url":"https://api.github.com/users/idlesign/received_events","type":"User","site_admin":false},"body":"Hi,\r\n\r\nIt is useful to be able to have metadata and other options declared in configuration files (e.g. `setup.cfg`). That not only allows some automation, but also reduces bolerplate code in some cases.\r\nSee also #394. \r\n\r\nThis chage allows us to have something like this in our config files:\r\n```\r\n[metadata]\r\nname = some_name\r\nversion = attr: some_package.VERSION\r\ndescription = Some description\r\nlong_description = file: README\r\nkeywords = one, two\r\nlicense = BSD 3-Clause License\r\n\r\n[metadata.classifiers]\r\nFramework :: Django\r\nProgramming Language :: Python :: 3.5\r\n\r\n[options]\r\nzip_safe = False\r\ninclude_package_data = True\r\npackages = find:\r\nscripts = \r\n  bin/one.py\r\n  bin/two.py\r\n\r\n[options.package_data]\r\n* = *.txt, *.rst\r\nhello = *.msg\r\n\r\n[options.extras_require]\r\npdf = ReportLab>=1.2; RXP\r\nrest = docutils>=0.3; pack ==1.1, ==1.3\r\n```\r\n\r\nCurrently every metadata and other options are supported (or I'd like to believe that). More examples in `test_config.py`.\r\nWhat I'm concerned with though is whether we need to sandbox `file:` directive which is supported by some options for security considerations (shouldn't it be impossible to read data from outside).\r\n\r\n_If overall design and implementation is fine I could update the documentation._\r\n\r\nBelow are supported ways of value definition for various options.\r\n\r\n### Terms used\r\n- **list-comma**: dangling list or comma-separated values string\r\n- **list-semi**:  dangling list or semicolon-separated values string\r\n- **bool**: `True` is `1`, `yes`, `true`\r\n- **dict**: list-comma where keys from values are separated by =\r\n- **attr**: value could be read from module attibute\r\n- **file**: value could be read from a file\r\n- **section**: values could be read from a dedicated section\r\n\r\n### Metadata\r\n- version: string or attr (iterables, callables are supported; others - through `str()`)\r\n- platforms (alias: platform): list-comma\r\n- keywords: list-comma\r\n- provides: list-comma\r\n- requires: list-comma\r\n- obsoletes: list-comma\r\n- classifiers (alias: classifier): file, section, or list-comma\r\n- license: file or string\r\n- description (alias: summary): file or string\r\n- long_description: file or string\r\n- author_email (alias: author-email): string\r\n- url (alias: home-page): string\r\n\r\n### Options\r\n- zip_safe: bool\r\n- setup_requires: list-semi\r\n- install_requires: list-semi\r\n- extras_require: section\r\n- entry_points: file, section\r\n- use_2to3: bool\r\n- use_2to3_fixers: list-comma\r\n- use_2to3_exclude_fixers: list-comma\r\n- convert_2to3_doctests: list-comma\r\n- scripts: list-comma\r\n- eager_resources: list-comma\r\n- dependency_links: list-comma\r\n- tests_require: list-semi\r\n- include_package_data: bool\r\n- packages: list-comma or find:\r\n- package_dir: dict\r\n- package_data: section\r\n- exclude_package_data: section\r\n- namespace_packages: list-comma\r\n","created_at":"2016-11-26T15:13:09Z","updated_at":"2016-12-08T15:00:29Z","closed_at":"2016-12-08T15:00:29Z","merged_at":"2016-12-08T15:00:29Z","merge_commit_sha":"3b50de37a77b2946e583ca6e83775824262cd0c9","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/pypa/setuptools/pulls/862/commits","review_comments_url":"https://api.github.com/repos/pypa/setuptools/pulls/862/comments","review_comment_url":"https://api.github.com/repos/pypa/setuptools/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pypa/setuptools/issues/862/comments","statuses_url":"https://api.github.com/repos/pypa/setuptools/statuses/a9350f32d3eeef3a1c53b243e763e60e211b72f6","head":{"label":"idlesign:feat/setupcfg_handling","ref":"feat/setupcfg_handling","sha":"a9350f32d3eeef3a1c53b243e763e60e211b72f6","user":{"login":"idlesign","id":145644,"avatar_url":"https://avatars.githubusercontent.com/u/145644?v=3","gravatar_id":"","url":"https://api.github.com/users/idlesign","html_url":"https://github.com/idlesign","followers_url":"https://api.github.com/users/idlesign/followers","following_url":"https://api.github.com/users/idlesign/following{/other_user}","gists_url":"https://api.github.com/users/idlesign/gists{/gist_id}","starred_url":"https://api.github.com/users/idlesign/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/idlesign/subscriptions","organizations_url":"https://api.github.com/users/idlesign/orgs","repos_url":"https://api.github.com/users/idlesign/repos","events_url":"https://api.github.com/users/idlesign/events{/privacy}","received_events_url":"https://api.github.com/users/idlesign/received_events","type":"User","site_admin":false},"repo":{"id":74674345,"name":"setuptools","full_name":"idlesign/setuptools","owner":{"login":"idlesign","id":145644,"avatar_url":"https://avatars.githubusercontent.com/u/145644?v=3","gravatar_id":"","url":"https://api.github.com/users/idlesign","html_url":"https://github.com/idlesign","followers_url":"https://api.github.com/users/idlesign/followers","following_url":"https://api.github.com/users/idlesign/following{/other_user}","gists_url":"https://api.github.com/users/idlesign/gists{/gist_id}","starred_url":"https://api.github.com/users/idlesign/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/idlesign/subscriptions","organizations_url":"https://api.github.com/users/idlesign/orgs","repos_url":"https://api.github.com/users/idlesign/repos","events_url":"https://api.github.com/users/idlesign/events{/privacy}","received_events_url":"https://api.github.com/users/idlesign/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/idlesign/setuptools","description":"Official project repository for the Setuptools build system","fork":true,"url":"https://api.github.com/repos/idlesign/setuptools","forks_url":"https://api.github.com/repos/idlesign/setuptools/forks","keys_url":"https://api.github.com/repos/idlesign/setuptools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/idlesign/setuptools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/idlesign/setuptools/teams","hooks_url":"https://api.github.com/repos/idlesign/setuptools/hooks","issue_events_url":"https://api.github.com/repos/idlesign/setuptools/issues/events{/number}","events_url":"https://api.github.com/repos/idlesign/setuptools/events","assignees_url":"https://api.github.com/repos/idlesign/setuptools/assignees{/user}","branches_url":"https://api.github.com/repos/idlesign/setuptools/branches{/branch}","tags_url":"https://api.github.com/repos/idlesign/setuptools/tags","blobs_url":"https://api.github.com/repos/idlesign/setuptools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/idlesign/setuptools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/idlesign/setuptools/git/refs{/sha}","trees_url":"https://api.github.com/repos/idlesign/setuptools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/idlesign/setuptools/statuses/{sha}","languages_url":"https://api.github.com/repos/idlesign/setuptools/languages","stargazers_url":"https://api.github.com/repos/idlesign/setuptools/stargazers","contributors_url":"https://api.github.com/repos/idlesign/setuptools/contributors","subscribers_url":"https://api.github.com/repos/idlesign/setuptools/subscribers","subscription_url":"https://api.github.com/repos/idlesign/setuptools/subscription","commits_url":"https://api.github.com/repos/idlesign/setuptools/commits{/sha}","git_commits_url":"https://api.github.com/repos/idlesign/setuptools/git/commits{/sha}","comments_url":"https://api.github.com/repos/idlesign/setuptools/comments{/number}","issue_comment_url":"https://api.github.com/repos/idlesign/setuptools/issues/comments{/number}","contents_url":"https://api.github.com/repos/idlesign/setuptools/contents/{+path}","compare_url":"https://api.github.com/repos/idlesign/setuptools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/idlesign/setuptools/merges","archive_url":"https://api.github.com/repos/idlesign/setuptools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/idlesign/setuptools/downloads","issues_url":"https://api.github.com/repos/idlesign/setuptools/issues{/number}","pulls_url":"https://api.github.com/repos/idlesign/setuptools/pulls{/number}","milestones_url":"https://api.github.com/repos/idlesign/setuptools/milestones{/number}","notifications_url":"https://api.github.com/repos/idlesign/setuptools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/idlesign/setuptools/labels{/name}","releases_url":"https://api.github.com/repos/idlesign/setuptools/releases{/id}","deployments_url":"https://api.github.com/repos/idlesign/setuptools/deployments","created_at":"2016-11-24T13:10:07Z","updated_at":"2016-11-24T13:10:09Z","pushed_at":"2016-12-07T13:21:37Z","git_url":"git://github.com/idlesign/setuptools.git","ssh_url":"git@github.com:idlesign/setuptools.git","clone_url":"https://github.com/idlesign/setuptools.git","svn_url":"https://github.com/idlesign/setuptools","homepage":"https://pypi.python.org/pypi/setuptools","size":29932,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pypa:master","ref":"master","sha":"aac9f9f31c0fdb97c52e343be6b8a641b2341232","user":{"login":"pypa","id":647025,"avatar_url":"https://avatars.githubusercontent.com/u/647025?v=3","gravatar_id":"","url":"https://api.github.com/users/pypa","html_url":"https://github.com/pypa","followers_url":"https://api.github.com/users/pypa/followers","following_url":"https://api.github.com/users/pypa/following{/other_user}","gists_url":"https://api.github.com/users/pypa/gists{/gist_id}","starred_url":"https://api.github.com/users/pypa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pypa/subscriptions","organizations_url":"https://api.github.com/users/pypa/orgs","repos_url":"https://api.github.com/users/pypa/repos","events_url":"https://api.github.com/users/pypa/events{/privacy}","received_events_url":"https://api.github.com/users/pypa/received_events","type":"Organization","site_admin":false},"repo":{"id":54980593,"name":"setuptools","full_name":"pypa/setuptools","owner":{"login":"pypa","id":647025,"avatar_url":"https://avatars.githubusercontent.com/u/647025?v=3","gravatar_id":"","url":"https://api.github.com/users/pypa","html_url":"https://github.com/pypa","followers_url":"https://api.github.com/users/pypa/followers","following_url":"https://api.github.com/users/pypa/following{/other_user}","gists_url":"https://api.github.com/users/pypa/gists{/gist_id}","starred_url":"https://api.github.com/users/pypa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pypa/subscriptions","organizations_url":"https://api.github.com/users/pypa/orgs","repos_url":"https://api.github.com/users/pypa/repos","events_url":"https://api.github.com/users/pypa/events{/privacy}","received_events_url":"https://api.github.com/users/pypa/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pypa/setuptools","description":"Official project repository for the Setuptools build system","fork":false,"url":"https://api.github.com/repos/pypa/setuptools","forks_url":"https://api.github.com/repos/pypa/setuptools/forks","keys_url":"https://api.github.com/repos/pypa/setuptools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pypa/setuptools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pypa/setuptools/teams","hooks_url":"https://api.github.com/repos/pypa/setuptools/hooks","issue_events_url":"https://api.github.com/repos/pypa/setuptools/issues/events{/number}","events_url":"https://api.github.com/repos/pypa/setuptools/events","assignees_url":"https://api.github.com/repos/pypa/setuptools/assignees{/user}","branches_url":"https://api.github.com/repos/pypa/setuptools/branches{/branch}","tags_url":"https://api.github.com/repos/pypa/setuptools/tags","blobs_url":"https://api.github.com/repos/pypa/setuptools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pypa/setuptools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pypa/setuptools/git/refs{/sha}","trees_url":"https://api.github.com/repos/pypa/setuptools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pypa/setuptools/statuses/{sha}","languages_url":"https://api.github.com/repos/pypa/setuptools/languages","stargazers_url":"https://api.github.com/repos/pypa/setuptools/stargazers","contributors_url":"https://api.github.com/repos/pypa/setuptools/contributors","subscribers_url":"https://api.github.com/repos/pypa/setuptools/subscribers","subscription_url":"https://api.github.com/repos/pypa/setuptools/subscription","commits_url":"https://api.github.com/repos/pypa/setuptools/commits{/sha}","git_commits_url":"https://api.github.com/repos/pypa/setuptools/git/commits{/sha}","comments_url":"https://api.github.com/repos/pypa/setuptools/comments{/number}","issue_comment_url":"https://api.github.com/repos/pypa/setuptools/issues/comments{/number}","contents_url":"https://api.github.com/repos/pypa/setuptools/contents/{+path}","compare_url":"https://api.github.com/repos/pypa/setuptools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pypa/setuptools/merges","archive_url":"https://api.github.com/repos/pypa/setuptools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pypa/setuptools/downloads","issues_url":"https://api.github.com/repos/pypa/setuptools/issues{/number}","pulls_url":"https://api.github.com/repos/pypa/setuptools/pulls{/number}","milestones_url":"https://api.github.com/repos/pypa/setuptools/milestones{/number}","notifications_url":"https://api.github.com/repos/pypa/setuptools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pypa/setuptools/labels{/name}","releases_url":"https://api.github.com/repos/pypa/setuptools/releases{/id}","deployments_url":"https://api.github.com/repos/pypa/setuptools/deployments","created_at":"2016-03-29T14:02:33Z","updated_at":"2016-12-08T14:55:03Z","pushed_at":"2016-12-08T15:00:29Z","git_url":"git://github.com/pypa/setuptools.git","ssh_url":"git@github.com:pypa/setuptools.git","clone_url":"https://github.com/pypa/setuptools.git","svn_url":"https://github.com/pypa/setuptools","homepage":"https://pypi.python.org/pypi/setuptools","size":32522,"stargazers_count":143,"watchers_count":143,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":113,"mirror_url":null,"open_issues_count":251,"forks":113,"open_issues":251,"watchers":143,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pypa/setuptools/pulls/862"},"html":{"href":"https://github.com/pypa/setuptools/pull/862"},"issue":{"href":"https://api.github.com/repos/pypa/setuptools/issues/862"},"comments":{"href":"https://api.github.com/repos/pypa/setuptools/issues/862/comments"},"review_comments":{"href":"https://api.github.com/repos/pypa/setuptools/pulls/862/comments"},"review_comment":{"href":"https://api.github.com/repos/pypa/setuptools/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pypa/setuptools/pulls/862/commits"},"statuses":{"href":"https://api.github.com/repos/pypa/setuptools/statuses/a9350f32d3eeef3a1c53b243e763e60e211b72f6"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"jaraco","id":308610,"avatar_url":"https://avatars.githubusercontent.com/u/308610?v=3","gravatar_id":"","url":"https://api.github.com/users/jaraco","html_url":"https://github.com/jaraco","followers_url":"https://api.github.com/users/jaraco/followers","following_url":"https://api.github.com/users/jaraco/following{/other_user}","gists_url":"https://api.github.com/users/jaraco/gists{/gist_id}","starred_url":"https://api.github.com/users/jaraco/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jaraco/subscriptions","organizations_url":"https://api.github.com/users/jaraco/orgs","repos_url":"https://api.github.com/users/jaraco/repos","events_url":"https://api.github.com/users/jaraco/events{/privacy}","received_events_url":"https://api.github.com/users/jaraco/received_events","type":"User","site_admin":false},"comments":11,"review_comments":0,"commits":21,"additions":1168,"deletions":0,"changed_files":4}}
{"actor":{"display_login":"jaraco"}}