def post(self):
        headers = self.request.headers
        event = headers.get('X-GitHub-Event', None)

        if event == 'ping':
            self.write('pong')
        elif event == 'pull_request':
            body = tornado.escape.json_decode(self.request.body)
            repo_name = body['repository']['name']
            repo_url = body['repository']['clone_url']
            owner = body['repository']['owner']['login']
            pr_id = int(body['pull_request']['number'])
            is_open = body['pull_request']['state'] == 'open'

            # Only do anything if we are working with conda-forge, and an open PR.
            if is_open and owner == 'conda-forge':
                lint_info = linting.compute_lint_message(
                    owner, repo_name, pr_id, repo_name == 'staged-recipes')
                if lint_info:
                    msg = linting.comment_on_pr(owner, repo_name, pr_id,
                                                lint_info['message'])
                    linting.set_pr_status(owner,
                                          repo_name,
                                          lint_info,
                                          target_url=msg.html_url)
            print_rate_limiting_info()
        else:
            print('Unhandled event "{}".'.format(event))
            self.set_status(404)
            self.write_error(404)
    def post(self):
        headers = self.request.headers
        event = headers.get('X-GitHub-Event', None)

        if event == 'ping':
            self.write('pong')
        elif event == 'pull_request':
            body = tornado.escape.json_decode(self.request.body)
            repo_name = body['repository']['name']
            repo_url = body['repository']['clone_url']
            owner = body['repository']['owner']['login']
            pr_id = int(body['pull_request']['number'])
            is_open = body['pull_request']['state'] == 'open'

            # Only do anything if we are working with conda-forge, and an open PR.
            if is_open and owner == 'conda-forge':
                lint_info = linting.compute_lint_message(owner, repo_name, pr_id,
                                                         repo_name == 'staged-recipes')
                if lint_info:
                    msg = linting.comment_on_pr(owner, repo_name, pr_id, lint_info['message'])
                    linting.set_pr_status(owner, repo_name, lint_info, target_url=msg.html_url)
            print_rate_limiting_info()
        else:
            print('Unhandled event "{}".'.format(event))
            self.set_status(404)
            self.write_error(404)
    def test_bad_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.
        
        I wanted to let you know that I linted all conda-recipes in your PR (```recipes/bad_recipe```) and found some lint.
        
        Here's what I've got...
        
        
        For **recipes/bad_recipe**:
        
         * The home item is expected in the about section.
         * The license item is expected in the about section.
         * The summary item is expected in the about section.
         * The recipe must have some tests.
         * The recipe must have a `build/number` section.
         * There are 2 too many lines.  There should be one empty line at the end of the file.
         * Feedstock with the same name exists in conda-forge
         * Recipe maintainer "support" does not exist
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices',
                                    17)
        self.assert_(lint)
        self.assertMultiLineEqual(expected_message, lint['message'])
    def test_ok_recipe_beside_ignored_good_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.
        
        I just wanted to let you know that I linted all conda-recipes in your PR (```recipes/ok_recipe```) and found it was in an excellent condition.
        
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 62, True)
        self.assertMultiLineEqual(expected_message, lint['message'])
Exemple #5
0
    def test_ok_recipe_beside_ignored_good_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.
        
        I just wanted to let you know that I linted all conda-recipes in your PR (```recipes/ok_recipe```) and found it was in an excellent condition.
        
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 62, True)
        self.assertMultiLineEqual(expected_message, lint['message'])
    def test_good_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly conda-forge-admin automated user.
        
        I just wanted to let you know that I linted all conda-recipes in your PR (```good_recipe```) and found it was in an excellent condition.

        """)

        msg = compute_lint_message('conda-forge', 'conda-forge-linting-service', 4)
        self.assertMultiLineEqual(expected_message, msg)
    def test_no_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly conda-forge-admin automated user.

        I was trying to look for recipes to lint for you, but couldn't find any.
        Please ping the 'conda-forge/core' team (using the @ notation in a comment) if you believe this is a bug.
        """)

        msg = compute_lint_message('conda-forge', 'conda-forge-linting-service', 6)
        self.assertMultiLineEqual(expected_message, msg)
Exemple #8
0
    def test_no_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.

        I was trying to look for recipes to lint for you, but couldn't find any.
        Please ping the 'conda-forge/core' team (using the @ notation in a comment) if you believe this is a bug.
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 18)
        self.assert_(lint)
        self.assertMultiLineEqual(expected_message, lint['message'])
