)]}'
{"doc/source/index.rst":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"c12199a8f8f39e7a1a951f8f1052d1e314e543b3","unresolved":false,"context_lines":[{"line_number":143,"context_line":"requirements file, or to extras definied in setup.cfg - but the format"},{"line_number":144,"context_line":"is slightly different for each."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"For ``requirements.txt`` (or the other requirements files)`::"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    argparse ;python\u003d\u003d\u00272.6\u0027"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a016987_bfa1b6ab","line":146,"updated":"2015-05-15 07:14:34.000000000","message":"Please just specify requirements.txt (semantics for test-requires are undefined, and we\u0027re going to deprecate requirements-PYN.txt.","commit_id":"7f23f1907d36316ccde133fd8d6d676607b3e90c"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"773402b359ffdfa0bc060b1b0c48920084c11656","unresolved":false,"context_lines":[{"line_number":143,"context_line":"requirements file, or to extras definied in setup.cfg - but the format"},{"line_number":144,"context_line":"is slightly different for each."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"For ``requirements.txt`` (or the other requirements files)`::"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    argparse ;python\u003d\u003d\u00272.6\u0027"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"7a016987_5f03e273","line":146,"in_reply_to":"7a016987_bfa1b6ab","updated":"2015-05-15 07:19:07.000000000","message":"Done","commit_id":"7f23f1907d36316ccde133fd8d6d676607b3e90c"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"62cfa639e3e78cbd3a981b9979d51c968f53178b","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"For ``requirements.txt``::"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    argparse ;python\u003d\u003d\u00272.6\u0027"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"will result in the package depending on ``argparse`` only if it\u0027s being"},{"line_number":151,"context_line":"installed into python2.6"}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a016987_423b05d2","line":148,"updated":"2015-05-15 07:47:44.000000000","message":"pip uses \"; \" (colon, space) separator, not \" ;\" (space, colon). Please write \"argparse; python\u003d\u003d\u00272.6\u0027\".\n\n\";\" alone doesn\u0027t work because you can use an URL, and \";\" is common in URLs.\n\nSee the merged pull request for the discussion:\nhttps://github.com/pypa/pip/pull/1472","commit_id":"83b6ccf8b27f76ad3fa3466d9d0640d1dde28e32"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7e4cac176f5b183a205e7662822581f6dc230f1d","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"For ``requirements.txt``::"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    argparse ;python\u003d\u003d\u00272.6\u0027"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"will result in the package depending on ``argparse`` only if it\u0027s being"},{"line_number":151,"context_line":"installed into python2.6"}],"source_content_type":"text/x-rst","patch_set":18,"id":"7a016987_09f6508f","line":148,"in_reply_to":"7a016987_423b05d2","updated":"2015-05-15 11:30:53.000000000","message":"I\u0027ve switched test and docs to use \u0027; \u0027. Had to tweak the code to strip leading whitespace from the env marker.","commit_id":"83b6ccf8b27f76ad3fa3466d9d0640d1dde28e32"}],"pbr/tests/test_packaging.py":[{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"6430c288a2b6d90b3577750fde86862aa4919961","unresolved":false,"context_lines":[{"line_number":450,"context_line":"        repo.commit()"},{"line_number":451,"context_line":"        os.chdir(tempdir)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"        self._run_cmd(sys.executable, (setup_py, \u0027egg_info\u0027))"},{"line_number":454,"context_line":"        egg_info \u003d os.path.join(tempdir, \u0027test_reqparse.egg-info\u0027)"},{"line_number":455,"context_line":"        base_dir \u003d os.path.dirname(egg_info)"},{"line_number":456,"context_line":"        metadata \u003d pkg_resources.PathMetadata(base_dir, egg_info)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a016987_e0ec4591","line":453,"updated":"2015-05-14 16:40:38.000000000","message":"This isn\u0027t producing an egg_info.","commit_id":"4d31519a30e3c3ea4fa4894be44d154caeb81ca3"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"6430c288a2b6d90b3577750fde86862aa4919961","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        quux_req \u003d Requirement.parse(\u0027quux\u003c1.0\u0027)"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        #self.assertEqual([bar_req], d.requires())"},{"line_number":468,"context_line":"        #self.assertEqual([bar_req,foo_req,baz_req])"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a016987_a0ad2d33","line":468,"updated":"2015-05-14 16:40:38.000000000","message":"should be d.requires([\u0027test\u0027])","commit_id":"4d31519a30e3c3ea4fa4894be44d154caeb81ca3"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":41,"context_line":"import os"},{"line_number":42,"context_line":"import re"},{"line_number":43,"context_line":"import pkg_resources"},{"line_number":44,"context_line":"from pkg_resources import Requirement"},{"line_number":45,"context_line":"import shutil"},{"line_number":46,"context_line":"import sys"},{"line_number":47,"context_line":"import tempfile"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_bbbb11c4","line":44,"updated":"2015-05-15 01:16:04.000000000","message":"pkg_resoures is third party.","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        self.repo.tag(\u00271.3.0.0a1\u0027)"},{"line_number":422,"context_line":"        version \u003d packaging._get_version_from_git()"},{"line_number":423,"context_line":"        self.assertEqual(\u00271.3.0.0a1\u0027, version)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"class TestRequirementParsing(base.BaseTestCase):"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def test_requirement_parsing(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_7bb599cb","line":424,"updated":"2015-05-15 01:16:04.000000000","message":"Two lines VWS between top level constructs","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        self.repo.tag(\u00271.3.0.0a1\u0027)"},{"line_number":422,"context_line":"        version \u003d packaging._get_version_from_git()"},{"line_number":423,"context_line":"        self.assertEqual(\u00271.3.0.0a1\u0027, version)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"class TestRequirementParsing(base.BaseTestCase):"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def test_requirement_parsing(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_fe1a976d","line":424,"in_reply_to":"7a016987_7bb599cb","updated":"2015-05-15 01:53:02.000000000","message":"Done","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":425,"context_line":"class TestRequirementParsing(base.BaseTestCase):"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def test_requirement_parsing(self):"},{"line_number":428,"context_line":"        tempdir \u003d tempfile.mkdtemp()"},{"line_number":429,"context_line":"        repo \u003d self.useFixture(TestRepo(tempdir))"},{"line_number":430,"context_line":"        requirements \u003d os.path.join(tempdir, \u0027requirements.txt\u0027)"},{"line_number":431,"context_line":"        with open(requirements, \u0027w\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_5bf9bd7f","line":428,"updated":"2015-05-15 01:16:04.000000000","message":"you leak this dir, please use TempDir:\n\n tempdir \u003d self.useFixture(TempDir()).path","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":425,"context_line":"class TestRequirementParsing(base.BaseTestCase):"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def test_requirement_parsing(self):"},{"line_number":428,"context_line":"        tempdir \u003d tempfile.mkdtemp()"},{"line_number":429,"context_line":"        repo \u003d self.useFixture(TestRepo(tempdir))"},{"line_number":430,"context_line":"        requirements \u003d os.path.join(tempdir, \u0027requirements.txt\u0027)"},{"line_number":431,"context_line":"        with open(requirements, \u0027w\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_7e2587a9","line":428,"in_reply_to":"7a016987_5bf9bd7f","updated":"2015-05-15 01:53:02.000000000","message":"Done","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        tempdir \u003d tempfile.mkdtemp()"},{"line_number":429,"context_line":"        repo \u003d self.useFixture(TestRepo(tempdir))"},{"line_number":430,"context_line":"        requirements \u003d os.path.join(tempdir, \u0027requirements.txt\u0027)"},{"line_number":431,"context_line":"        with open(requirements, \u0027w\u0027) as f:"},{"line_number":432,"context_line":"            f.write(textwrap.dedent(six.u(\"\"\""},{"line_number":433,"context_line":"                bar"},{"line_number":434,"context_line":"                quux\u003c1.0 ;python_version\u003d\u003d\u00272.6\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_7b1119ac","line":431,"updated":"2015-05-15 01:16:04.000000000","message":"This is a text file, should request wt.","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        tempdir \u003d tempfile.mkdtemp()"},{"line_number":429,"context_line":"        repo \u003d self.useFixture(TestRepo(tempdir))"},{"line_number":430,"context_line":"        requirements \u003d os.path.join(tempdir, \u0027requirements.txt\u0027)"},{"line_number":431,"context_line":"        with open(requirements, \u0027w\u0027) as f:"},{"line_number":432,"context_line":"            f.write(textwrap.dedent(six.u(\"\"\""},{"line_number":433,"context_line":"                bar"},{"line_number":434,"context_line":"                quux\u003c1.0 ;python_version\u003d\u003d\u00272.6\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_5e3bebd1","line":431,"in_reply_to":"7a016987_7b1119ac","updated":"2015-05-15 01:53:02.000000000","message":"Done","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                    baz\u003e3.2 :python_version\u003d\u003d\u00272.7\u0027"},{"line_number":446,"context_line":"            \"\"\")))"},{"line_number":447,"context_line":"        expected_requirements \u003d {"},{"line_number":448,"context_line":"            None: [\u0027bar\u0027],"},{"line_number":449,"context_line":"            \":python_version\u003d\u003d\u00272.6\u0027\": [\u0027quux\u003c1.0\u0027],"},{"line_number":450,"context_line":"            \"test:python_version\u003d\u003d\u00272.7\u0027\": [\u0027baz\u003e3.2\u0027],"},{"line_number":451,"context_line":"            \"test\": [\u0027foo\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_1b2105fc","line":448,"updated":"2015-05-15 01:16:04.000000000","message":"None?","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                    baz\u003e3.2 :python_version\u003d\u003d\u00272.7\u0027"},{"line_number":446,"context_line":"            \"\"\")))"},{"line_number":447,"context_line":"        expected_requirements \u003d {"},{"line_number":448,"context_line":"            None: [\u0027bar\u0027],"},{"line_number":449,"context_line":"            \":python_version\u003d\u003d\u00272.6\u0027\": [\u0027quux\u003c1.0\u0027],"},{"line_number":450,"context_line":"            \"test:python_version\u003d\u003d\u00272.7\u0027\": [\u0027baz\u003e3.2\u0027],"},{"line_number":451,"context_line":"            \"test\": [\u0027foo\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_3e3f0fb6","line":448,"in_reply_to":"7a016987_1b2105fc","updated":"2015-05-15 01:53:02.000000000","message":"Yep, that\u0027s what Requirements returns.\n\nhttps://pythonhosted.org/setuptools/pkg_resources.html#parsing-utilities - \" If there are any non-blank, non-comment lines before the first section header, they’re yielded in a first section of None.\"\n\nIt\u0027s a little odd because elsewhere we use the empty string as the key for this section; but I think this will validate that the right data is written into the file.\n\nMaybe it\u0027s worth a comment explaining this though...","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        }"},{"line_number":453,"context_line":"        setup_py \u003d os.path.join(tempdir, \u0027setup.py\u0027)"},{"line_number":454,"context_line":"        shutil.copyfile(os.path.join(self.package_dir, \u0027setup.py\u0027),"},{"line_number":455,"context_line":"                        setup_py)"},{"line_number":456,"context_line":"        repo.commit()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        self._run_cmd(sys.executable, (setup_py, \u0027egg_info\u0027), allow_fail\u003dFalse, cwd\u003dtempdir)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_9b83b5cc","line":455,"updated":"2015-05-15 01:16:04.000000000","message":"This stands out - since everything else is explicit, but this is hidden state.","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        }"},{"line_number":453,"context_line":"        setup_py \u003d os.path.join(tempdir, \u0027setup.py\u0027)"},{"line_number":454,"context_line":"        shutil.copyfile(os.path.join(self.package_dir, \u0027setup.py\u0027),"},{"line_number":455,"context_line":"                        setup_py)"},{"line_number":456,"context_line":"        repo.commit()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        self._run_cmd(sys.executable, (setup_py, \u0027egg_info\u0027), allow_fail\u003dFalse, cwd\u003dtempdir)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_5efacbbe","line":455,"in_reply_to":"7a016987_9b83b5cc","updated":"2015-05-15 01:53:02.000000000","message":"Done","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        setup_py \u003d os.path.join(tempdir, \u0027setup.py\u0027)"},{"line_number":454,"context_line":"        shutil.copyfile(os.path.join(self.package_dir, \u0027setup.py\u0027),"},{"line_number":455,"context_line":"                        setup_py)"},{"line_number":456,"context_line":"        repo.commit()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        self._run_cmd(sys.executable, (setup_py, \u0027egg_info\u0027), allow_fail\u003dFalse, cwd\u003dtempdir)"},{"line_number":459,"context_line":"        egg_info \u003d os.path.join(tempdir, \u0027test_reqparse.egg-info\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_7b88f9e7","line":456,"updated":"2015-05-15 01:16:04.000000000","message":"no need to commit, at least I think I fixed all the bugs around uncommitted initial work","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        setup_py \u003d os.path.join(tempdir, \u0027setup.py\u0027)"},{"line_number":454,"context_line":"        shutil.copyfile(os.path.join(self.package_dir, \u0027setup.py\u0027),"},{"line_number":455,"context_line":"                        setup_py)"},{"line_number":456,"context_line":"        repo.commit()"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        self._run_cmd(sys.executable, (setup_py, \u0027egg_info\u0027), allow_fail\u003dFalse, cwd\u003dtempdir)"},{"line_number":459,"context_line":"        egg_info \u003d os.path.join(tempdir, \u0027test_reqparse.egg-info\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_9e260367","line":456,"in_reply_to":"7a016987_7b88f9e7","updated":"2015-05-15 01:53:02.000000000","message":"Done","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        self._run_cmd(sys.executable, (setup_py, \u0027egg_info\u0027), allow_fail\u003dFalse, cwd\u003dtempdir)"},{"line_number":459,"context_line":"        egg_info \u003d os.path.join(tempdir, \u0027test_reqparse.egg-info\u0027)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        requires_txt \u003d os.path.join(egg_info, \u0027requires.txt\u0027)"},{"line_number":462,"context_line":"        with open(requires_txt) as requires:"},{"line_number":463,"context_line":"            generated_requirements \u003d dict("}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_bb655146","line":460,"updated":"2015-05-15 01:16:04.000000000","message":"blank line for?","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        self._run_cmd(sys.executable, (setup_py, \u0027egg_info\u0027), allow_fail\u003dFalse, cwd\u003dtempdir)"},{"line_number":459,"context_line":"        egg_info \u003d os.path.join(tempdir, \u0027test_reqparse.egg-info\u0027)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        requires_txt \u003d os.path.join(egg_info, \u0027requires.txt\u0027)"},{"line_number":462,"context_line":"        with open(requires_txt) as requires:"},{"line_number":463,"context_line":"            generated_requirements \u003d dict("}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_7e2b4731","line":460,"in_reply_to":"7a016987_bb655146","updated":"2015-05-15 01:53:02.000000000","message":"Done","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        egg_info \u003d os.path.join(tempdir, \u0027test_reqparse.egg-info\u0027)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        requires_txt \u003d os.path.join(egg_info, \u0027requires.txt\u0027)"},{"line_number":462,"context_line":"        with open(requires_txt) as requires:"},{"line_number":463,"context_line":"            generated_requirements \u003d dict("},{"line_number":464,"context_line":"                pkg_resources.split_sections(requires))"},{"line_number":465,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_5b553d4e","line":462,"updated":"2015-05-15 01:16:04.000000000","message":"needs \u0027rt\u0027 here.","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        egg_info \u003d os.path.join(tempdir, \u0027test_reqparse.egg-info\u0027)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        requires_txt \u003d os.path.join(egg_info, \u0027requires.txt\u0027)"},{"line_number":462,"context_line":"        with open(requires_txt) as requires:"},{"line_number":463,"context_line":"            generated_requirements \u003d dict("},{"line_number":464,"context_line":"                pkg_resources.split_sections(requires))"},{"line_number":465,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_ded35b37","line":462,"in_reply_to":"7a016987_5b553d4e","updated":"2015-05-15 01:53:02.000000000","message":"Done","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":462,"context_line":"        with open(requires_txt) as requires:"},{"line_number":463,"context_line":"            generated_requirements \u003d dict("},{"line_number":464,"context_line":"                pkg_resources.split_sections(requires))"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        self.assertEqual(expected_requirements, generated_requirements)"},{"line_number":468,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_fb4bc9ae","line":465,"updated":"2015-05-15 01:16:04.000000000","message":"we\u0027re runnning short of \\r\\n - global shortage. Please return.","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":462,"context_line":"        with open(requires_txt) as requires:"},{"line_number":463,"context_line":"            generated_requirements \u003d dict("},{"line_number":464,"context_line":"                pkg_resources.split_sections(requires))"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        self.assertEqual(expected_requirements, generated_requirements)"},{"line_number":468,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_bed89f54","line":465,"in_reply_to":"7a016987_fb4bc9ae","updated":"2015-05-15 01:53:02.000000000","message":"Done\n\n(but my OS of choice uses \\n rather than \\r\\n, so at least I was only using up half the scarce resources and leaving a bigger pool of \\r for windows people","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f6de5972cca800f9b74de20252ead261d7d9b242","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        setup_py \u003d os.path.join(tempdir, \u0027setup.py\u0027)"},{"line_number":454,"context_line":"        with open(setup_py, \u0027wt\u0027) as f:"},{"line_number":455,"context_line":"            f.write(textwrap.dedent(six.u(\"\"\"\\"},{"line_number":456,"context_line":"                #!/usr/bin/env python"},{"line_number":457,"context_line":"                import setuptools"},{"line_number":458,"context_line":"                setuptools.setup("},{"line_number":459,"context_line":"                    setup_requires\u003d[\u0027pbr\u0027],"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a016987_1ee693b4","line":456,"updated":"2015-05-15 02:10:12.000000000","message":"It doesn\u0027t matter, but you could drop the shebang here if you wanted to.","commit_id":"df1f0688a8b894a64215cc428b94b269d68dac25"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"62cfa639e3e78cbd3a981b9979d51c968f53178b","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        with open(requirements, \u0027wt\u0027) as f:"},{"line_number":430,"context_line":"            f.write(textwrap.dedent(six.u(\"\"\"\\"},{"line_number":431,"context_line":"                bar"},{"line_number":432,"context_line":"                quux\u003c1.0 ;python_version\u003d\u003d\u00272.6\u0027"},{"line_number":433,"context_line":"            \"\"\")))"},{"line_number":434,"context_line":"        setup_cfg \u003d os.path.join(tempdir, \u0027setup.cfg\u0027)"},{"line_number":435,"context_line":"        with open(setup_cfg, \u0027wt\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_e25f910c","line":432,"updated":"2015-05-15 07:47:44.000000000","message":"ditto, please use \"; \" separator","commit_id":"83b6ccf8b27f76ad3fa3466d9d0640d1dde28e32"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7e4cac176f5b183a205e7662822581f6dc230f1d","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        with open(requirements, \u0027wt\u0027) as f:"},{"line_number":430,"context_line":"            f.write(textwrap.dedent(six.u(\"\"\"\\"},{"line_number":431,"context_line":"                bar"},{"line_number":432,"context_line":"                quux\u003c1.0 ;python_version\u003d\u003d\u00272.6\u0027"},{"line_number":433,"context_line":"            \"\"\")))"},{"line_number":434,"context_line":"        setup_cfg \u003d os.path.join(tempdir, \u0027setup.cfg\u0027)"},{"line_number":435,"context_line":"        with open(setup_cfg, \u0027wt\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_c92cb8ad","line":432,"in_reply_to":"7a016987_e25f910c","updated":"2015-05-15 11:30:53.000000000","message":"Done","commit_id":"83b6ccf8b27f76ad3fa3466d9d0640d1dde28e32"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"62cfa639e3e78cbd3a981b9979d51c968f53178b","unresolved":false,"context_lines":[{"line_number":433,"context_line":"            \"\"\")))"},{"line_number":434,"context_line":"        setup_cfg \u003d os.path.join(tempdir, \u0027setup.cfg\u0027)"},{"line_number":435,"context_line":"        with open(setup_cfg, \u0027wt\u0027) as f:"},{"line_number":436,"context_line":"            f.write(textwrap.dedent(six.u(\"\"\"\\"},{"line_number":437,"context_line":"                [metadata]"},{"line_number":438,"context_line":"                name \u003d test_reqparse"},{"line_number":439,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_02918d99","line":436,"updated":"2015-05-15 07:47:44.000000000","message":"If you don\u0027t care of Python 3.2, you can write directly u\"...\", it avoids the dependency to six. By the way, I don\u0027t see Python 3.2 in pbr classifiers.","commit_id":"83b6ccf8b27f76ad3fa3466d9d0640d1dde28e32"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"4e7a58824ac1a63926402a1104dbf3208e895233","unresolved":false,"context_lines":[{"line_number":433,"context_line":"            \"\"\")))"},{"line_number":434,"context_line":"        setup_cfg \u003d os.path.join(tempdir, \u0027setup.cfg\u0027)"},{"line_number":435,"context_line":"        with open(setup_cfg, \u0027wt\u0027) as f:"},{"line_number":436,"context_line":"            f.write(textwrap.dedent(six.u(\"\"\"\\"},{"line_number":437,"context_line":"                [metadata]"},{"line_number":438,"context_line":"                name \u003d test_reqparse"},{"line_number":439,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_e27e71ad","line":436,"in_reply_to":"7a016987_02918d99","updated":"2015-05-15 08:21:18.000000000","message":"I care for 3.2, because I use pbr in testtools etc.","commit_id":"83b6ccf8b27f76ad3fa3466d9d0640d1dde28e32"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7e4cac176f5b183a205e7662822581f6dc230f1d","unresolved":false,"context_lines":[{"line_number":433,"context_line":"            \"\"\")))"},{"line_number":434,"context_line":"        setup_cfg \u003d os.path.join(tempdir, \u0027setup.cfg\u0027)"},{"line_number":435,"context_line":"        with open(setup_cfg, \u0027wt\u0027) as f:"},{"line_number":436,"context_line":"            f.write(textwrap.dedent(six.u(\"\"\"\\"},{"line_number":437,"context_line":"                [metadata]"},{"line_number":438,"context_line":"                name \u003d test_reqparse"},{"line_number":439,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_84046515","line":436,"in_reply_to":"7a016987_02918d99","updated":"2015-05-15 11:30:53.000000000","message":"I\u0027m going to leave the six in place.","commit_id":"83b6ccf8b27f76ad3fa3466d9d0640d1dde28e32"}],"pbr/tests/test_util.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"e8cf6912c217ab89c0b7554fbcb4bc8e2f15ee07","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            config[section] \u003d dict(parser.items(section))"},{"line_number":31,"context_line":"        kwargs \u003d util.setup_cfg_to_setup_kwargs(config)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        self.assertIn(\u0027extras_require\u0027, kwargs)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_plain_extras(self):"},{"line_number":36,"context_line":"          config_path \u003d \u0027setup.cfg\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a0c5dc1_ede8e118","line":33,"updated":"2015-05-12 02:13:58.000000000","message":"What dos this actually test? Whats the test data? what setup.cfg is it reading? Why do we need to do IO to test a pure function? What value will extras_require have?","commit_id":"4780b64ababedb55aec758d49496d0dc8b3fe098"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"165627c0edbd9e4438544eb3cafd5fdfe8a98259","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            config[section] \u003d dict(parser.items(section))"},{"line_number":31,"context_line":"        kwargs \u003d util.setup_cfg_to_setup_kwargs(config)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        self.assertIn(\u0027extras_require\u0027, kwargs)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_plain_extras(self):"},{"line_number":36,"context_line":"          config_path \u003d \u0027setup.cfg\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a0c5dc1_e079df30","line":33,"in_reply_to":"9a0c5dc1_ede8e118","updated":"2015-05-12 20:30:51.000000000","message":"Thinking about this more, I broke this down to three things I want to test:\n\n* Test that \"normal\" extras get parsed okay\n* Test that a mix of normal and env_markered variables get parsed okay\n* Test that the format for the data in setup.cfg that we\u0027ve chosen actually gets parsed the way we expect\n\nI think the three tests that are left test those things; I\u0027m not sure if it\u0027s clear to someone-who-isn\u0027t-me that that\u0027s what they\u0027re doing though.","commit_id":"4780b64ababedb55aec758d49496d0dc8b3fe098"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7d3e586e0533b452c89b742d9e891c8632cd2ed9","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from six.moves import configparser"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from pbr.tests import base"},{"line_number":19,"context_line":"from pbr import util"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestExtrasRequireParsing(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_4496764d","line":19,"updated":"2015-05-13 00:56:56.000000000","message":"These are alpha sorted, according to flake8\n\nIf I reverse the order I get:\n\n./pbr/tests/test_util.py:19:1: H306  imports not in alphabetical order (pbr.util, pbr.tests.base)\nfrom pbr.tests import base\n^","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from six.moves import configparser"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from pbr.tests import base"},{"line_number":19,"context_line":"from pbr import util"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestExtrasRequireParsing(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_18c90379","line":19,"updated":"2015-05-12 23:07:31.000000000","message":"nit: alpha sort these two lines please.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7d3e586e0533b452c89b742d9e891c8632cd2ed9","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_simple_extras(self):"},{"line_number":25,"context_line":"        config \u003d {\u0027extras\u0027: {\u0027first\u0027: \u0027\\nfoo\\nbar\u0027,"},{"line_number":26,"context_line":"                             \u0027second\u0027: \u0027\\nbaz\\nfoo\u0027}}"},{"line_number":27,"context_line":"        expected_extra_requires \u003d {"},{"line_number":28,"context_line":"            \u0027first\u0027: [\u0027foo\u0027, \u0027bar\u0027],"},{"line_number":29,"context_line":"            \u0027second\u0027: [\u0027foo\u0027, \u0027baz\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_2493825d","line":26,"updated":"2015-05-13 00:56:56.000000000","message":"I agree that SafeConfigParser is not a dict; but a dict is what setup_cfg_to_setup_kwargs operates on.\n\nAround line 210, inside cfg_to_args(), the config dict is created by pulling sections out of the SCP object. It\u0027s the dict that gets passed to setup_cfg_to_setup_kwargs, not the SCP object.\n\nIf I create an SCP object here I\u0027d then have to add the code to convert it into a dict before passing it to s_c_t_s_k","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_simple_extras(self):"},{"line_number":25,"context_line":"        config \u003d {\u0027extras\u0027: {\u0027first\u0027: \u0027\\nfoo\\nbar\u0027,"},{"line_number":26,"context_line":"                             \u0027second\u0027: \u0027\\nbaz\\nfoo\u0027}}"},{"line_number":27,"context_line":"        expected_extra_requires \u003d {"},{"line_number":28,"context_line":"            \u0027first\u0027: [\u0027foo\u0027, \u0027bar\u0027],"},{"line_number":29,"context_line":"            \u0027second\u0027: [\u0027foo\u0027, \u0027baz\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_38a16795","line":26,"updated":"2015-05-12 23:07:31.000000000","message":"So I like the clarity here but, SafeConfigParser is not a dict, and it behaves differently.\n\nI suggest\n\n config_text \u003d textwrap.dedent(\"\"\"\n     [extras]\n     first \u003d \n         foo\n         bar\n     second \u003d\n         baz\n         foo\n     \"\"\")\n config \u003d configparser.SafeConfigParser()\n config.readfp(io.StringIO(config_text))\n\nThat could be a helper perhaps (that dedents makes a SCP and reads it into it).","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        }"},{"line_number":31,"context_line":"        kwargs \u003d util.setup_cfg_to_setup_kwargs(config)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        self.assertIn(\u0027extras_require\u0027, kwargs)"},{"line_number":34,"context_line":"        self.assertItemsEqual(expected_extra_requires.keys(),"},{"line_number":35,"context_line":"                              kwargs[\u0027extras_require\u0027].keys())"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_fbe2a99e","line":33,"updated":"2015-05-12 23:07:31.000000000","message":"\u0027we have an extras_require key\u0027","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7d3e586e0533b452c89b742d9e891c8632cd2ed9","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        }"},{"line_number":31,"context_line":"        kwargs \u003d util.setup_cfg_to_setup_kwargs(config)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        self.assertIn(\u0027extras_require\u0027, kwargs)"},{"line_number":34,"context_line":"        self.assertItemsEqual(expected_extra_requires.keys(),"},{"line_number":35,"context_line":"                              kwargs[\u0027extras_require\u0027].keys())"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_04a07e9e","line":33,"updated":"2015-05-13 00:56:56.000000000","message":"My thinking is that, if this assert fails, it\u0027s clear that the problem is the lack of key; if it passes but the next assert fails, it\u0027s clear that we have the key but the contents are wrong.\n\nYes, the second assert implies the first; but I dislike seeing a failed assert and having to guess which of the several things it\u0027s implicitly testing have failed.\n\nWith this extra assert, the error message is:\n\ntesttools.matchers._impl.MismatchError: \u0027extras_require\u0027 not in {\u0027long_description\u0027: False}\n\nWithout it:\n\nKeyError: \u0027extras_require\u0027\n\nThe second does indicate that the problem is the missing key, but the first gives more information.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7d3e586e0533b452c89b742d9e891c8632cd2ed9","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        self.assertIn(\u0027extras_require\u0027, kwargs)"},{"line_number":34,"context_line":"        self.assertItemsEqual(expected_extra_requires.keys(),"},{"line_number":35,"context_line":"                              kwargs[\u0027extras_require\u0027].keys())"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        for requirement in expected_extra_requires:"},{"line_number":38,"context_line":"            self.assertItemsEqual(expected_extra_requires[requirement],"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_e49c4a6b","line":35,"updated":"2015-05-13 00:56:56.000000000","message":"No, I\u0027m comparing dicts of lists. I tried this originally with a simple assertEqual, but that failed because one list under one key was in a different order in the two dicts.\n\nUsing a simple assertEqual gives this:\n\ntesttools.matchers._impl.MismatchError: !\u003d:\nreference \u003d {\u0027first\u0027: [\u0027foo\u0027, \u0027bar\u0027], \u0027second\u0027: [\u0027foo\u0027, \u0027baz\u0027]}\nactual    \u003d {\u0027first\u0027: [\u0027foo\u0027, \u0027bar\u0027], \u0027second\u0027: [\u0027baz\u0027, \u0027foo\u0027]}\n\nUpdate: actually assertItemsEqual directly on the dicts seems to do what I need - no need to do it on the keys and values seperately. So at least I can simplify that.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        self.assertIn(\u0027extras_require\u0027, kwargs)"},{"line_number":34,"context_line":"        self.assertItemsEqual(expected_extra_requires.keys(),"},{"line_number":35,"context_line":"                              kwargs[\u0027extras_require\u0027].keys())"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        for requirement in expected_extra_requires:"},{"line_number":38,"context_line":"            self.assertItemsEqual(expected_extra_requires[requirement],"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_9b9f2d03","line":35,"updated":"2015-05-12 23:07:31.000000000","message":"but thats implied here so its noise.\n\nAlso you\u0027re comparing dicts:\n\n self.assertEqual(expected_extra_requires, kwargs[\u0027extras_require\u0027])","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"2b9ec9e7ff378b7f53cd1d66c9778ad860181fdf","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        self.assertIn(\u0027extras_require\u0027, kwargs)"},{"line_number":34,"context_line":"        self.assertItemsEqual(expected_extra_requires.keys(),"},{"line_number":35,"context_line":"                              kwargs[\u0027extras_require\u0027].keys())"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        for requirement in expected_extra_requires:"},{"line_number":38,"context_line":"            self.assertItemsEqual(expected_extra_requires[requirement],"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_643a9a38","line":35,"in_reply_to":"9a0c5dc1_e49c4a6b","updated":"2015-05-13 01:05:22.000000000","message":"You\u0027re not using sets anywhere, so if you\u0027re getting different orders, something has gone wrong, either in your test data, or in your code.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7d3e586e0533b452c89b742d9e891c8632cd2ed9","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        for requirement in expected_extra_requires:"},{"line_number":38,"context_line":"            self.assertItemsEqual(expected_extra_requires[requirement],"},{"line_number":39,"context_line":"                                  kwargs[\u0027extras_require\u0027][requirement])"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_extras_with_markers_get_seperated(self):"},{"line_number":42,"context_line":"        config \u003d {\u0027extras\u0027: {"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_c4882625","line":39,"updated":"2015-05-13 00:56:56.000000000","message":"Done","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        for requirement in expected_extra_requires:"},{"line_number":38,"context_line":"            self.assertItemsEqual(expected_extra_requires[requirement],"},{"line_number":39,"context_line":"                                  kwargs[\u0027extras_require\u0027][requirement])"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_extras_with_markers_get_seperated(self):"},{"line_number":42,"context_line":"        config \u003d {\u0027extras\u0027: {"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_7ba47956","line":39,"updated":"2015-05-12 23:07:31.000000000","message":"and you can lose this.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7d3e586e0533b452c89b742d9e891c8632cd2ed9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.assertEqual(2, len(extras))"},{"line_number":50,"context_line":"        self.assertItemsEqual([\u0027bar\u0027], extras[\u0027test\u0027])"},{"line_number":51,"context_line":"        self.assertItemsEqual([\u0027foo\u0027, \u0027baz\u0027],"},{"line_number":52,"context_line":"                              extras[\"test:python_version\u003d\u003d\u00272.6\u0027\"])"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def test_sample_cfg_parsing(self):"},{"line_number":55,"context_line":"        expected_extras \u003d {\u0027test\u0027: (\"\\nfoo :python_version\u003d\u003d\u00272.6\u0027\\nbar\\n\""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_a48d3233","line":52,"updated":"2015-05-13 00:56:56.000000000","message":"I agree that it\u0027s not clear. What I really want to test is that a list of extras (some with env_markers, some without) get correctly parsed into seperate lists.\n\nSo in this case there should be one list with the key test, and one list with the key test:pyth....6\u0027 \n\nIt would probably be clearer to just specify the expected_extra_requires and compare against that again.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.assertEqual(2, len(extras))"},{"line_number":50,"context_line":"        self.assertItemsEqual([\u0027bar\u0027], extras[\u0027test\u0027])"},{"line_number":51,"context_line":"        self.assertItemsEqual([\u0027foo\u0027, \u0027baz\u0027],"},{"line_number":52,"context_line":"                              extras[\"test:python_version\u003d\u003d\u00272.6\u0027\"])"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def test_sample_cfg_parsing(self):"},{"line_number":55,"context_line":"        expected_extras \u003d {\u0027test\u0027: (\"\\nfoo :python_version\u003d\u003d\u00272.6\u0027\\nbar\\n\""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_fb9069ee","line":52,"updated":"2015-05-12 23:07:31.000000000","message":"This test is not as clear. And the assertion sizing can be tidied up too.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"7d3e586e0533b452c89b742d9e891c8632cd2ed9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        parser.read(\u0027setup.cfg\u0027)"},{"line_number":62,"context_line":"        extras \u003d dict(parser.items(\u0027extras\u0027))"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        self.assertItemsEqual(expected_extras, extras)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_84822eff","line":64,"updated":"2015-05-13 00:56:56.000000000","message":"In this case, straight euqality works - the values in this dict are only strings. Done.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        parser.read(\u0027setup.cfg\u0027)"},{"line_number":62,"context_line":"        extras \u003d dict(parser.items(\u0027extras\u0027))"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        self.assertItemsEqual(expected_extras, extras)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_bbc1d1e6","line":64,"updated":"2015-05-12 23:07:31.000000000","message":"This is nearly there, just can make it simple- straight equality.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"2b9ec9e7ff378b7f53cd1d66c9778ad860181fdf","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        parser.read(\u0027setup.cfg\u0027)"},{"line_number":62,"context_line":"        extras \u003d dict(parser.items(\u0027extras\u0027))"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        self.assertItemsEqual(expected_extras, extras)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_c41266b4","line":64,"in_reply_to":"9a0c5dc1_84822eff","updated":"2015-05-13 01:05:22.000000000","message":"Actually, now I look at this test, its entirely uninteresting. Its testing SafeConfigParser. delete it.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"2c2bd0e571a34ba4772d0a80b144ac8a85643fb9","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_simple_extras(self):"},{"line_number":25,"context_line":"        config \u003d {\u0027extras\u0027: {\u0027first\u0027: \u0027\\nfoo\\nbar\u0027,"},{"line_number":26,"context_line":"                             \u0027second\u0027: \u0027\\nbaz\\nfoo\u0027}}"},{"line_number":27,"context_line":"        expected_extra_requires \u003d {"},{"line_number":28,"context_line":"            \u0027first\u0027: [\u0027foo\u0027, \u0027bar\u0027],"},{"line_number":29,"context_line":"            \u0027second\u0027: [\u0027baz\u0027, \u0027foo\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_5e175e51","line":26,"updated":"2015-05-13 05:03:12.000000000","message":"*thinks*\n\nChanging this to a string literal would mean that each test is testing both the config parsing *and* the s_c_t_s_k parsing at the same time, which doesn\u0027t fill me with joy.\n\nOn the other hand, it means that we have confirmation that the entire flow, from text-on-disk to setup kwargs, works. At present it\u0027d be possible for the two parts to pass tests, but the output of one not work as input to the other.\n\nI like that a lot. I\u0027ll go ahead and make this change.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"b697859118548d09165c7feb44730d370a34294a","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_simple_extras(self):"},{"line_number":25,"context_line":"        config \u003d {\u0027extras\u0027: {\u0027first\u0027: \u0027\\nfoo\\nbar\u0027,"},{"line_number":26,"context_line":"                             \u0027second\u0027: \u0027\\nbaz\\nfoo\u0027}}"},{"line_number":27,"context_line":"        expected_extra_requires \u003d {"},{"line_number":28,"context_line":"            \u0027first\u0027: [\u0027foo\u0027, \u0027bar\u0027],"},{"line_number":29,"context_line":"            \u0027second\u0027: [\u0027baz\u0027, \u0027foo\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_8f35a747","line":26,"updated":"2015-05-13 02:05:26.000000000","message":"I\u0027d still like this to be a string literal with SafeConfigParser, so we know it will work. it will also make it easier to add in the install_requires test you\u0027ll need soon.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"9a2fc8f6efd684a8d452e59adf82633187b6ef3c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_simple_extras(self):"},{"line_number":25,"context_line":"        config \u003d {\u0027extras\u0027: {\u0027first\u0027: \u0027\\nfoo\\nbar\u0027,"},{"line_number":26,"context_line":"                             \u0027second\u0027: \u0027\\nbaz\\nfoo\u0027}}"},{"line_number":27,"context_line":"        expected_extra_requires \u003d {"},{"line_number":28,"context_line":"            \u0027first\u0027: [\u0027foo\u0027, \u0027bar\u0027],"},{"line_number":29,"context_line":"            \u0027second\u0027: [\u0027baz\u0027, \u0027foo\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_f283deca","line":26,"updated":"2015-05-13 10:00:54.000000000","message":"Yes, \"depends on\" is a much better way to say it.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"d73593a78c8a6e775afddf09263d52b08e9caa04","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_simple_extras(self):"},{"line_number":25,"context_line":"        config \u003d {\u0027extras\u0027: {\u0027first\u0027: \u0027\\nfoo\\nbar\u0027,"},{"line_number":26,"context_line":"                             \u0027second\u0027: \u0027\\nbaz\\nfoo\u0027}}"},{"line_number":27,"context_line":"        expected_extra_requires \u003d {"},{"line_number":28,"context_line":"            \u0027first\u0027: [\u0027foo\u0027, \u0027bar\u0027],"},{"line_number":29,"context_line":"            \u0027second\u0027: [\u0027baz\u0027, \u0027foo\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_6173a7b2","line":26,"in_reply_to":"9a0c5dc1_5e175e51","updated":"2015-05-13 05:13:47.000000000","message":"I disagree with your interpretation in your second paragraph.... It means it *depends* on the config parsing, not that we\u0027re testing it. The dependency is just one pithy way to get a SCP object.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"2c2bd0e571a34ba4772d0a80b144ac8a85643fb9","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.assertEqual(expected_extra_requires,"},{"line_number":35,"context_line":"                         kwargs[\u0027extras_require\u0027])"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_extras_with_markers_get_seperated(self):"},{"line_number":38,"context_line":"        config \u003d {\u0027extras\u0027: {"},{"line_number":39,"context_line":"            \u0027test\u0027: (\"foo :python_version\u003d\u003d\u00272.6\u0027\\nbar\\n\""},{"line_number":40,"context_line":"                     \"baz :python_version\u003d\u003d\u00272.6\u0027\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_3e0dca3e","line":37,"updated":"2015-05-13 05:03:12.000000000","message":"Fixed by getting rid of the word entirely :)","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"b697859118548d09165c7feb44730d370a34294a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.assertEqual(expected_extra_requires,"},{"line_number":35,"context_line":"                         kwargs[\u0027extras_require\u0027])"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_extras_with_markers_get_seperated(self):"},{"line_number":38,"context_line":"        config \u003d {\u0027extras\u0027: {"},{"line_number":39,"context_line":"            \u0027test\u0027: (\"foo :python_version\u003d\u003d\u00272.6\u0027\\nbar\\n\""},{"line_number":40,"context_line":"                     \"baz :python_version\u003d\u003d\u00272.6\u0027\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_2f3d9b2b","line":37,"updated":"2015-05-13 02:05:26.000000000","message":"typo btw - separated :)","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"2c2bd0e571a34ba4772d0a80b144ac8a85643fb9","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        parser.read(\u0027setup.cfg\u0027)"},{"line_number":59,"context_line":"        extras \u003d dict(parser.items(\u0027extras\u0027))"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        self.assertEqual(expected_extras, extras)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_1e0a0627","line":61,"updated":"2015-05-13 05:03:12.000000000","message":"Agree.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"b697859118548d09165c7feb44730d370a34294a","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        parser.read(\u0027setup.cfg\u0027)"},{"line_number":59,"context_line":"        extras \u003d dict(parser.items(\u0027extras\u0027))"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        self.assertEqual(expected_extras, extras)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_af174ba2","line":61,"updated":"2015-05-13 02:05:26.000000000","message":"Still think this entire method can die.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"acde7ee31a61253a212ce074ab462174b4569992","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        foo"},{"line_number":35,"context_line":"    \"\"\")"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    extras_with_markers \u003d textwrap.dedent(u\"\"\""},{"line_number":38,"context_line":"    [extras]"},{"line_number":39,"context_line":"    test \u003d"},{"line_number":40,"context_line":"        foo :python_version\u003d\u003d\u00272.6\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_ccd76322","line":37,"updated":"2015-05-14 00:56:36.000000000","message":"Please use six.u() here.","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"ee7ad738765df150744d44379edd65cb838b681d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        foo"},{"line_number":35,"context_line":"    \"\"\")"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    extras_with_markers \u003d textwrap.dedent(u\"\"\""},{"line_number":38,"context_line":"    [extras]"},{"line_number":39,"context_line":"    test \u003d"},{"line_number":40,"context_line":"        foo :python_version\u003d\u003d\u00272.6\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_fae89118","line":37,"in_reply_to":"7a016987_ccd76322","updated":"2015-05-14 04:25:05.000000000","message":"Done","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"acde7ee31a61253a212ce074ab462174b4569992","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    extras_with_markers \u003d textwrap.dedent(u\"\"\""},{"line_number":38,"context_line":"    [extras]"},{"line_number":39,"context_line":"    test \u003d"},{"line_number":40,"context_line":"        foo :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":41,"context_line":"        bar"},{"line_number":42,"context_line":"        baz\u003c1.6 :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":43,"context_line":"    \"\"\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_6ce74f13","line":40,"updated":"2015-05-14 00:56:36.000000000","message":"Make one of these be foo:python_version...\n\nso that we test the format that most folk will use (if they encounter this in setup.py files).","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"ee7ad738765df150744d44379edd65cb838b681d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    extras_with_markers \u003d textwrap.dedent(u\"\"\""},{"line_number":38,"context_line":"    [extras]"},{"line_number":39,"context_line":"    test \u003d"},{"line_number":40,"context_line":"        foo :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":41,"context_line":"        bar"},{"line_number":42,"context_line":"        baz\u003c1.6 :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":43,"context_line":"    \"\"\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_daedd526","line":40,"in_reply_to":"7a016987_6ce74f13","updated":"2015-05-14 04:25:05.000000000","message":"Done","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"acde7ee31a61253a212ce074ab462174b4569992","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    scenarios \u003d ["},{"line_number":46,"context_line":"        (\u0027simple_extras\u0027, {"},{"line_number":47,"context_line":"            \u0027config_text\u0027: simple_extras,"},{"line_number":48,"context_line":"            \u0027expected_extra_requires\u0027: {\u0027first\u0027: [\u0027foo\u0027, \u0027bar\u003d\u003d1.0\u0027],"},{"line_number":49,"context_line":"                                        \u0027second\u0027: [\u0027baz\u003e\u003d3.2\u0027, \u0027foo\u0027]}"},{"line_number":50,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_0c733b4f","line":47,"updated":"2015-05-14 00:56:36.000000000","message":"I suggest you put the inputs here, so that we can read this as a input, output pair, rather than having to traverse up the file.","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"ee7ad738765df150744d44379edd65cb838b681d","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    scenarios \u003d ["},{"line_number":46,"context_line":"        (\u0027simple_extras\u0027, {"},{"line_number":47,"context_line":"            \u0027config_text\u0027: simple_extras,"},{"line_number":48,"context_line":"            \u0027expected_extra_requires\u0027: {\u0027first\u0027: [\u0027foo\u0027, \u0027bar\u003d\u003d1.0\u0027],"},{"line_number":49,"context_line":"                                        \u0027second\u0027: [\u0027baz\u003e\u003d3.2\u0027, \u0027foo\u0027]}"},{"line_number":50,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_9af75df5","line":47,"in_reply_to":"7a016987_0c733b4f","updated":"2015-05-14 04:25:05.000000000","message":"Done","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"acde7ee31a61253a212ce074ab462174b4569992","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    ]"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_extras_parsing(self):"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        config \u003d {}"},{"line_number":64,"context_line":"        parser \u003d configparser.SafeConfigParser()"},{"line_number":65,"context_line":"        parser.readfp(io.StringIO(self.config_text))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_2cf157ce","line":62,"updated":"2015-05-14 00:56:36.000000000","message":"The leading space here is confusing my brani.","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"ee7ad738765df150744d44379edd65cb838b681d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    ]"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_extras_parsing(self):"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        config \u003d {}"},{"line_number":64,"context_line":"        parser \u003d configparser.SafeConfigParser()"},{"line_number":65,"context_line":"        parser.readfp(io.StringIO(self.config_text))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_5ada057a","line":62,"in_reply_to":"7a016987_2cf157ce","updated":"2015-05-14 04:25:05.000000000","message":"Done","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"acde7ee31a61253a212ce074ab462174b4569992","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        parser \u003d configparser.SafeConfigParser()"},{"line_number":65,"context_line":"        parser.readfp(io.StringIO(self.config_text))"},{"line_number":66,"context_line":"        for section in parser.sections():"},{"line_number":67,"context_line":"            config[section] \u003d dict(parser.items(section))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        kwargs \u003d util.setup_cfg_to_setup_kwargs(config)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_8caf2b94","line":67,"updated":"2015-05-14 00:56:36.000000000","message":"I was wrong to ask you to put this in text inputs, because I misread the code - I do like the result however :).\n\nMight want to put this machinery in a helper. So you can do this:\nsimple_extras \u003d config_from_ini(\"\"\"adasdasdasd\n\"\"\")\n\nand then the test is more focus while still being clear.","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"ee7ad738765df150744d44379edd65cb838b681d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        parser \u003d configparser.SafeConfigParser()"},{"line_number":65,"context_line":"        parser.readfp(io.StringIO(self.config_text))"},{"line_number":66,"context_line":"        for section in parser.sections():"},{"line_number":67,"context_line":"            config[section] \u003d dict(parser.items(section))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        kwargs \u003d util.setup_cfg_to_setup_kwargs(config)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_fa03f174","line":67,"in_reply_to":"7a016987_8caf2b94","updated":"2015-05-14 04:25:05.000000000","message":"Done","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"75e9139109b65ee9773aa7ddd4fce2c820008e91","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    scenarios \u003d ["},{"line_number":29,"context_line":"        (\u0027simple_extras\u0027, {"},{"line_number":30,"context_line":"            \u0027config_text\u0027: textwrap.dedent(six.u(\"\"\""},{"line_number":31,"context_line":"                [extras]"},{"line_number":32,"context_line":"                first \u003d"},{"line_number":33,"context_line":"                    foo"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a016987_5bad6730","line":30,"updated":"2015-05-14 05:25:31.000000000","message":"Since you have a helper below, you can put the textwrap.dedent and six.u calls in the helper.","commit_id":"96514931cdd2f05f78889e701fa52295b45b8927"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"d3425d062126f824c97c81e38041d86a4d28149b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    scenarios \u003d ["},{"line_number":29,"context_line":"        (\u0027simple_extras\u0027, {"},{"line_number":30,"context_line":"            \u0027config_text\u0027: textwrap.dedent(six.u(\"\"\""},{"line_number":31,"context_line":"                [extras]"},{"line_number":32,"context_line":"                first \u003d"},{"line_number":33,"context_line":"                    foo"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a016987_5b03fd42","line":30,"in_reply_to":"7a016987_5bad6730","updated":"2015-05-15 01:17:17.000000000","message":"Done locally; I\u0027ll hold off pushing this until there\u0027s more of a change to push.","commit_id":"96514931cdd2f05f78889e701fa52295b45b8927"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    scenarios \u003d ["},{"line_number":29,"context_line":"        (\u0027simple_extras\u0027, {"},{"line_number":30,"context_line":"            \u0027config_text\u0027: textwrap.dedent(six.u(\"\"\""},{"line_number":31,"context_line":"                [extras]"},{"line_number":32,"context_line":"                first \u003d"},{"line_number":33,"context_line":"                    foo"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_bb9af112","line":30,"updated":"2015-05-15 01:16:04.000000000","message":"I think this will read better if you move the dedent and u calls into config_from_ini.","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    scenarios \u003d ["},{"line_number":29,"context_line":"        (\u0027simple_extras\u0027, {"},{"line_number":30,"context_line":"            \u0027config_text\u0027: textwrap.dedent(six.u(\"\"\""},{"line_number":31,"context_line":"                [extras]"},{"line_number":32,"context_line":"                first \u003d"},{"line_number":33,"context_line":"                    foo"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_3eccaf88","line":30,"in_reply_to":"7a016987_bb9af112","updated":"2015-05-15 01:53:02.000000000","message":"Sorry, was doing this while you were commenting","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                \"\"\")),"},{"line_number":39,"context_line":"            \u0027expected_extra_requires\u0027: {\u0027first\u0027: [\u0027foo\u0027, \u0027bar\u003d\u003d1.0\u0027],"},{"line_number":40,"context_line":"                                        \u0027second\u0027: [\u0027baz\u003e\u003d3.2\u0027, \u0027foo\u0027]}"},{"line_number":41,"context_line":"        }"},{"line_number":42,"context_line":"        ),"},{"line_number":43,"context_line":"        (\u0027with_markers\u0027, {"},{"line_number":44,"context_line":"            \u0027config_text\u0027: textwrap.dedent(six.u(\"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_3bd961f4","line":41,"updated":"2015-05-15 01:16:04.000000000","message":"Personal style hint: you can put the }), together rather than split on lines.","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"09de4ea24b4f406382b85ed8f2d82f63960e8510","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                \"test:python_version\u003d\u003d\u00272.6\u0027\": [\u0027foo\u0027, \u0027baz\u003c1.6\u0027],"},{"line_number":53,"context_line":"                \"test\": [\u0027bar\u0027]}"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":"        )"},{"line_number":56,"context_line":"    ]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def config_from_ini(self, ini):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_3b004134","line":55,"updated":"2015-05-15 01:16:04.000000000","message":"Another scenario would be the corner case of no extras section at all.","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"748aea2971e87c9e0a7fe8a5eae5a6bbe8990076","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                \"test:python_version\u003d\u003d\u00272.6\u0027\": [\u0027foo\u0027, \u0027baz\u003c1.6\u0027],"},{"line_number":53,"context_line":"                \"test\": [\u0027bar\u0027]}"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":"        )"},{"line_number":56,"context_line":"    ]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def config_from_ini(self, ini):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a016987_5ea40ba5","line":55,"in_reply_to":"7a016987_3b004134","updated":"2015-05-15 01:53:02.000000000","message":"Done","commit_id":"b4a9bb7bd992a0a87709bc9223f24b023c3209b4"}],"pbr/tests/test_utils.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"230ea806468d211f5326870401f10249ad17c796","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# Copyright (C) 2013 Association of Universities for Research in Astronomy"},{"line_number":17,"context_line":"#                    (AURA)"},{"line_number":18,"context_line":"#"},{"line_number":19,"context_line":"# Redistribution and use in source and binary forms, with or without"},{"line_number":20,"context_line":"# modification, are permitted provided that the following conditions are met:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a0c5dc1_87f706f5","line":17,"updated":"2015-05-12 00:47:10.000000000","message":"This is a new file; why is it (C) AURA?","commit_id":"fc6139f2f5191d246e317ba329ddcdbb8a0aee6f"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"365c17abb4d42bad1637eaeef5a6942ac60fc03e","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"# Copyright (C) 2013 Association of Universities for Research in Astronomy"},{"line_number":17,"context_line":"#                    (AURA)"},{"line_number":18,"context_line":"#"},{"line_number":19,"context_line":"# Redistribution and use in source and binary forms, with or without"},{"line_number":20,"context_line":"# modification, are permitted provided that the following conditions are met:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a0c5dc1_873f06d6","line":17,"in_reply_to":"9a0c5dc1_87f706f5","updated":"2015-05-12 01:21:14.000000000","message":"Done","commit_id":"fc6139f2f5191d246e317ba329ddcdbb8a0aee6f"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"230ea806468d211f5326870401f10249ad17c796","unresolved":false,"context_lines":[{"line_number":41,"context_line":"try:"},{"line_number":42,"context_line":"    import ConfigParser as configparser"},{"line_number":43,"context_line":"except ImportError:"},{"line_number":44,"context_line":"    import configparser"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"import os"},{"line_number":47,"context_line":"import re"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a0c5dc1_27e73a42","line":44,"updated":"2015-05-12 00:47:10.000000000","message":"for testing we can use six.moves, though you may need to add it to test-requirements.txt","commit_id":"fc6139f2f5191d246e317ba329ddcdbb8a0aee6f"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"365c17abb4d42bad1637eaeef5a6942ac60fc03e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"try:"},{"line_number":42,"context_line":"    import ConfigParser as configparser"},{"line_number":43,"context_line":"except ImportError:"},{"line_number":44,"context_line":"    import configparser"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"import os"},{"line_number":47,"context_line":"import re"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a0c5dc1_47222ebb","line":44,"in_reply_to":"9a0c5dc1_27e73a42","updated":"2015-05-12 01:21:14.000000000","message":"Done","commit_id":"fc6139f2f5191d246e317ba329ddcdbb8a0aee6f"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"230ea806468d211f5326870401f10249ad17c796","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        config \u003d {}"},{"line_number":67,"context_line":"        for section in parser.sections():"},{"line_number":68,"context_line":"            config[section] \u003d dict(parser.items(section))"},{"line_number":69,"context_line":"        self.config \u003d config"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_extras_exist(self):"},{"line_number":72,"context_line":"        self.assertIn(\u0027extras_require\u0027, self.config)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a0c5dc1_87cee6b2","line":69,"updated":"2015-05-12 00:47:10.000000000","message":"This setup is axiomatic: you\u0027re not testing prod code, you\u0027re testing test code.\n\nAlso, since your setUp is disjoint to your tests, your tests are hard to read. Read \u0027test_extras_exist\u0027 - and tell me what its testing:)","commit_id":"fc6139f2f5191d246e317ba329ddcdbb8a0aee6f"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"365c17abb4d42bad1637eaeef5a6942ac60fc03e","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        config \u003d {}"},{"line_number":67,"context_line":"        for section in parser.sections():"},{"line_number":68,"context_line":"            config[section] \u003d dict(parser.items(section))"},{"line_number":69,"context_line":"        self.config \u003d config"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_extras_exist(self):"},{"line_number":72,"context_line":"        self.assertIn(\u0027extras_require\u0027, self.config)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a0c5dc1_ea4c4778","line":69,"in_reply_to":"9a0c5dc1_87cee6b2","updated":"2015-05-12 01:21:14.000000000","message":"It\u0027s definitely not testing the thing I wanted to test. Let me fix that.","commit_id":"fc6139f2f5191d246e317ba329ddcdbb8a0aee6f"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"230ea806468d211f5326870401f10249ad17c796","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def load_tests(loader, in_tests, pattern):"},{"line_number":95,"context_line":"    return testscenarios.load_tests_apply_scenarios(loader, in_tests, pattern)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a0c5dc1_a740ca08","line":95,"updated":"2015-05-12 00:47:10.000000000","message":"I don\u0027t see any scenarios here, so you can drop this I suspect.","commit_id":"fc6139f2f5191d246e317ba329ddcdbb8a0aee6f"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"365c17abb4d42bad1637eaeef5a6942ac60fc03e","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def load_tests(loader, in_tests, pattern):"},{"line_number":95,"context_line":"    return testscenarios.load_tests_apply_scenarios(loader, in_tests, pattern)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a0c5dc1_aa564f04","line":95,"in_reply_to":"9a0c5dc1_a740ca08","updated":"2015-05-12 01:21:14.000000000","message":"Done","commit_id":"fc6139f2f5191d246e317ba329ddcdbb8a0aee6f"}],"pbr/tests/testpackage/setup.cfg":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"85c3d9106f80c8eecaa4adf0bfb0f66d6e56e3d8","unresolved":false,"context_lines":[{"line_number":56,"context_line":"test \u003d"},{"line_number":57,"context_line":"  argparse :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":58,"context_line":"  testrepository"},{"line_number":59,"context_line":"  unittest2 :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":60,"context_line":"security \u003d pyasn1\u003e\u003d1.0 pyopenssl"}],"source_content_type":"text/x-ttcn-cfg","patch_set":3,"id":"9af37de9_dd25c65c","line":59,"updated":"2015-05-11 07:18:06.000000000","message":"yes, (though the example with unittest2 gives me cognitive dissonance, since its not a real example).","commit_id":"3adac00b7f48fb74fa9f9e408f9b8ce57faf4703"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"48f5a234cbd707a14b7bad882d27868c58077e32","unresolved":false,"context_lines":[{"line_number":56,"context_line":"test \u003d"},{"line_number":57,"context_line":"  argparse :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":58,"context_line":"  testrepository"},{"line_number":59,"context_line":"  unittest2 :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":60,"context_line":"security \u003d pyasn1\u003e\u003d1.0 pyopenssl"}],"source_content_type":"text/x-ttcn-cfg","patch_set":3,"id":"9af37de9_fdbacabf","line":59,"in_reply_to":"9af37de9_dd25c65c","updated":"2015-05-11 07:27:33.000000000","message":"Done","commit_id":"3adac00b7f48fb74fa9f9e408f9b8ce57faf4703"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"85c3d9106f80c8eecaa4adf0bfb0f66d6e56e3d8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"  argparse :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":58,"context_line":"  testrepository"},{"line_number":59,"context_line":"  unittest2 :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":60,"context_line":"security \u003d pyasn1\u003e\u003d1.0 pyopenssl"}],"source_content_type":"text/x-ttcn-cfg","patch_set":3,"id":"9af37de9_9df97ecb","line":60,"updated":"2015-05-11 07:18:06.000000000","message":"No - one per line.","commit_id":"3adac00b7f48fb74fa9f9e408f9b8ce57faf4703"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"48f5a234cbd707a14b7bad882d27868c58077e32","unresolved":false,"context_lines":[{"line_number":57,"context_line":"  argparse :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":58,"context_line":"  testrepository"},{"line_number":59,"context_line":"  unittest2 :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":60,"context_line":"security \u003d pyasn1\u003e\u003d1.0 pyopenssl"}],"source_content_type":"text/x-ttcn-cfg","patch_set":3,"id":"9af37de9_bdb442d1","line":60,"in_reply_to":"9af37de9_9df97ecb","updated":"2015-05-11 07:27:33.000000000","message":"Done","commit_id":"3adac00b7f48fb74fa9f9e408f9b8ce57faf4703"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"b697859118548d09165c7feb44730d370a34294a","unresolved":false,"context_lines":[{"line_number":59,"context_line":"  baz :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":60,"context_line":"security \u003d"},{"line_number":61,"context_line":"  secure_package\u003e\u003d1.0"},{"line_number":62,"context_line":"  secure_package_two"}],"source_content_type":"text/x-ttcn-cfg","patch_set":9,"id":"9a0c5dc1_8f0c8795","line":62,"updated":"2015-05-13 02:05:26.000000000","message":"Are these being used by anything? We might want a functional wheel test or something, so its fine to have them (but we\u0027ll want to make them be satisfiable for that).","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"2c2bd0e571a34ba4772d0a80b144ac8a85643fb9","unresolved":false,"context_lines":[{"line_number":59,"context_line":"  baz :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":60,"context_line":"security \u003d"},{"line_number":61,"context_line":"  secure_package\u003e\u003d1.0"},{"line_number":62,"context_line":"  secure_package_two"}],"source_content_type":"text/x-ttcn-cfg","patch_set":9,"id":"9a0c5dc1_fe06121f","line":62,"updated":"2015-05-13 05:03:12.000000000","message":"They\u0027re being checked as part of the third test, the one that\u0027s going to die. I\u0027ll remove them when that test dies.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"acde7ee31a61253a212ce074ab462174b4569992","unresolved":false,"context_lines":[{"line_number":59,"context_line":"  baz :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":60,"context_line":"security \u003d"},{"line_number":61,"context_line":"  secure_package\u003e\u003d1.0"},{"line_number":62,"context_line":"  secure_package_two"}],"source_content_type":"text/x-ttcn-cfg","patch_set":11,"id":"7a016987_cc93e34e","line":62,"updated":"2015-05-14 00:56:36.000000000","message":"Zombie?","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"ee7ad738765df150744d44379edd65cb838b681d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"  baz :python_version\u003d\u003d\u00272.6\u0027"},{"line_number":60,"context_line":"security \u003d"},{"line_number":61,"context_line":"  secure_package\u003e\u003d1.0"},{"line_number":62,"context_line":"  secure_package_two"}],"source_content_type":"text/x-ttcn-cfg","patch_set":11,"id":"7a016987_fa62d115","line":62,"in_reply_to":"7a016987_cc93e34e","updated":"2015-05-14 04:25:05.000000000","message":"Done","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"}],"pbr/util.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                \"dependency_links\","},{"line_number":147,"context_line":"                \"setup_requires\","},{"line_number":148,"context_line":"                \"tests_require\","},{"line_number":149,"context_line":"                \"cmdclass\",)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"# setup() arguments that contain boolean values"},{"line_number":152,"context_line":"BOOL_FIELDS \u003d (\"use_2to3\", \"zip_safe\", \"include_package_data\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_db26c5b9","line":149,"updated":"2015-05-12 23:07:31.000000000","message":"WAT?","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        kwargs[arg] \u003d in_cfg_value"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"    if \u0027extras\u0027 in config:"},{"line_number":372,"context_line":"        extras_require \u003d {}"},{"line_number":373,"context_line":"        requirement_pattern \u003d \u0027(?P\u003cpackage\u003e[^:]*)(?P\u003cenv_marker\u003e.*)\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_3bf60190","line":370,"updated":"2015-05-12 23:07:31.000000000","message":"I think this needs a comment block. Something like:\n\n # Transform extras with embedded environment markers to setuptools\u0027 supported marker-per-extra format.\n # fred \u003d \n #    foo:marker\n #    bar\n # -\u003e\n # {\u0027fred\u0027: [\u0027bar\u0027], \u0027fred:marker\u0027:[\u0027foo\u0027]}","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"    if \u0027extras\u0027 in config:"},{"line_number":372,"context_line":"        extras_require \u003d {}"},{"line_number":373,"context_line":"        requirement_pattern \u003d \u0027(?P\u003cpackage\u003e[^:]*)(?P\u003cenv_marker\u003e.*)\u0027"},{"line_number":374,"context_line":"        extras \u003d config[\u0027extras\u0027]"},{"line_number":375,"context_line":"        for extra in extras:"},{"line_number":376,"context_line":"            requirements \u003d split_multiline(extras[extra])"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_3b6601ee","line":373,"updated":"2015-05-12 23:07:31.000000000","message":"I\u0027m not sure a regex is needed, but its neither here nor there. if you\u0027re using one though, you should anchor the end, for clarity:\n\n(?P\u003cenv_marker\u003e.*)$\n\nAlso its not a package, it might be a package with specifiers. Uhm, I don\u0027t know what to call it :)","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":375,"context_line":"        for extra in extras:"},{"line_number":376,"context_line":"            requirements \u003d split_multiline(extras[extra])"},{"line_number":377,"context_line":"            for requirement in requirements:"},{"line_number":378,"context_line":"                m \u003d re.match(requirement_pattern, requirement)"},{"line_number":379,"context_line":"                if m.group(\u0027env_marker\u0027):"},{"line_number":380,"context_line":"                    extras_key \u003d \u0027%s%s\u0027 % (extra, m.group(\u0027env_marker\u0027))"},{"line_number":381,"context_line":"                    extras_value \u003d m.group(\u0027package\u0027).strip()"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_7bd6b9c6","line":378,"updated":"2015-05-12 23:07:31.000000000","message":"you can conditionally pull out extras_value here - its the same in both branches.","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"f21a31871c42910964c138f12cd2b67f7eccc0f4","unresolved":false,"context_lines":[{"line_number":376,"context_line":"            requirements \u003d split_multiline(extras[extra])"},{"line_number":377,"context_line":"            for requirement in requirements:"},{"line_number":378,"context_line":"                m \u003d re.match(requirement_pattern, requirement)"},{"line_number":379,"context_line":"                if m.group(\u0027env_marker\u0027):"},{"line_number":380,"context_line":"                    extras_key \u003d \u0027%s%s\u0027 % (extra, m.group(\u0027env_marker\u0027))"},{"line_number":381,"context_line":"                    extras_value \u003d m.group(\u0027package\u0027).strip()"},{"line_number":382,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a0c5dc1_db8fe521","line":379,"updated":"2015-05-12 23:07:31.000000000","message":"Personally, I\u0027d say:\nenv_marker \u003d m.group(\u0027env_marker\u0027)\nif env_marker:\n  ... env_marker)","commit_id":"7f777e2df1964444559a298270d4d2a6b5814713"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"2c2bd0e571a34ba4772d0a80b144ac8a85643fb9","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                \"dependency_links\","},{"line_number":147,"context_line":"                \"setup_requires\","},{"line_number":148,"context_line":"                \"tests_require\","},{"line_number":149,"context_line":"                \"cmdclass\",)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"# setup() arguments that contain boolean values"},{"line_number":152,"context_line":"BOOL_FIELDS \u003d (\"use_2to3\", \"zip_safe\", \"include_package_data\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_be189a85","line":149,"updated":"2015-05-13 05:03:12.000000000","message":"I originally added extras_requires here, and forgot to remove the, when I took it out again.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"b697859118548d09165c7feb44730d370a34294a","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                \"dependency_links\","},{"line_number":147,"context_line":"                \"setup_requires\","},{"line_number":148,"context_line":"                \"tests_require\","},{"line_number":149,"context_line":"                \"cmdclass\",)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"# setup() arguments that contain boolean values"},{"line_number":152,"context_line":"BOOL_FIELDS \u003d (\"use_2to3\", \"zip_safe\", \"include_package_data\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_4f27af12","line":149,"updated":"2015-05-13 02:05:26.000000000","message":"Whats the , for?","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"2c2bd0e571a34ba4772d0a80b144ac8a85643fb9","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"    if \u0027extras\u0027 in config:"},{"line_number":372,"context_line":"        extras_require \u003d {}"},{"line_number":373,"context_line":"        requirement_pattern \u003d \u0027(?P\u003cpackage\u003e[^:]*)(?P\u003cenv_marker\u003e.*)\u0027"},{"line_number":374,"context_line":"        extras \u003d config[\u0027extras\u0027]"},{"line_number":375,"context_line":"        for extra in extras:"},{"line_number":376,"context_line":"            requirements \u003d split_multiline(extras[extra])"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_9e1dd675","line":373,"updated":"2015-05-13 05:03:12.000000000","message":"Done","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"b697859118548d09165c7feb44730d370a34294a","unresolved":false,"context_lines":[{"line_number":370,"context_line":""},{"line_number":371,"context_line":"    if \u0027extras\u0027 in config:"},{"line_number":372,"context_line":"        extras_require \u003d {}"},{"line_number":373,"context_line":"        requirement_pattern \u003d \u0027(?P\u003cpackage\u003e[^:]*)(?P\u003cenv_marker\u003e.*)\u0027"},{"line_number":374,"context_line":"        extras \u003d config[\u0027extras\u0027]"},{"line_number":375,"context_line":"        for extra in extras:"},{"line_number":376,"context_line":"            requirements \u003d split_multiline(extras[extra])"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_8f5a4782","line":373,"updated":"2015-05-13 02:05:26.000000000","message":"The re changes I requested haven\u0027t been applied...","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":9453,"name":"James Polley","email":"jp@jamezpolley.com","username":"tchaypo"},"change_message_id":"2c2bd0e571a34ba4772d0a80b144ac8a85643fb9","unresolved":false,"context_lines":[{"line_number":373,"context_line":"        requirement_pattern \u003d \u0027(?P\u003cpackage\u003e[^:]*)(?P\u003cenv_marker\u003e.*)\u0027"},{"line_number":374,"context_line":"        extras \u003d config[\u0027extras\u0027]"},{"line_number":375,"context_line":"        for extra in extras:"},{"line_number":376,"context_line":"            requirements \u003d split_multiline(extras[extra])"},{"line_number":377,"context_line":"            for requirement in requirements:"},{"line_number":378,"context_line":"                m \u003d re.match(requirement_pattern, requirement)"},{"line_number":379,"context_line":"                if m.group(\u0027env_marker\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_7e122264","line":376,"updated":"2015-05-13 05:03:12.000000000","message":"Done. Much neater too.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"b697859118548d09165c7feb44730d370a34294a","unresolved":false,"context_lines":[{"line_number":373,"context_line":"        requirement_pattern \u003d \u0027(?P\u003cpackage\u003e[^:]*)(?P\u003cenv_marker\u003e.*)\u0027"},{"line_number":374,"context_line":"        extras \u003d config[\u0027extras\u0027]"},{"line_number":375,"context_line":"        for extra in extras:"},{"line_number":376,"context_line":"            requirements \u003d split_multiline(extras[extra])"},{"line_number":377,"context_line":"            for requirement in requirements:"},{"line_number":378,"context_line":"                m \u003d re.match(requirement_pattern, requirement)"},{"line_number":379,"context_line":"                if m.group(\u0027env_marker\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a0c5dc1_0f7897f1","line":376,"updated":"2015-05-13 02:05:26.000000000","message":"You can pull out extras_value here easily, less code.","commit_id":"5ed151526611f1ab83d51846812f729bf483e008"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"acde7ee31a61253a212ce074ab462174b4569992","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                else:"},{"line_number":390,"context_line":"                    extras_key \u003d extra"},{"line_number":391,"context_line":"                extras_require.setdefault(extras_key, []).append(extras_value)"},{"line_number":392,"context_line":"        kwargs[\u0027extras_require\u0027] \u003d extras_require"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    return kwargs"},{"line_number":395,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a016987_cc99a321","line":392,"updated":"2015-05-14 00:56:36.000000000","message":"So- - this is still not split into the two stages I suggested. To bootstrap that:\n\nBefore the loop over config values above:\nrequirements \u003d {}\n\nin the loop, when it handles install requires, put it into:\nrequirements[\u0027\u0027] \u003d ...\n\nDown here:\n\n requirement_pattern \u003d ...\n for extra in config.get(\u0027extras\u0027, []):\n     for extra, reqs in extra.items():\n         split_reqs \u003d []\n         for requirement in split_multiline(reqs):\n             m \u003d re.match(requirement_pattern, requirement)\n             req_text \u003d m.group(\u0027package\u0027).strip()\n             env_marker \u003d m.group(\u0027env_marker\u0027) or \u0027\u0027\n             split_reqs.append((req_text, env_marker))\n         requirements[extra] \u003d split_reqs\n\n extra_requires \u003d {}\n for extra, reqs in requirements.items():\n     for req_text, env_marker in reqs:\n         if env_marker:\n             extra \u003d \"%s%s\" % (extra, env_marker)\n         extras_require.setdefault(extra, []).append(req_test)\n\n install_requires \u003d extra_requires.pop(\u0027\u0027, None)\n if install_requires:\n    kwargs[\u0027install_requires\u0027] \u003d install_requires \n if extra_requires:\n     kwargs[\u0027extras_require\u0027] \u003d extra_requires","commit_id":"b87f9d9fd7f466d21a7621bd18544a245611a0e5"}]}
