Support filtering FileDiffs in the WebAPI by their commit

Review Request #9757 — Created March 7, 2018 and submitted

Information

Review Board
release-4.0.x
78fba15...

Reviewers

The FileDiff list resource now supports filtering by a commit ID via
passing the ?commit-id=<id> query parameter. Doing so will limit the
results to FileDiff objects who are associated with that commit.
Passing an invalid commit ID will result in no results being returned.

Ran unit tests.

Description From Last Updated

E501 line too long (87 > 79 characters)

reviewbotreviewbot

Can you expand this docstring for arguments?

chipx86chipx86

HttpRequest

chipx86chipx86

Double backticks here.

chipx86chipx86

HttpRequest

chipx86chipx86

Instead of this method, which must be opted into, I think I'd feel more comfortable if we inversed how these …

chipx86chipx86

Too many blank lines.

chipx86chipx86

Too many blank lines.

chipx86chipx86

Diff contents should always be binary. This function should assert this.

chipx86chipx86

Same here.

chipx86chipx86

Should be a :py:class: reference.

chipx86chipx86

Missing "Returns".

chipx86chipx86

This should ideally be consistent in implicit vs. explicit comparisons.

chipx86chipx86

Most docs use "The HTTP request from the client."

chipx86chipx86

Missing a description.

chipx86chipx86

Same description as above.

chipx86chipx86

Do we want to allow for empty strings? Maybe just check truthiness?

chipx86chipx86

Same as above.

chipx86chipx86

Missing a description.

chipx86chipx86

Been noticing lately that your test functions are all backwards. The basic case should come first. The variations come after. …

chipx86chipx86

Can you explicitly say "with commit-id=", so it's clear what this is testing?

chipx86chipx86

Here, too.

chipx86chipx86

Should test that the results are what we expect.

chipx86chipx86

All the same comments from the previous file, regarding docstrings and ordering, apply here as well.

chipx86chipx86

Should check the results.

chipx86chipx86

F841 local variable 'pk' is assigned to but never used

reviewbotreviewbot

E225 missing whitespace around operator

reviewbotreviewbot

E303 too many blank lines (2)

reviewbotreviewbot

F841 local variable 'pk' is assigned to but never used

reviewbotreviewbot

E225 missing whitespace around operator

reviewbotreviewbot

"review request revision" is weird

daviddavid

This isn't something the review request resource cares about.

daviddavid

Doesn't this break? It seems like we're no longer limiting the results to the correct diff revision.

daviddavid

This is incorrect, because this method ignores the diffset revision (which is filtered for in the caller). Can we just …

daviddavid

"review request revision" isn't a thing

daviddavid

Missing a "the".

chipx86chipx86

This should either be an assert statement or we should raise something like a ValueError. I'd prefer the latter.

chipx86chipx86

