-
Notifications
You must be signed in to change notification settings - Fork 174
Comparing changes
Open a pull request
base repository: pytest-dev/pytest-asyncio
base: v0.12.0
head repository: pytest-dev/pytest-asyncio
compare: v0.14.0
- 9 commits
- 4 files changed
- 3 contributors
Commits on May 3, 2020
-
Configuration menu - View commit details
-
Copy full SHA for 7a255bc - Browse repository at this point
Copy the full SHA 7a255bcView commit details
Commits on Jun 2, 2020
-
1) A new test case that fails with 0.12.0, and pass with this commit.
test_async_fixtures_with_finalizer_scope.py: 2) Main problem is due to side effects of asyncio.get_event_loop(). See: https://github.com/python/cpython/blob/3.8/Lib/asyncio/events.py#L636 This method could either return an existing loop or create a new one. This commit replaces all asyncio.get_event_loop() with previous pytest-asyncio code (0.10.0), so plugin uses the loop provided by event_loop fixture (instead of calling asyncio.get_event_loop()) Except following block, that has not been modified in this commit (as it behaves similar to 0.10.0) https://github.com/pytest-dev/pytest-asyncio/blob/v0.12.0/pytest_asyncio/plugin.py#L54-L66 Changes are for using always the new loop provided by event_loop fixture. Instead of calling get_event_loop() that: - either returns global recorded loop (with set_event_loop()) in case there is one, - or otherwise creates and record a new one
Configuration menu - View commit details
-
Copy full SHA for c1131f8 - Browse repository at this point
Copy the full SHA c1131f8View commit details -
1) Test case (test_async_fixtures_with_finalizer) refactoring to pass…
… on python 3.6 & 3.5 2) An additional test case (test_module_with_get_event_loop_finalizer). Refactoring previous test case I got to another potential issue: Finalizers using get_event_loop() instead of event_loop [on a module scope fixture] To be able to pass this new test case I needed some additional changes on next event_loop fixture block( https://github.com/pytest-dev/pytest-asyncio/blob/v0.12.0/pytest_asyncio/plugin.py#L54-L66): - This block needs to apply on all event_loop fixture scopes (so I remove 'asyncio' in request.keywords, that only apply to function scope) - The get_event_loop() method inside this block has following side effects (See https://github.com/python/cpython/blob/3.8/Lib/asyncio/events.py#L636): - As no loop is still set, then L636 is executed, and so a new event_loop (let's call it L2) is first created and then set. - And then finalizer will restore L2 at the end of test. What has no sense, to restore L2 that wasn't before the test. And additionally this L2 is never closed. So it seeems that get_event_loop() should be removed, and so I see no reasons for any finalizer. 3) DRY: New FixtureStripper to avoid repeating code
Configuration menu - View commit details
-
Copy full SHA for f97e900 - Browse repository at this point
Copy the full SHA f97e900View commit details -
To solve test cases that fail:
Even_loop() fixture properly closes the loop (but as explained below this is not enough to reset behaviour): ``` @pytest.fixture def event_loop(request): """Create an instance of the default event loop for each test case.""" loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() ``` Subsequent calls to asyncio.get_event_loop() returns the previous closed loop, instead of providing a new loop. This is due to (https://github.com/python/cpython/blob/3.8/Lib/asyncio/events.py#L634) variable _set_called is True, and so even when loop is None, then no new_event_loop is created [I really don´t know the reason of this _set_called behaviour]. The best solution I have found is to set_event_loop_policy(None). This completely resets global variable and so any subsequent call to asyncio.get_event_loop() provides a new event_loop. I have included this in the pytest hook (pytest_fixture_post_finalizer), that is called after fixture teardowns. Note: Same behaviour can be done modifying event_loop() fixture, but I have discarded it as this would force users that have overwritten even_loop fixture to modify its implementation: ``` @pytest.fixture def event_loop(request): """Create an instance of the default event loop for each test case.""" loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() asyncio.set_event_loop_policy(None) ```
Configuration menu - View commit details
-
Copy full SHA for 51d986c - Browse repository at this point
Copy the full SHA 51d986cView commit details -
FIX new test_cases on python 3.5 & 3.6
asyncio.create_task has been added in Python 3.7. The low-level asyncio.ensure_future() function can be used instead (works in all Python versions but is less readable). https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task
Configuration menu - View commit details
-
Copy full SHA for 907e8f2 - Browse repository at this point
Copy the full SHA 907e8f2View commit details -
Configuration menu - View commit details
-
Copy full SHA for 68513b3 - Browse repository at this point
Copy the full SHA 68513b3View commit details -
Configuration menu - View commit details
-
Copy full SHA for 4099b63 - Browse repository at this point
Copy the full SHA 4099b63View commit details -
A line is added to the changelog.
Please review release date
Configuration menu - View commit details
-
Copy full SHA for e99569d - Browse repository at this point
Copy the full SHA e99569dView commit details
Commits on Jun 23, 2020
-
Configuration menu - View commit details
-
Copy full SHA for 53f3da7 - Browse repository at this point
Copy the full SHA 53f3da7View commit details
This comparison is taking too long to generate.
Unfortunately it looks like we can’t render this comparison for you right now. It might be too big, or there might be something weird with your repository.
You can try running this command locally to see the comparison on your machine:
git diff v0.12.0...v0.14.0