Exemple #9
0
    def test_conflict_ok_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.
        
        I was trying to look for recipes to lint for you, but it appears we have a merge conflict.
        Please try to merge or rebase with the base branch to resolve this conflict.
        
        Please ping the 'conda-forge/core' team (using the @ notation in a comment) if you believe this is a bug.
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 56)
        self.assert_(lint)
        self.assertMultiLineEqual(expected_message, lint['message'])
    def test_conflict_ok_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.
        
        I was trying to look for recipes to lint for you, but it appears we have a merge conflict.
        Please try to merge or rebase with the base branch to resolve this conflict.
        
        Please ping the 'conda-forge/core' team (using the @ notation in a comment) if you believe this is a bug.
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 56)
        self.assert_(lint)
        self.assertMultiLineEqual(expected_message, lint['message'])
Exemple #11
0
    def test_good_recipe(self):
        # a message similar to this comes out
        """
        Hi! This is the friendly automated conda-forge-linting service.

        I just wanted to let you know that I linted all conda-recipes in your PR (```recipes/good_recipe```) and found it was in an excellent condition.

        """  # noqa

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices',
                                    16)
        self.assert_(lint)
        self.assertTrue(
            "found it was in an excellent condition." in lint['message'])
    def test_mixed_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.
        
        I just wanted to let you know that I linted all conda-recipes in your PR (```recipes/hints_only```) and found it was in an excellent condition.
        
        
        I do have some suggestions for making it better though...
        
        
        For **recipes/hints_only**:
        
         * Whenever possible python packages should use pip. See https://conda-forge.org/docs/meta.html#use-pip
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 217)
        self.assert_(lint)
        self.assertMultiLineEqual(expected_message, lint['message'])
Exemple #13
0
    def test_mixed_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.
        
        I just wanted to let you know that I linted all conda-recipes in your PR (```recipes/hints_only```) and found it was in an excellent condition.
        
        
        I do have some suggestions for making it better though...
        
        
        For **recipes/hints_only**:
        
         * Whenever possible python packages should use pip. See https://conda-forge.org/docs/maintainer/adding_pkgs.html#use-pip
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 217)
        self.assert_(lint)
        self.assertMultiLineEqual(expected_message, lint['message'])
    def test_bad_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly conda-forge-admin automated user.
        
        I wanted to let you know that I linted all conda-recipes in your PR (```bad_recipes/bad_recipe```, ```good_recipe```) and found some lint.
        
        Here's what I've got...
        
        
        For **bad_recipes/bad_recipe**:
        
         * The home item is expected in the about section.
         * The license item is expected in the about section.
         * The summary item is expected in the about section.
         * The recipe could do with some maintainers listed in the "extra/recipe-maintainers" section.
         * The recipe must have some tests.
        """)

        msg = compute_lint_message('conda-forge', 'conda-forge-linting-service', 5)
        self.assertMultiLineEqual(expected_message, msg)
Exemple #15
0
    def test_bad_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.
        
        I wanted to let you know that I linted all conda-recipes in your PR (```recipes/bad_recipe```) and found some lint.
        
        Here's what I've got...
        
        
        For **recipes/bad_recipe**:
        
         * The home item is expected in the about section.
         * The license item is expected in the about section.
         * The summary item is expected in the about section.
         * The recipe could do with some maintainers listed in the `extra/recipe-maintainers` section.
         * The recipe must have some tests.
         * The recipe must have a `build/number` section.
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices',
                                    17)
        self.assert_(lint)
        self.assertMultiLineEqual(expected_message, lint['message'])
    def test_bad_recipe(self):
        expected_message = textwrap.dedent("""
        Hi! This is the friendly automated conda-forge-linting service.
        
        I wanted to let you know that I linted all conda-recipes in your PR (```recipes/bad_recipe```) and found some lint.
        
        Here's what I've got...
        
        
        For **recipes/bad_recipe**:
        
         * The home item is expected in the about section.
         * The license item is expected in the about section.
         * The summary item is expected in the about section.
         * The recipe must have some tests.
         * The recipe must have a `build/number` section.
         * There are 2 too many lines.  There should be one empty line at the end of the file.
         * Feedstock with the same name exists in conda-forge
         * Recipe maintainer "support" does not exist
        """)

        lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 17)
        self.assert_(lint)
        self.assertMultiLineEqual(expected_message, lint['message'])
 def test_lint_skip_recipe(self):
     lint = compute_lint_message('conda-forge', 'conda-forge-webservices',
                                 66)
     self.assertFalse(lint)
 def test_closed_pr(self):
     lint = compute_lint_message('conda-forge', 'conda-forge-webservices',
                                 52)
     self.assertFalse(lint)
     self.assertEqual(lint, {})
 def test_closed_pr(self):
     lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 52)
     self.assertFalse(lint)
     self.assertEqual(lint, {})
 def test_lint_skip_recipe(self):
     lint = compute_lint_message('conda-forge', 'conda-forge-webservices', 66)
     self.assertFalse(lint)