Is the second part of this logic correct? That should trigger if neither is provided (which the assertion says is …

chipx86chipx86

This isn't in the function signature. It can be removed here.

chipx86chipx86
Checks run (1 failed, 1 succeeded)
flake8 failed.
JSHint passed.

flake8

brennie
brennie
chipx86
  1. 
      
  2. reviewboard/testing/testcase.py (Diff revision 3)
     
     
    Show all issues

    Can you expand this docstring for arguments?

  3. Show all issues

    HttpRequest

  4. Show all issues

    Double backticks here.

  5. Show all issues

    HttpRequest

  6. Show all issues

    Instead of this method, which must be opted into, I think I'd feel more comfortable if we inversed how these querysets were built.

    get_queryset() should build the initial queryset that handles diffset__revision (which is consistent between the implementations) and the commit filtering.

    It would then call a method defined by the class/subclass for filtering the review request association, like get_diffset_query. That handles the diffset__history__review_request= here, and the diffset__review_request_draft= in DraftFileDiffResource.

    This simplifies implementations and keeps the control in the base get_queryset.

  7. reviewboard/webapi/resources/filediff.py (Diff revision 3)
     
     
     
     
     
     
    Show all issues

    Too many blank lines.

  8. reviewboard/webapi/tests/test_draft_filediff.py (Diff revision 3)
     
     
     
     
     
     
    Show all issues

    Too many blank lines.

  9. 
      
brennie
chipx86
  1. 
      
  2. reviewboard/testing/testcase.py (Diff revision 4)
     
     
    Show all issues

    Diff contents should always be binary.

    This function should assert this.

  3. reviewboard/testing/testcase.py (Diff revision 4)
     
     
     
    Show all issues

    Same here.

  4. reviewboard/testing/testcase.py (Diff revision 4)
     
     
    Show all issues

    Should be a :py:class: reference.

  5. reviewboard/testing/testcase.py (Diff revision 4)
     
     
     
    Show all issues

    Missing "Returns".

  6. reviewboard/testing/testcase.py (Diff revision 4)
     
     
    Show all issues

    This should ideally be consistent in implicit vs. explicit comparisons.

    1. Yeah, probably. I was trying to work around an issue I thought was in datetime (but turns out was only in time: see). I'll change this.

  7. Show all issues

    Most docs use "The HTTP request from the client."

    1. Every single doc I've written is this way. Also:

      (rb40) ~/W/p/b/r/b/r/s/reviewboard (dev/release-4.0.x/dvcs-webapi)>
      git grep "The current HTTP request." | wc -l
      47
      (rb40) ~/W/p/b/r/b/r/s/reviewboard (dev/release-4.0.x/dvcs-webapi)>
      git grep "The HTTP request from the client." | wc -l
      33
      
  8. reviewboard/webapi/resources/draft_filediff.py (Diff revision 4)
     
     
     
     
    Show all issues

    Missing a description.

  9. reviewboard/webapi/resources/filediff.py (Diff revision 4)
     
     
     
    Show all issues

    Same description as above.

  10. reviewboard/webapi/resources/filediff.py (Diff revision 4)
     
     
     
    Show all issues

    Do we want to allow for empty strings? Maybe just check truthiness?

  11. reviewboard/webapi/resources/filediff.py (Diff revision 4)
     
     
     
    Show all issues

    Same as above.

  12. reviewboard/webapi/resources/filediff.py (Diff revision 4)
     
     
     
     
    Show all issues

    Missing a description.

  13. Show all issues

    Been noticing lately that your test functions are all backwards. The basic case should come first. The variations come after. Can you reorder these to be consistent with all our other tests?

  14. Show all issues

    Can you explicitly say "with commit-id=", so it's clear what this is testing?

  15. Show all issues

    Here, too.

  16. Show all issues

    Should test that the results are what we expect.

  17. reviewboard/webapi/tests/test_filediff.py (Diff revision 4)
     
     
     
     
     
     
    Show all issues

    All the same comments from the previous file, regarding docstrings and ordering, apply here as well.

  18. reviewboard/webapi/tests/test_filediff.py (Diff revision 4)
     
     
     
    Show all issues

    Should check the results.

  19. 
      
brennie
Review request changed
Change Summary:

Addressed Christian's feedback.

Commit:
ec58889ea2cc33b5b0b07ef7ef7e3f32084fdd9a
f984e04689b2f1444ba22a461c4f2158f7c24492

Checks run (1 failed, 1 succeeded)

flake8 failed.
JSHint passed.

flake8

brennie
brennie
david
  1. 
      
  2. Show all issues

    "review request revision" is weird

  3. Show all issues

    This isn't something the review request resource cares about.

  4. reviewboard/webapi/resources/filediff.py (Diff revision 7)
     
     
     
     
    Show all issues

    Doesn't this break? It seems like we're no longer limiting the results to the correct diff revision.

    1. No. If you look above, this method (get_diffset_query) is called by get_queryset, which does the filtering based on the the revision.

      It is refactored out so that draft and non-draft filtering logic can be in get_diffset_query while the main filtering logic lives in get_queryset

  5. 
      
brennie
brennie
david
  1. 
      
  2. Show all issues

    This is incorrect, because this method ignores the diffset revision (which is filtered for in the caller).

    Can we just remove the diff_revision parameter entirely from this (since it's not used) and fix the docstring here to explain that it's returning all diffsets linked to the review request?

  3. reviewboard/webapi/resources/filediff.py (Diff revision 9)
     
     
     
    Show all issues

    "review request revision" isn't a thing

  4. 
      
brennie
chipx86
  1. 
      
  2. reviewboard/testing/testcase.py (Diff revision 10)
     
     
    Show all issues

    Missing a "the".

  3. reviewboard/testing/testcase.py (Diff revision 10)
     
     
     
     
     
     
    Show all issues

    This should either be an assert statement or we should raise something like a ValueError. I'd prefer the latter.

  4. reviewboard/testing/testcase.py (Diff revision 10)
     
     
     
    Show all issues

    Is the second part of this logic correct? That should trigger if neither is provided (which the assertion says is okay), but won't trigger if only one is provided. Seems this would be more correct/readable:

    if ((committer_name or commiter_email) and
        not (committer_name and committer_email)):
    

    >>> ((True or False) and not (True and False))
    True
    >>> ((False or True) and not (False and True))
    True
    >>> ((True or True) and not (True and True))
    False
    >>> ((False or False) and not (False and False))
    False
    

    Unit tests need to be fleshed out for all conditions.

    1. I fixed the logic. I dont see a need to unit test TestCase.create_x methods

  5. 
      
brennie
chipx86
  1. 
      
  2. reviewboard/webapi/resources/filediff.py (Diff revision 11)
     
     
     
    Show all issues

    This isn't in the function signature. It can be removed here.

  3. 
      
brennie
chipx86
  1. Ship It!
  2. 
      
brennie
Review request changed
Status:
Completed
Change Summary:
Pushed to release-4.0.x (4ca418f)