)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"74f27f310c7b7a2c05419f2dcc83655c6c5ba51e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add command fuzzy matching"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\u0027openstack user\u0027 throws error with no helpful message, even though \u0027openstack user list\u0027 works, that is really a bad UX"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"add fuzzy matching:"},{"line_number":12,"context_line":"$ openstack user"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"3a50d1a3_0008b8d8","line":9,"updated":"2015-07-23 16:58:13.000000000","message":"add a new line here to break up the commit msg a bit","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e1556240aac5b9cefa176c49b7d8be158a12b516","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add command fuzzy matching"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\u0027openstack user\u0027 throws error with no helpful message, even though \u0027openstack user list\u0027 works, that is really a bad UX"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"add fuzzy matching:"},{"line_number":12,"context_line":"$ openstack user"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"3a50d1a3_54ed0224","line":9,"updated":"2015-07-24 05:29:18.000000000","message":"add a line break somewhere here","commit_id":"a1b272adb88897dce3f819093077ca81306b153e"}],"cliff/app.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fd10a78e134b771dad4f08a7c8dcf1db9a914f7b","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                    self.LOG.error(err)"},{"line_number":304,"context_line":"                return 2"},{"line_number":305,"context_line":"            self.stdout.write(\u0027Command \"%s\" matches:\\n\u0027 % the_cmd)"},{"line_number":306,"context_line":"            for fm in sorted(fuzzy_matches):"},{"line_number":307,"context_line":"                self.stdout.write(\u0027  %s\\n\u0027 % fm)"},{"line_number":308,"context_line":"            return"},{"line_number":309,"context_line":"        cmd_factory, cmd_name, sub_argv \u003d subcommand"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a41bdd9_e6195323","line":306,"updated":"2015-07-15 16:20:08.000000000","message":"just a nit here: write \u0027matches\u0027 instead of fm, theres no need to make short little variables","commit_id":"6cdea5c1ab8134744c34056bb7ab851f9cbbf900"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"45d8338f0f0538b9f43728001bc0fd2560b8b87f","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            self.stdout.write(\u0027Command \"%s\" matches:\\n\u0027 % the_cmd)"},{"line_number":306,"context_line":"            for fm in sorted(fuzzy_matches):"},{"line_number":307,"context_line":"                self.stdout.write(\u0027  %s\\n\u0027 % fm)"},{"line_number":308,"context_line":"            return"},{"line_number":309,"context_line":"        cmd_factory, cmd_name, sub_argv \u003d subcommand"},{"line_number":310,"context_line":"        kwargs \u003d {}"},{"line_number":311,"context_line":"        if \u0027cmd_name\u0027 in inspect.getargspec(cmd_factory.__init__).args:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a41bdd9_89597837","line":308,"updated":"2015-07-15 16:29:45.000000000","message":"This should return 2 or something here to indicate there is an error","commit_id":"6cdea5c1ab8134744c34056bb7ab851f9cbbf900"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"ab9c7f2f836f2054da94349730e869f0db253c34","unresolved":false,"context_lines":[{"line_number":296,"context_line":"            fuzzy_matches \u003d [k[0] for k in self.command_manager"},{"line_number":297,"context_line":"                             if k[0].startswith(the_cmd)"},{"line_number":298,"context_line":"                             ]"},{"line_number":299,"context_line":"            if not fuzzy_matches:"},{"line_number":300,"context_line":"                if self.options.debug:"},{"line_number":301,"context_line":"                    raise"},{"line_number":302,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a41bdd9_75c963ab","line":299,"updated":"2015-07-15 17:48:43.000000000","message":"Would it not be better style to have the success case come first? \nif fuzzy_matches:\n   show matches\nelse:\n   log or raise\nreturn","commit_id":"224c17e0347323138893d903200ffb58a0386493"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"400ddd5cf4afc88688324e2f6d669a82637a60f3","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        except ValueError as err:"},{"line_number":294,"context_line":"            # If not find an exact match, try to find a fuzzy match"},{"line_number":295,"context_line":"            the_cmd \u003d argv[0]"},{"line_number":296,"context_line":"            fuzzy_matches \u003d [k[0] for k in self.command_manager"},{"line_number":297,"context_line":"                             if k[0].startswith(the_cmd)"},{"line_number":298,"context_line":"                             ]"},{"line_number":299,"context_line":"            if fuzzy_matches:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_9ab5ef32","line":296,"updated":"2015-07-16 20:07:36.000000000","message":"This logic would be easier to test and extend if it was in a separate method that returned the matching names.","commit_id":"1086767b72a916820e64961b8bf55a7ee0283101"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"887272260b6ea7ec7d1abd9cd4552b014dac6810","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        except ValueError as err:"},{"line_number":294,"context_line":"            # If not find an exact match, try to find a fuzzy match"},{"line_number":295,"context_line":"            the_cmd \u003d argv[0]"},{"line_number":296,"context_line":"            fuzzy_matches \u003d [k[0] for k in self.command_manager"},{"line_number":297,"context_line":"                             if k[0].startswith(the_cmd)"},{"line_number":298,"context_line":"                             ]"},{"line_number":299,"context_line":"            if fuzzy_matches:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_bac9d35c","line":296,"in_reply_to":"9a41bdd9_9ab5ef32","updated":"2015-07-16 20:14:32.000000000","message":"Maybe help.py could use the same method.","commit_id":"1086767b72a916820e64961b8bf55a7ee0283101"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"26613402f375100471b10dcd4eeeb2ddcce3cd67","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        except ValueError as err:"},{"line_number":294,"context_line":"            # If not find an exact match, try to find a fuzzy match"},{"line_number":295,"context_line":"            the_cmd \u003d argv[0]"},{"line_number":296,"context_line":"            fuzzy_matches \u003d [k[0] for k in self.command_manager"},{"line_number":297,"context_line":"                             if k[0].startswith(the_cmd)"},{"line_number":298,"context_line":"                             ]"},{"line_number":299,"context_line":"            if fuzzy_matches:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_3a5f0377","line":296,"in_reply_to":"9a41bdd9_bac9d35c","updated":"2015-07-16 20:18:45.000000000","message":"Good idea.","commit_id":"1086767b72a916820e64961b8bf55a7ee0283101"},{"author":{"_account_id":16129,"name":"Wang Guo","email":"guowang@unitedstack.com","username":"kafka"},"change_message_id":"979466da2bf562d5a8c80abb62b8ce3d11d70e12","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        except ValueError as err:"},{"line_number":294,"context_line":"            # If not find an exact match, try to find a fuzzy match"},{"line_number":295,"context_line":"            the_cmd \u003d argv[0]"},{"line_number":296,"context_line":"            fuzzy_matches \u003d [k[0] for k in self.command_manager"},{"line_number":297,"context_line":"                             if k[0].startswith(the_cmd)"},{"line_number":298,"context_line":"                             ]"},{"line_number":299,"context_line":"            if fuzzy_matches:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_e436d9e6","line":296,"in_reply_to":"9a41bdd9_bac9d35c","updated":"2015-07-21 09:04:01.000000000","message":"good idea","commit_id":"1086767b72a916820e64961b8bf55a7ee0283101"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"2431f7bb952d1d357397624d626b2e600339a734","unresolved":false,"context_lines":[{"line_number":306,"context_line":"                continue"},{"line_number":307,"context_line":"            # Levenshtein distance"},{"line_number":308,"context_line":"            dist.append((candidate, damerau_levenshtein(cmd, prefix, COST)+1))"},{"line_number":309,"context_line":"        dist \u003d sorted(dist, key\u003dlambda x: (x[1], x[0]))"},{"line_number":310,"context_line":"        matches \u003d []"},{"line_number":311,"context_line":"        i \u003d 0"},{"line_number":312,"context_line":"        # Find the best similarity"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_049be518","line":309,"updated":"2015-07-23 17:34:54.000000000","message":"this is also:\n\ndist \u003d sorted(dist, key\u003doperator.itemgetter(1))","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"2431f7bb952d1d357397624d626b2e600339a734","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        try:"},{"line_number":325,"context_line":"            subcommand \u003d self.command_manager.find_command(argv)"},{"line_number":326,"context_line":"        except ValueError as err:"},{"line_number":327,"context_line":"            # If not find an exact match, try to find a fuzzy match"},{"line_number":328,"context_line":"            the_cmd \u003d argv[0]"},{"line_number":329,"context_line":"            fuzzy_matches \u003d self.get_fuzzy_matches(the_cmd)"},{"line_number":330,"context_line":"            if fuzzy_matches:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_44000d02","line":327,"updated":"2015-07-23 17:34:54.000000000","message":"If there was no exact match, try to find a fuzzy match.\n\nComments are English not code.","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"7da72500ab3d7371c2036053e7b407709292537d","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            the_cmd \u003d argv[0]"},{"line_number":329,"context_line":"            fuzzy_matches \u003d self.get_fuzzy_matches(the_cmd)"},{"line_number":330,"context_line":"            if fuzzy_matches:"},{"line_number":331,"context_line":"                self.stdout.write(\u0027openstack: \\\u0027%s\\\u0027 is not a openstack\u0027"},{"line_number":332,"context_line":"                                  \u0027 command. See \\\u0027openstack --help\\\u0027.\\n\u0027"},{"line_number":333,"context_line":"                                  % the_cmd)"},{"line_number":334,"context_line":"                self.stdout.write(\u0027Did you mean one of these?\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_9a7af722","line":331,"updated":"2015-07-23 15:00:51.000000000","message":"cliff shouldn\u0027t have the base command name hard-coded into the message. You can use self.NAME instead of \u0027openstack\u0027.","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"74f27f310c7b7a2c05419f2dcc83655c6c5ba51e","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            the_cmd \u003d argv[0]"},{"line_number":329,"context_line":"            fuzzy_matches \u003d self.get_fuzzy_matches(the_cmd)"},{"line_number":330,"context_line":"            if fuzzy_matches:"},{"line_number":331,"context_line":"                self.stdout.write(\u0027openstack: \\\u0027%s\\\u0027 is not a openstack\u0027"},{"line_number":332,"context_line":"                                  \u0027 command. See \\\u0027openstack --help\\\u0027.\\n\u0027"},{"line_number":333,"context_line":"                                  % the_cmd)"},{"line_number":334,"context_line":"                self.stdout.write(\u0027Did you mean one of these?\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_400240b5","line":331,"in_reply_to":"3a50d1a3_9a7af722","updated":"2015-07-23 16:58:13.000000000","message":"++","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"74f27f310c7b7a2c05419f2dcc83655c6c5ba51e","unresolved":false,"context_lines":[{"line_number":329,"context_line":"            fuzzy_matches \u003d self.get_fuzzy_matches(the_cmd)"},{"line_number":330,"context_line":"            if fuzzy_matches:"},{"line_number":331,"context_line":"                self.stdout.write(\u0027openstack: \\\u0027%s\\\u0027 is not a openstack\u0027"},{"line_number":332,"context_line":"                                  \u0027 command. See \\\u0027openstack --help\\\u0027.\\n\u0027"},{"line_number":333,"context_line":"                                  % the_cmd)"},{"line_number":334,"context_line":"                self.stdout.write(\u0027Did you mean one of these?\\n\u0027)"},{"line_number":335,"context_line":"                for match in fuzzy_matches:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_e027cc60","line":332,"updated":"2015-07-23 16:58:13.000000000","message":"here too","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"24ba3e623c123b5cd25263244c6f0add4321041b","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        sep \u003d (\u0027 \u0027"},{"line_number":296,"context_line":"               if self.command_manager.convert_underscores"},{"line_number":297,"context_line":"               else \u0027_\u0027"},{"line_number":298,"context_line":"               )"},{"line_number":299,"context_line":"        all_cmds \u003d [k[0] for k in self.command_manager]"},{"line_number":300,"context_line":"        dist \u003d []"},{"line_number":301,"context_line":"        for candidate in sorted(all_cmds):"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a50d1a3_0d03f677","line":298,"updated":"2015-07-24 03:12:38.000000000","message":"code readability perspective, isn\u0027t this just a simple if..else statement?\n\n   if self.command_manager.convert_underscores:\n      sep \u003d \u0027 \u0027\n   else:\n      sep \u003d \u0027_\u0027","commit_id":"3e74c6d55b412ad2c19c6ad2fb45c851e9bd4700"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"24ba3e623c123b5cd25263244c6f0add4321041b","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            the_cmd \u003d argv[0]"},{"line_number":329,"context_line":"            fuzzy_matches \u003d self.get_fuzzy_matches(the_cmd)"},{"line_number":330,"context_line":"            if fuzzy_matches:"},{"line_number":331,"context_line":"                self.stdout.write(\u0027openstack: \\\u0027%s\\\u0027 is not a openstack\u0027"},{"line_number":332,"context_line":"                                  \u0027 command. See \\\u0027openstack --help\\\u0027.\\n\u0027"},{"line_number":333,"context_line":"                                  % the_cmd)"},{"line_number":334,"context_line":"                self.stdout.write(\u0027Did you mean one of these?\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a50d1a3_8df7068c","line":331,"updated":"2015-07-24 03:12:38.000000000","message":"not a -\u003e not an ?","commit_id":"3e74c6d55b412ad2c19c6ad2fb45c851e9bd4700"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e1556240aac5b9cefa176c49b7d8be158a12b516","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        \"\"\""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        sep \u003d (\u0027 \u0027"},{"line_number":297,"context_line":"               if self.command_manager.convert_underscores"},{"line_number":298,"context_line":"               else \u0027_\u0027"},{"line_number":299,"context_line":"               )"},{"line_number":300,"context_line":"        all_cmds \u003d [k[0] for k in self.command_manager]"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a50d1a3_f4f1ae02","line":297,"updated":"2015-07-24 05:29:18.000000000","message":"refer to comments in patch set 28","commit_id":"a1b272adb88897dce3f819093077ca81306b153e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e1556240aac5b9cefa176c49b7d8be158a12b516","unresolved":false,"context_lines":[{"line_number":329,"context_line":"            the_cmd \u003d argv[0]"},{"line_number":330,"context_line":"            fuzzy_matches \u003d self.get_fuzzy_matches(the_cmd)"},{"line_number":331,"context_line":"            if fuzzy_matches:"},{"line_number":332,"context_line":"                article \u003d (\u0027an\u0027"},{"line_number":333,"context_line":"                           if self.NAME[0] in \u0027aeiou\u0027"},{"line_number":334,"context_line":"                           else \u0027a\u0027"},{"line_number":335,"context_line":"                           )"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a50d1a3_74e6fe45","line":332,"updated":"2015-07-24 05:29:18.000000000","message":"minor nit: i prefer reading code in the usual \n\n  article \u003d \u0027a\u0027\n  if self.NAME[0] in \u0027aeiou\u0027\n    article \u003d \u0027an\u0027\n\nrather than the braces you have set up","commit_id":"a1b272adb88897dce3f819093077ca81306b153e"}],"cliff/tests/test_app.py":[{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"45d8338f0f0538b9f43728001bc0fd2560b8b87f","unresolved":false,"context_lines":[{"line_number":421,"context_line":"              stdout\u003dstdout)"},{"line_number":422,"context_line":"    app.NAME \u003d \u0027test\u0027"},{"line_number":423,"context_line":"    try:"},{"line_number":424,"context_line":"        app.run([\u0027t\u0027])"},{"line_number":425,"context_line":"    except SystemExit:"},{"line_number":426,"context_line":"        pass"},{"line_number":427,"context_line":"    output \u003d stdout.getvalue()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a41bdd9_49ae10e7","line":424,"updated":"2015-07-15 16:29:45.000000000","message":"assert \u003d\u003d 2 or whatever value here","commit_id":"6cdea5c1ab8134744c34056bb7ab851f9cbbf900"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"2431f7bb952d1d357397624d626b2e600339a734","unresolved":false,"context_lines":[{"line_number":425,"context_line":"    except SystemExit:"},{"line_number":426,"context_line":"        pass"},{"line_number":427,"context_line":"    output \u003d stdout.getvalue()"},{"line_number":428,"context_line":"    assert \"openstack: \u0027t\u0027 is not a openstack command.\" in output"},{"line_number":429,"context_line":"    assert \u0027Did you mean one of these?\u0027 in output"},{"line_number":430,"context_line":"    assert \u0027three word command\\n  two words\\n\u0027 in output"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_573d1dc2","line":428,"updated":"2015-07-23 17:34:54.000000000","message":"Again here, cliff is not OpenStack CLI.","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"}],"cliff/utils.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f25fe57a897651bb90372f59c22b563ab6abe224","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"# Cost for different edit operation"},{"line_number":3,"context_line":"# w --\u003e \"sWap\":"},{"line_number":4,"context_line":"# s --\u003e \"Substitute\""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_3c3dffdc","line":1,"updated":"2015-07-23 06:50:54.000000000","message":"insert the usual apache license header here","commit_id":"28b94ebaa53e6976524e893c327f5afcc940c3dc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f25fe57a897651bb90372f59c22b563ab6abe224","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"# Cost for different edit operation"},{"line_number":3,"context_line":"# w --\u003e \"sWap\":"},{"line_number":4,"context_line":"# s --\u003e \"Substitute\""},{"line_number":5,"context_line":"# a --\u003e \"Add\" or \"Insertion\""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_5f023d0b","line":2,"updated":"2015-07-23 06:50:54.000000000","message":"you probably want to document what all of this means, maybe an example?","commit_id":"28b94ebaa53e6976524e893c327f5afcc940c3dc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f25fe57a897651bb90372f59c22b563ab6abe224","unresolved":false,"context_lines":[{"line_number":7,"context_line":"COST \u003d {\"w\": 0, \"s\": 2, \"a\": 1, \"d\": 3}"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"def damerau_levenshtein(s1, s2, cost):"},{"line_number":11,"context_line":"    \"\"\"Calculates the Damerau-Levenshtein distance between two strings."},{"line_number":12,"context_line":"    \"\"\""},{"line_number":13,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_9f33e5f5","line":10,"updated":"2015-07-23 06:50:54.000000000","message":"make this private?","commit_id":"28b94ebaa53e6976524e893c327f5afcc940c3dc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f25fe57a897651bb90372f59c22b563ab6abe224","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"def damerau_levenshtein(s1, s2, cost):"},{"line_number":11,"context_line":"    \"\"\"Calculates the Damerau-Levenshtein distance between two strings."},{"line_number":12,"context_line":"    \"\"\""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    if s1 \u003d\u003d s2:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a50d1a3_3f22d1a3","line":11,"updated":"2015-07-23 06:50:54.000000000","message":"a full docstring for this API would be nice, the more info and comments we have for this function, the better.","commit_id":"28b94ebaa53e6976524e893c327f5afcc940c3dc"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"7da72500ab3d7371c2036053e7b407709292537d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_1acd8730","line":1,"updated":"2015-07-23 15:00:51.000000000","message":"This isn\u0027t technically correct unless you\u0027re employed by the foundation. Did you get this implementation from somewhere online? If so, we should give attribution there, rather than to the foundation.","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"74f27f310c7b7a2c05419f2dcc83655c6c5ba51e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_c08170c4","line":1,"in_reply_to":"3a50d1a3_1acd8730","updated":"2015-07-23 16:58:13.000000000","message":"looks like it\u0027s from here: https://github.com/git/git/blob/8af84dadb142f7321ff0ce8690385e99da8ede2f/levenshtein.c\n\ngive credit to Git and author dscho ?\n\nnot really sure how to write this out.","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"74f27f310c7b7a2c05419f2dcc83655c6c5ba51e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    \"\"\"Calculates the Damerau-Levenshtein distance between two strings."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    The Levenshtein distance between two strings describes the minimal cost"},{"line_number":29,"context_line":"    of single-character edits requied to change one string to the other."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    \"\"\""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_a1b22304","line":29,"updated":"2015-07-23 16:58:13.000000000","message":"i\u0027d still like more info here about what the algorithm is, and how COST is used to compare whether or not str1 and str2 are close enough.","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"2431f7bb952d1d357397624d626b2e600339a734","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    \"\"\"Calculates the Damerau-Levenshtein distance between two strings."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    The Levenshtein distance between two strings describes the minimal cost"},{"line_number":29,"context_line":"    of single-character edits requied to change one string to the other."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    \"\"\""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_64fc29b8","line":29,"updated":"2015-07-23 17:34:54.000000000","message":"s/requied/required/","commit_id":"e0b55f843277f676baf32dfb570348fc5bd09f4e"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"24ba3e623c123b5cd25263244c6f0add4321041b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a50d1a3_ed0faa86","line":1,"updated":"2015-07-24 03:12:38.000000000","message":"em ... not sure if this line is intended","commit_id":"3e74c6d55b412ad2c19c6ad2fb45c851e9bd4700"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e1556240aac5b9cefa176c49b7d8be158a12b516","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"# Each edit operation is assigned different cost, such as:"},{"line_number":3,"context_line":"#  \u0027w\u0027 means swap operation, the cost is 0;"},{"line_number":4,"context_line":"#  \u0027s\u0027 means substitution operation, the cost is 2;"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a50d1a3_7454bec9","line":1,"updated":"2015-07-24 05:29:18.000000000","message":"so, there was miscommunication here, the Copyright for the OpenStack Foundation should be removed, but the License has to stay...\n\n  #   Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n  #   not use this file except in compliance with the License. You may obtain\n  #   a copy of the License at\n  #\n  #        http://www.apache.org/licenses/LICENSE-2.0\n  #\n  #   Unless required by applicable law or agreed to in writing, software\n  #   distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n  #   WARRANTIES OR CONDITIONS OF ANY KIND, either express or   implied. See the\n  #   License for the specific language governing permissions and limitations\n  #   under the License.\n  #","commit_id":"a1b272adb88897dce3f819093077ca81306b153e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e1556240aac5b9cefa176c49b7d8be158a12b516","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    The Levenshtein distance between two strings describes the minimal cost"},{"line_number":15,"context_line":"    of single-character edits requied to change one string to the other."},{"line_number":16,"context_line":"    More details: https://en.wikipedia.org/wiki/Levenshtein_distance"},{"line_number":17,"context_line":"    \"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    if s1 \u003d\u003d s2:"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a50d1a3_94514adb","line":16,"updated":"2015-07-24 05:29:18.000000000","message":"Add a link to: https://github.com/git/git/commit/8af84dadb142f7321ff0ce8690385e99da8ede2f as well","commit_id":"a1b272adb88897dce3f819093077ca81306b153e"}]}
