{"action":"created","comment":{"url":"https://api.github.com/repos/user-cont/colin/pulls/comments/199125150","pull_request_review_id":133183188,"id":199125150,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5OTEyNTE1MA==","diff_hunk":"@@ -0,0 +1,137 @@\n+import os\n+import sys\n+import imp\n+import re\n+import logging\n+import unittest\n+\n+from fmf import Tree\n+from colin.core.target import Target, is_compatible\n+\n+\"\"\"\n+FMF scheduler for nosetests\n+Found test via fmf files and creates dynamic testclassed based on that.\n+\"\"\"\n+\n+LOG_LEVEL = 3\n+TARGET = Target(os.environ.get(\"TARGET\"), LOG_LEVEL)\n+CHECKS = [\"colin/checks\"]\n+\n+logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n+\n+logger = logging.getLogger(__name__)\n+\n+class ExtendedTree(Tree):\n+    \"\"\"\n+    FMF Extension. Allows to use references via @ to another items -> usefull for rulesets\n+    \"\"\"\n+    def __init__(self, *args, **kwargs):\n+        super(ExtendedTree, self).__init__(*args, **kwargs)\n+\n+    def __remove_append_items(self, whole=False):\n+        \"\"\"\n+        internal method, delete all append items (ends with +)\n+        :param whole: pass thru 'whole' param to climb\n+        :return: None\n+        \"\"\"\n+        for node in self.climb(whole=whole):\n+            for key in sorted(node.data.keys()):\n+                if key.endswith('+'):\n+                    del node.data[key]\n+\n+    def references(self, patterntree, whole=False):\n+        \"\"\"\n+        resolve references in names like /a/b/c/d@.x.y or /a/b/c/@y\n+        it uses simple references schema, do not use references to another references\n+        avoid usind / in reference because actual solution creates also this tree items\n+        it is bug or feature, who knows :-)\n+        :param whole: pass thru 'whole' param to climb\n+        :param patterntree: original tree with testcases to contain parent nodes\n+        :return: None\n+        \"\"\"\n+        reference_nodes = self.prune(whole=whole, names=[\"@\"])\n+        for node in reference_nodes:\n+            node.data = node.original_data\n+            ref_item_name =  node.name.rsplit(\"@\", 1)[1]\n+            # match item what does not contain @ before nema, otherwise it match same item\n+            reference_node = patterntree.search(\"[^@]%s\" % ref_item_name)\n+            logger.debug(\"MERGING: %s @ %s\" % (node.name, reference_node.name))\n+            if not reference_node:\n+                raise ValueError(\"Unable to find reference for node: %s  via name search: %s\" %\n+                                 (node.name, ref_item_name))\n+            node.merge(parent=reference_node)\n+\n+        self.__remove_append_items(whole=whole)\n+\n+    def search(self, name):\n+        \"\"\" Search node with given name based on reqexp\"\"\"\n+        for node in self.climb():\n+            if re.search(name, node.name):\n+                return node\n+        return None\n+\n+# COPYied from: https://eli.thegreenplace.net/2014/04/02/dynamically-generating-python-test-cases\n+class DynamicClassBase(unittest.TestCase):\n+    \"\"\"\n+    Basic Derived test Class\n+    \"\"\"\n+    longMessage = True\n+\n+\n+def make_check_function():\n+    \"\"\"\n+    rename check function to test, to be able to find this function via testing frameworks\n+    :return: function\n+    \"\"\"\n+    def test(self):\n+        self.backendclass().check(TARGET)\n+    return test\n+\n+\n+def class_fmf_generator(fmfpaths):\n+    \"\"\"\n+    generates dynamic test classes for nosetest or unittest scheduler based on FMF metadata.\n+    :param fmfpaths:\n+    :return:\n+    \"\"\"\n+    test_classes = {}\n+    for fmfpath in fmfpaths:\n+        metadatatree = ExtendedTree(fmfpath)\n+        metadatatree.references(metadatatree)\n+        for node in metadatatree.climb():\n+            logger.debug(\"look at node: %s \" % node)\n+            if node.data.get(\"class\") or node.data.get(\"test\"):\n+                logger.debug(\"node (%s) contains test and class item\" % node)","path":"fmf_scheduler.py","position":104,"original_position":104,"commit_id":"1506f3a473e482f38f644643314a3b5cd4405bec","original_commit_id":"1506f3a473e482f38f644643314a3b5cd4405bec","user":{"login":"codacy-bot","id":19940114,"node_id":"MDQ6VXNlcjE5OTQwMTE0","avatar_url":"https://avatars1.githubusercontent.com/u/19940114?v=4","gravatar_id":"","url":"https://api.github.com/users/codacy-bot","html_url":"https://github.com/codacy-bot","followers_url":"https://api.github.com/users/codacy-bot/followers","following_url":"https://api.github.com/users/codacy-bot/following{/other_user}","gists_url":"https://api.github.com/users/codacy-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/codacy-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codacy-bot/subscriptions","organizations_url":"https://api.github.com/users/codacy-bot/orgs","repos_url":"https://api.github.com/users/codacy-bot/repos","events_url":"https://api.github.com/users/codacy-bot/events{/privacy}","received_events_url":"https://api.github.com/users/codacy-bot/received_events","type":"User","site_admin":false},"body":"![Codacy](https://app.codacy.com/assets/images/favicon.png) Issue found: [Specify string format arguments as logging function parameters](https://app.codacy.com/app/user-cont/colin/pullRequest?prid=1718817)","created_at":"2018-06-29T10:58:25Z","updated_at":"2018-06-29T10:58:25Z","html_url":"https://github.com/user-cont/colin/pull/141#discussion_r199125150","pull_request_url":"https://api.github.com/repos/user-cont/colin/pulls/141","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/user-cont/colin/pulls/comments/199125150"},"html":{"href":"https://github.com/user-cont/colin/pull/141#discussion_r199125150"},"pull_request":{"href":"https://api.github.com/repos/user-cont/colin/pulls/141"}}},"pull_request":{"url":"https://api.github.com/repos/user-cont/colin/pulls/141","id":191766647,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkxNzY2NjQ3","html_url":"https://github.com/user-cont/colin/pull/141","diff_url":"https://github.com/user-cont/colin/pull/141.diff","patch_url":"https://github.com/user-cont/colin/pull/141.patch","issue_url":"https://api.github.com/repos/user-cont/colin/issues/141","number":141,"state":"open","locked":false,"title":"WIP add fmf metadata support to colin","user":{"login":"jscotka","id":8735467,"node_id":"MDQ6VXNlcjg3MzU0Njc=","avatar_url":"https://avatars0.githubusercontent.com/u/8735467?v=4","gravatar_id":"","url":"https://api.github.com/users/jscotka","html_url":"https://github.com/jscotka","followers_url":"https://api.github.com/users/jscotka/followers","following_url":"https://api.github.com/users/jscotka/following{/other_user}","gists_url":"https://api.github.com/users/jscotka/gists{/gist_id}","starred_url":"https://api.github.com/users/jscotka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jscotka/subscriptions","organizations_url":"https://api.github.com/users/jscotka/orgs","repos_url":"https://api.github.com/users/jscotka/repos","events_url":"https://api.github.com/users/jscotka/events{/privacy}","received_events_url":"https://api.github.com/users/jscotka/received_events","type":"User","site_admin":false},"body":"## First initial commit\r\nfmf metadata support in colin.\r\n\r\n## TODOs:\r\n- [x]  research how to ideally solve two `__init__()` or how to check that all variables are set\r\n- [x] find way how to name tests\r\n- [x]  transform all `__init__` s to FMF compatible way\r\n- [x] find way how transform rulesets to FMF testsets\r\n- [ ] remove all duplicated stuff from colin what is already implemented by FMF\r\n\r\n### Colin output:\r\n```\r\n$  python -m colin.cli.colin list-checks\r\nmaintainer_label\r\n   -> Label 'maintainer' has to be specified.\r\n   -> The name and email of the maintainer (usually the submitter).\r\n   -> https://fedoraproject.org/wiki/Container:Guidelines#LABELS\r\n   -> maintainer, label, required\r\n\r\nfrom_tag_not_latest\r\n   -> In FROM, tag has to be specified and not 'latest'.\r\n   -> Using the 'latest' tag may cause unpredictable builds. It is recommended that a specific tag is used in the FROM.\r\n   -> https://fedoraproject.org/wiki/Container:Guidelines#FROM\r\n   -> from, dockerfile, baseimage, latest, required\r\n\r\nmaintainer_deprecated\r\n   -> Dockerfile instruction `MAINTAINER` is deprecated.\r\n   -> Replace with label 'maintainer'.\r\n   -> https://docs.docker.com/engine/reference/builder/#maintainer-deprecated\r\n   -> maintainer, dockerfile, deprecated, required\r\n```\r\n\r\n### FMF output with all metadata displayed\r\n```\r\n$ fmf show --path colin\r\n/default/default/checks/check@from_tag_not_latest\r\ncontact_email: user-cont-team@redhat.com\r\ndescription: This set contains general checks applicable to any target.\r\nname: Default ruleset for checking containers/images/dockerfiles.\r\nnames: None\r\ntags: required\r\nusable_targets: dockerfile\r\nversion: 1\r\n\r\n/default/default/checks/check@maintainer_deprecated\r\ncontact_email: user-cont-team@redhat.com\r\ndescription: This set contains general checks applicable to any target.\r\nname: Default ruleset for checking containers/images/dockerfiles.\r\nnames: None\r\ntags: required\r\nusable_targets: dockerfile\r\nversion: 1\r\n\r\n/default/default/checks/check@maintainer_label\r\ncontact_email: user-cont-team@redhat.com\r\ndescription: This set contains general checks applicable to any target.\r\nname: Default ruleset for checking containers/images/dockerfiles.\r\nnames: None\r\ntags: required\r\nversion: 1\r\n\r\n/checks/best_practices/cmd_or_entrypoint\r\nclass: CmdOrEntrypointCheck\r\ndescription: An ENTRYPOINT allows you to configure a container that will run as an executable. The main purpose of a CMD is to provide defaults for an executing container.\r\nmessage: Cmd or Entrypoint has to be specified\r\nreference_url: https://fedoraproject.org/wiki/Container:Guidelines#CMD.2FENTRYPOINT_2\r\ntags: cmd and entrypoint\r\ntest: best_practices.py\r\n\r\n/checks/best_practices/help_file_or_readme\r\nall_must_be_present: False\r\nclass: HelpFileOrReadmeCheck\r\ndescription: Just like traditional packages, containers need some 'man page' information about how they are to be used, configured, and integrated into a larger stack.\r\nfiles: /help.1 and /README.md\r\nmessage: The 'helpfile' has to be provided.\r\nreference_url: https://fedoraproject.org/wiki/Container:Guidelines#Help_File\r\ntags: filesystem, helpfile and man\r\ntest: best_practices.py\r\n\r\n/checks/best_practices/no_root\r\nclass: NoRootCheck\r\ndescription: It can be insecure to run service as root.\r\nmessage: Service should not run as root by default.\r\nreference_url: ?????\r\ntags: root and user\r\ntest: best_practices.py\r\n\r\n/checks/dockerfile/from_tag_not_latest\r\nclass: FromTagNotLatestCheck\r\ndescription: Using the 'latest' tag may cause unpredictable builds. It is recommended that a specific tag is used in the FROM.\r\nmessage: In FROM, tag has to be specified and not 'latest'.\r\nreference_url: https://fedoraproject.org/wiki/Container:Guidelines#FROM\r\ntags: from, dockerfile, baseimage and latest\r\ntest: dockerfile.py\r\n\r\n/checks/dockerfile/maintainer_deprecated\r\nclass: MaintainerDeprecatedCheck\r\ndescription: Replace with label 'maintainer'.\r\ninstruction: MAINTAINER\r\nmax_count: 0\r\nmessage: Dockerfile instruction `MAINTAINER` is deprecated.\r\nreference_url: https://docs.docker.com/engine/reference/builder/#maintainer-deprecated\r\ntags: maintainer, dockerfile and deprecated\r\ntest: dockerfile.py\r\n\r\n/checks/labels/maintainer_label\r\nclass: MaintainerLabelCheck\r\ndescription: The name and email of the maintainer (usually the submitter).\r\nlabels: maintainer\r\nmessage: Label 'maintainer' has to be specified.\r\nreference_url: https://fedoraproject.org/wiki/Container:Guidelines#LABELS\r\nrequired: True\r\ntags: maintainer and label\r\ntest: labels.py\r\nvalue_regex: None\r\n```\r\n\r\n## current same output\r\n### FMF + nosetests\r\n```\r\n$ TARGET=tests/data/Dockerfile nosetests -d -v fmf_scheduler.py\r\ntest (fmf_scheduler.check@from_tag_not_latest) ... ok\r\ntest (fmf_scheduler.check@maintainer_deprecated) ... ok\r\ntest (fmf_scheduler.check@maintainer_label) ... ok\r\ntest (fmf_scheduler.from_tag_not_latest) ... ok\r\ntest (fmf_scheduler.maintainer_deprecated) ... ok\r\ntest (fmf_scheduler.maintainer_label) ... ok\r\n\r\n----------------------------------------------------------------------\r\nRan 6 tests in 0.117s\r\n\r\nOK\r\n```\r\n### colin\r\n```\r\n$  python -m colin.cli.colin check tests/data/Dockerfile\r\nFAIL:Label 'maintainer' has to be specified.\r\nPASS:In FROM, tag has to be specified and not 'latest'.\r\nPASS:Dockerfile instruction `MAINTAINER` is deprecated.\r\n\r\nFAIL:1 PASS:2 \r\n```\r\n","created_at":"2018-05-31T14:11:12Z","updated_at":"2018-06-29T10:58:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cf0303e9c9efe23e595c87aa11855a0d99a76054","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/user-cont/colin/pulls/141/commits","review_comments_url":"https://api.github.com/repos/user-cont/colin/pulls/141/comments","review_comment_url":"https://api.github.com/repos/user-cont/colin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/user-cont/colin/issues/141/comments","statuses_url":"https://api.github.com/repos/user-cont/colin/statuses/1506f3a473e482f38f644643314a3b5cd4405bec","head":{"label":"jscotka:fmf_metadata","ref":"fmf_metadata","sha":"1506f3a473e482f38f644643314a3b5cd4405bec","user":{"login":"jscotka","id":8735467,"node_id":"MDQ6VXNlcjg3MzU0Njc=","avatar_url":"https://avatars0.githubusercontent.com/u/8735467?v=4","gravatar_id":"","url":"https://api.github.com/users/jscotka","html_url":"https://github.com/jscotka","followers_url":"https://api.github.com/users/jscotka/followers","following_url":"https://api.github.com/users/jscotka/following{/other_user}","gists_url":"https://api.github.com/users/jscotka/gists{/gist_id}","starred_url":"https://api.github.com/users/jscotka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jscotka/subscriptions","organizations_url":"https://api.github.com/users/jscotka/orgs","repos_url":"https://api.github.com/users/jscotka/repos","events_url":"https://api.github.com/users/jscotka/events{/privacy}","received_events_url":"https://api.github.com/users/jscotka/received_events","type":"User","site_admin":false},"repo":{"id":135155805,"node_id":"MDEwOlJlcG9zaXRvcnkxMzUxNTU4MDU=","name":"colin","full_name":"jscotka/colin","owner":{"login":"jscotka","id":8735467,"node_id":"MDQ6VXNlcjg3MzU0Njc=","avatar_url":"https://avatars0.githubusercontent.com/u/8735467?v=4","gravatar_id":"","url":"https://api.github.com/users/jscotka","html_url":"https://github.com/jscotka","followers_url":"https://api.github.com/users/jscotka/followers","following_url":"https://api.github.com/users/jscotka/following{/other_user}","gists_url":"https://api.github.com/users/jscotka/gists{/gist_id}","starred_url":"https://api.github.com/users/jscotka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jscotka/subscriptions","organizations_url":"https://api.github.com/users/jscotka/orgs","repos_url":"https://api.github.com/users/jscotka/repos","events_url":"https://api.github.com/users/jscotka/events{/privacy}","received_events_url":"https://api.github.com/users/jscotka/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jscotka/colin","description":"Tool to check generic rules/best-practices for containers/images/dockerfiles.","fork":true,"url":"https://api.github.com/repos/jscotka/colin","forks_url":"https://api.github.com/repos/jscotka/colin/forks","keys_url":"https://api.github.com/repos/jscotka/colin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jscotka/colin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jscotka/colin/teams","hooks_url":"https://api.github.com/repos/jscotka/colin/hooks","issue_events_url":"https://api.github.com/repos/jscotka/colin/issues/events{/number}","events_url":"https://api.github.com/repos/jscotka/colin/events","assignees_url":"https://api.github.com/repos/jscotka/colin/assignees{/user}","branches_url":"https://api.github.com/repos/jscotka/colin/branches{/branch}","tags_url":"https://api.github.com/repos/jscotka/colin/tags","blobs_url":"https://api.github.com/repos/jscotka/colin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jscotka/colin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jscotka/colin/git/refs{/sha}","trees_url":"https://api.github.com/repos/jscotka/colin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jscotka/colin/statuses/{sha}","languages_url":"https://api.github.com/repos/jscotka/colin/languages","stargazers_url":"https://api.github.com/repos/jscotka/colin/stargazers","contributors_url":"https://api.github.com/repos/jscotka/colin/contributors","subscribers_url":"https://api.github.com/repos/jscotka/colin/subscribers","subscription_url":"https://api.github.com/repos/jscotka/colin/subscription","commits_url":"https://api.github.com/repos/jscotka/colin/commits{/sha}","git_commits_url":"https://api.github.com/repos/jscotka/colin/git/commits{/sha}","comments_url":"https://api.github.com/repos/jscotka/colin/comments{/number}","issue_comment_url":"https://api.github.com/repos/jscotka/colin/issues/comments{/number}","contents_url":"https://api.github.com/repos/jscotka/colin/contents/{+path}","compare_url":"https://api.github.com/repos/jscotka/colin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jscotka/colin/merges","archive_url":"https://api.github.com/repos/jscotka/colin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jscotka/colin/downloads","issues_url":"https://api.github.com/repos/jscotka/colin/issues{/number}","pulls_url":"https://api.github.com/repos/jscotka/colin/pulls{/number}","milestones_url":"https://api.github.com/repos/jscotka/colin/milestones{/number}","notifications_url":"https://api.github.com/repos/jscotka/colin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jscotka/colin/labels{/name}","releases_url":"https://api.github.com/repos/jscotka/colin/releases{/id}","deployments_url":"https://api.github.com/repos/jscotka/colin/deployments","created_at":"2018-05-28T12:07:20Z","updated_at":"2018-05-28T12:07:21Z","pushed_at":"2018-06-29T10:56:32Z","git_url":"git://github.com/jscotka/colin.git","ssh_url":"git@github.com:jscotka/colin.git","clone_url":"https://github.com/jscotka/colin.git","svn_url":"https://github.com/jscotka/colin","homepage":null,"size":5717,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"user-cont:master","ref":"master","sha":"536329f1f0d13b1fb20499114c3c4cb0b811883e","user":{"login":"user-cont","id":35456931,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1NDU2OTMx","avatar_url":"https://avatars1.githubusercontent.com/u/35456931?v=4","gravatar_id":"","url":"https://api.github.com/users/user-cont","html_url":"https://github.com/user-cont","followers_url":"https://api.github.com/users/user-cont/followers","following_url":"https://api.github.com/users/user-cont/following{/other_user}","gists_url":"https://api.github.com/users/user-cont/gists{/gist_id}","starred_url":"https://api.github.com/users/user-cont/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/user-cont/subscriptions","organizations_url":"https://api.github.com/users/user-cont/orgs","repos_url":"https://api.github.com/users/user-cont/repos","events_url":"https://api.github.com/users/user-cont/events{/privacy}","received_events_url":"https://api.github.com/users/user-cont/received_events","type":"Organization","site_admin":false},"repo":{"id":124359252,"node_id":"MDEwOlJlcG9zaXRvcnkxMjQzNTkyNTI=","name":"colin","full_name":"user-cont/colin","owner":{"login":"user-cont","id":35456931,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1NDU2OTMx","avatar_url":"https://avatars1.githubusercontent.com/u/35456931?v=4","gravatar_id":"","url":"https://api.github.com/users/user-cont","html_url":"https://github.com/user-cont","followers_url":"https://api.github.com/users/user-cont/followers","following_url":"https://api.github.com/users/user-cont/following{/other_user}","gists_url":"https://api.github.com/users/user-cont/gists{/gist_id}","starred_url":"https://api.github.com/users/user-cont/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/user-cont/subscriptions","organizations_url":"https://api.github.com/users/user-cont/orgs","repos_url":"https://api.github.com/users/user-cont/repos","events_url":"https://api.github.com/users/user-cont/events{/privacy}","received_events_url":"https://api.github.com/users/user-cont/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/user-cont/colin","description":"Tool to check generic rules/best-practices for containers/images/dockerfiles.","fork":false,"url":"https://api.github.com/repos/user-cont/colin","forks_url":"https://api.github.com/repos/user-cont/colin/forks","keys_url":"https://api.github.com/repos/user-cont/colin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/user-cont/colin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/user-cont/colin/teams","hooks_url":"https://api.github.com/repos/user-cont/colin/hooks","issue_events_url":"https://api.github.com/repos/user-cont/colin/issues/events{/number}","events_url":"https://api.github.com/repos/user-cont/colin/events","assignees_url":"https://api.github.com/repos/user-cont/colin/assignees{/user}","branches_url":"https://api.github.com/repos/user-cont/colin/branches{/branch}","tags_url":"https://api.github.com/repos/user-cont/colin/tags","blobs_url":"https://api.github.com/repos/user-cont/colin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/user-cont/colin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/user-cont/colin/git/refs{/sha}","trees_url":"https://api.github.com/repos/user-cont/colin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/user-cont/colin/statuses/{sha}","languages_url":"https://api.github.com/repos/user-cont/colin/languages","stargazers_url":"https://api.github.com/repos/user-cont/colin/stargazers","contributors_url":"https://api.github.com/repos/user-cont/colin/contributors","subscribers_url":"https://api.github.com/repos/user-cont/colin/subscribers","subscription_url":"https://api.github.com/repos/user-cont/colin/subscription","commits_url":"https://api.github.com/repos/user-cont/colin/commits{/sha}","git_commits_url":"https://api.github.com/repos/user-cont/colin/git/commits{/sha}","comments_url":"https://api.github.com/repos/user-cont/colin/comments{/number}","issue_comment_url":"https://api.github.com/repos/user-cont/colin/issues/comments{/number}","contents_url":"https://api.github.com/repos/user-cont/colin/contents/{+path}","compare_url":"https://api.github.com/repos/user-cont/colin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/user-cont/colin/merges","archive_url":"https://api.github.com/repos/user-cont/colin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/user-cont/colin/downloads","issues_url":"https://api.github.com/repos/user-cont/colin/issues{/number}","pulls_url":"https://api.github.com/repos/user-cont/colin/pulls{/number}","milestones_url":"https://api.github.com/repos/user-cont/colin/milestones{/number}","notifications_url":"https://api.github.com/repos/user-cont/colin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/user-cont/colin/labels{/name}","releases_url":"https://api.github.com/repos/user-cont/colin/releases{/id}","deployments_url":"https://api.github.com/repos/user-cont/colin/deployments","created_at":"2018-03-08T08:15:35Z","updated_at":"2018-06-22T12:31:31Z","pushed_at":"2018-06-29T10:56:34Z","git_url":"git://github.com/user-cont/colin.git","ssh_url":"git@github.com:user-cont/colin.git","clone_url":"https://github.com/user-cont/colin.git","svn_url":"https://github.com/user-cont/colin","homepage":null,"size":5719,"stargazers_count":9,"watchers_count":9,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"archived":false,"open_issues_count":22,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":7,"open_issues":22,"watchers":9,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/user-cont/colin/pulls/141"},"html":{"href":"https://github.com/user-cont/colin/pull/141"},"issue":{"href":"https://api.github.com/repos/user-cont/colin/issues/141"},"comments":{"href":"https://api.github.com/repos/user-cont/colin/issues/141/comments"},"review_comments":{"href":"https://api.github.com/repos/user-cont/colin/pulls/141/comments"},"review_comment":{"href":"https://api.github.com/repos/user-cont/colin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/user-cont/colin/pulls/141/commits"},"statuses":{"href":"https://api.github.com/repos/user-cont/colin/statuses/1506f3a473e482f38f644643314a3b5cd4405bec"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"codacy-bot"}}