# pyfakefs Release Notes
The released versions correspond to PyPI releases.

## Unreleased


## [Version 5.2.3](https://pypi.python.org/pypi/pyfakefs/5.2.3) (2023-07-10)
Adds compatibility with PyPy 3.10 and Python 3.12.

### Fixes
* Re-create temp directory if it had been created before on resetting file system
  (see [#814](../../issues/814)).
* Exclude pytest `pathlib` modules from patching to avoid mixup of patched/unpatched
  code (see [#814](../../issues/814)).
* Adapt to changes in Python 3.12 beta1 (only working partially,
  see [#830](../../issues/830) and [#831](../../issues/831)).
* Adapt to changes in `shutil` in Python 3.12 beta2 (see [#814](../../issues/814)).
* Fix support for newer PyPi versions (see [#859](../../issues/859)).

### Documentation
* Added a note regarding the incompatibility of the built-in `sqlite3` module with
  `pyfakefs` (see [#850](../../issues/850))

### Infrastructure
* Added pytype check for non-test modules in CI (see [#599](../../issues/599)).
* Added tests for different pypy3 versions.
* Added codespell hook to pre-commit

## [Version 5.2.2](https://pypi.python.org/pypi/pyfakefs/5.2.2) (2023-04-13)
Fixes a regression in 5.2.0

### Changes
* Made the user and group IDs accessible via dedicated ``get_uid`` and ``get_gid``
  functions (for symmetry to ``set_uid`` / ``set_gid``)

### Fixes
* The test fixture is now included in the source distribution and installed
  with the package.
* Some public constants in `fake_filesystem` that had been moved to `helpers` are
  made accessible from there again (see [#809](../../issues/809)).
* Add missing fake implementations for `os.getuid` and `os.getgid` (Posix only)
* Make sure a `/tmp` path exists under linux (`TMPDIR` may point elsewhere)
  (see [#810](../../issues/810))


## [Version 5.2.1](https://pypi.python.org/pypi/pyfakefs/5.2.1) (2023-04-11)
Support for latest Python 3.12 version.

### Changes
* Adapted fake pathlib to changes in Python 3.12a7 (last alpha version)

### Fixes
* Properties defining the capabilities of some `os` functions like
  `os.supports_follow_symlinks` are now properly faked to contain the fake functions
  if the real functions are faked (see [#799](../../issues/799))

## [Version 5.2.0](https://pypi.python.org/pypi/pyfakefs/5.2.0) (2023-03-31)
Supports current Python 3.12 version (alpha 6). We plan to make patch releases in
case of breaking changes in alpha or beta versions.

### Changes
* Fake module classes previously defined in `fake_filesystem` have now moved to
  their own modules: `fake_os.FakeOsModule`, `fake_path.FakePathModule`,
  `fake_io.FakeIoModule` and `fake_open.FakeFileOpen`. Additionally, all fake file
  classes have been moved to `fake_file`. While most of the changes shall be upwards
  compatible, we cannot exclude that we missed some problems.
* Under macOS, at test start a symlink `/tmp` to the actual temporary directory is
  now created in the fake filesystem.
* Patching of parsers for pandas >= 1.2 is removed since pandas now uses Python fs functions
  internally even when the engine selected is "c".

### Features
* added possibility to set a path inaccessible under Windows by using `chown()` with
  the `force_unix_mode` flag (see [#720](../../issues/720))
* added support for current Python 3.12 version (alpha 6)
* added support for `os.path.splitroot` (new in Python 3.12)

## [Version 5.1.0](https://pypi.python.org/pypi/pyfakefs/5.1.0) (2023-01-12)
New version before Debian freeze

### Features
* added class level setup method `setUpClassPyfakefs` for unittest and class-scoped
  fixture `fs_class` for pytest (see [#752](../../issues/752))
* added experimental support for Python 3.12: added fake APIs for Windows junction
  support. These are not implemented and always return `False`.

### Infrastructure
* replaced end-of-life CentOS with RedHat UBI9 docker image
* added tests for pytest 7.2.0
* added black to pre-commit checks, which caused some changes to the
  coding style (max line length is now 88, always use double quotes)
* added Python 3.12 to the test suite.
* migrated to [setuptools declarative syntax](https://setuptools.pypa.io/en/latest/userguide/declarative_config.html).
* fixed docker tests when running on branches containing forward slashes

## [Version 5.0.0](https://pypi.python.org/pypi/pyfakefs/5.0.0) (2022-10-09)
New version after the transfer to `pytest-dev`.

### Changes
* the old-style API deprecated since version 3.4 has now been removed
* the method `copyRealFile` deprecated since version 3.2 has been removed -
  use `add_real_file` instead

### Infrastructure
* transferred the repository to the `pytest-dev` organization
* renamed the `master` branch to `main`
* added automatic PyPI release workflow
* move documentation from GitHub Pages to Read the Docs

### New Features
* added some support for `st_blocks` in stat result
  (see [#722](../../issues/722))

### Fixes
* fixed handling of `O_TMPFILE` in `os.open` (caused handling of
  `O_DIRECTORY` as `O_TMPFILE`) (see [#723](../../issues/723))
* fixed handling of read permissions (see [#719](../../issues/719))

## [Version 4.7.0](https://pypi.python.org/pypi/pyfakefs/4.7.0) (2022-09-18)
Changed handling of nested fixtures and bug fixes.

### Changes
* `fs` fixtures cannot be nested; any nested `fs` fixture (for example
  inside an `fs_session` or `fs_module` fixture) will just reference the outer
  fixture (the behavior had been unexpected before)

### Fixes
* reverted a performance optimization introduced in version 3.3.0 that
  caused hanging tests with installed torch (see [#693](../../issues/693))
* do not use the built-in opener in `pathlib` as it may cause problems
  (see [#697](../../issues/697))
* add support for path-like objects in `shutil.disk_usage`
  (see [#699](../../issues/699))
* do not advertise support for Python 3.6 in `setup.py`
  (see [#707](../../issues/707))
* return the expected type from `fcntl.ioctl` and `fcntl.fcntl` calls if `arg`
  is of type `byte`; the call itself does nothing as before
* do not skip filesystem modules by name to allow using own modules with
  the same name (see [#707](../../issues/707))
* add missing support for `os.renames` (see [#714](../../issues/714))

## [Version 4.6.3](https://pypi.python.org/pypi/pyfakefs/4.6.3) (2022-07-20)
Another patch release that fixes a regression in version 4.6.

### Changes
* automatically reset filesystem on changing `is_windows_fs` or `is_macos`
  (see [#692](../../issues/692)) - ensures better upwards compatibility in
  most cases

  :warning: Make sure you write to the filesystem _after_ you change
  `is_windows_fs` or `is_macos`, otherwise the changes will be lost.

### Fixes
* fixed regression: `os.path.exists` returned `True` for any root drive path under Windows

## [Version 4.6.2](https://pypi.python.org/pypi/pyfakefs/4.6.2) (2022-07-14)
Patch release that fixes an error in the previous patch.

### Fixes
* fixed support for `opener` introduced in previous patch release
  (see [#689](../../issues/689))

## [Version 4.6.1](https://pypi.python.org/pypi/pyfakefs/4.6.1) (2022-07-13)
Fixes incompatibility with Python 3.11 beta 4.

_Note_: Python 3.11 is only supported in the current beta 4 version, problems
with later beta or rc versions are still possible. We will try to fix such
problems in short order should they appear.

### Fixes
* added support for `opener` argument in `open`, which is used in `tempfile`
  in Python 3.11 since beta 4 (see [#686](../../issues/686))

### Infrastructure
* make sure tests run without `pyfakefs` installed as a package
  (see [#687](../../issues/687))

## [Version 4.6.0](https://pypi.python.org/pypi/pyfakefs/4.6.0) (2022-07-12)
Adds support for Python 3.11, removes support for Python 3.6, changes root
path behavior under Windows.

### Changes
* Python 3.6 has reached its end of life on 2021/12/23 and is no
  longer officially supported by pyfakefs
  * `os.stat_float_times` has been removed in Python 3.7 and is therefore no
     longer supported
* under Windows, the root path is now effectively `C:\` instead of `\`; a
  path starting with `\` points to the current drive as in the real file
  system (see [#673](../../issues/673))
* fake `pathlib.Path.owner()` and `pathlib.Path.group()` now behave like the
  real methods - they look up the real user/group name for the user/group id
  that is associated with the fake file (see [#678](../../issues/678))

### New Features
* added some support for the upcoming Python version 3.11
  (see [#677](../../issues/677))
* added convenience fixtures for module- and session based `fs` fixtures
  (`fs_module` and `fs_session`)

### Fixes
* fixed an incompatibility of `tmpdir` (and probably other fixtures) with the
  module-scoped version of `fs`; had been introduced in
  pyfakefs 4.5.5 by the fix for [#666](../../issues/666)
  (see [#684](../../issues/684))

## [Version 4.5.6](https://pypi.python.org/pypi/pyfakefs/4.5.6) (2022-03-17)
Fixes a regression which broke tests with older pytest versions (< 3.9).

### Changes
* minimum supported pytest version is now 3.0 (older versions do not work
  properly with current Python versions)

### Fixes
* only skip `_pytest.pathlib` in pytest versions where it is actually present
  (see [#669](../../issues/669))

### Infrastructure
* add tests with different pytest versions, starting with 3.0

## [Version 4.5.5](https://pypi.python.org/pypi/pyfakefs/4.5.5) (2022-02-14)
Bugfix release, needed for compatibility with pytest 7.0.

### Fixes
* correctly handle file system space for files opened in write mode
  (see [#660](../../issues/660))
* correctly handle reading/writing pipes via file
  (see [#661](../../issues/661))
* disallow `encoding` argument on binary `open()`
  (see [#664](../../issues/664))
* fixed compatibility issue with pytest 7.0.0
  (see [#666](../../issues/666))

## [Version 4.5.4](https://pypi.python.org/pypi/pyfakefs/4.5.4) (2022-01-12)
Minor bugfix release.

### Fixes
* added missing mocked functions for fake pipe (see [#650](../../issues/650))
* fixed some bytes warnings (see [#651](../../issues/651))

## [Version 4.5.3](https://pypi.python.org/pypi/pyfakefs/4.5.3) (2021-11-08)
Reverts a change in the previous release that could cause a regression.

### Changes
* `os.listdir`, `os.scandir` and `pathlib.Path.listdir` now return the
  directory list in a random order only if explicitly configured in the
  file system (use `fs.shuffle_listdir_results = True` with `fs` being the
  file system). In a future version, the default may be changed to better
  reflect the real filesystem behavior (see [#647](../../issues/647))

## [Version 4.5.2](https://pypi.python.org/pypi/pyfakefs/4.5.2) (2021-11-07)
This is a bugfix release.

### Changes
* `os.listdir`, `os.scandir` and `pathlib.Path.listdir` now return the
  directory list in a random order (see [#638](../../issues/638))
* the `fcntl` module under Unix is now mocked, e.g. all functions have no
  effect (this may be changed in the future if needed,
  see [#645](../../issues/645))

### Fixes
* fixed handling of alternative path separator in `os.path.split`,
  `os.path.splitdrive` and `glob.glob`
  (see [#632](../../issues/632))
* fixed handling of failed rename due to permission error
  (see [#643](../../issues/643))


## [Version 4.5.1](https://pypi.python.org/pypi/pyfakefs/4.5.1) (2021-08-29)
This is a bugfix release.

### Fixes
* added handling of path-like where missing
* improved handling of `str`/`bytes` paths
* suppress all warnings while inspecting loaded modules
  (see [#614](../../issues/614))
* do not import pandas and related modules if it is not patched
  (see [#627](../../issues/627))
* handle `pathlib.Path.owner()` and `pathlib.Path.group` by returning
  the current user/group name (see [#629](../../issues/629))
* fixed handling of `use_known_patches=False` (could cause an exception)
* removed Python 3.5 from metadata to disable installation for that version
  (see [#615](../../issues/615))

### Infrastructure
* added test dependency check (see [#608](../../issues/608))
* skip tests failing with ASCII locale
  (see [#623](../../issues/623))

## [Version 4.5.0](https://pypi.python.org/pypi/pyfakefs/4.5.0) (2021-06-04)
Adds some support for Python 3.10 and basic type checking.

_Note_: This version has been yanked from PyPI as it erroneously allowed
installation under Python 3.5.

### New Features
  * added support for some Python 3.10 features:
    * new method `pathlib.Path.hardlink_to`
    * new `newline` argument in `pathlib.Path.write_text`
    * new `follow_symlinks` argument in `pathlib.Path.stat` and
     `pathlib.Path.chmod`
    * new 'strict' argument in `os.path.realpath`

### Changes
  * Python 3.5 has reached its end of life in September 2020 and is no longer
    supported
  * `pathlib2` is still supported, but considered to have the same
    functionality as `pathlib` and is no longer tested separately;
    the previous behavior broke newer `pathlib` features if `pathlib2`
    was installed (see [#592](../../issues/592))

### Fixes
  * correctly handle byte paths in `os.path.exists`
    (see [#595](../../issues/595))
  * Update `fake_pathlib` to support changes coming in Python 3.10
    ([see](https://github.com/python/cpython/pull/19342)
  * correctly handle UNC paths in `os.path.split` and in directory path
    evaluation (see [#606](../../issues/606))

### Infrastructure
  * added mypy checks in CI (see [#599](../../issues/599))

## [Version 4.4.0](https://pypi.python.org/pypi/pyfakefs/4.4.0) (2021-02-24)
Adds better support for Python 3.8 / 3.9.

### New Features
  * added support for `pathlib.Path.link_to` (new in Python 3.8)
    (see [#580](../../issues/580))
  * added support for `pathlib.Path.readlink` (new in Python 3.9)
    (see [#584](../../issues/584))
  * added `FakeFilesystem.create_link` convenience method which creates
    intermittent directories (see [#580](../../issues/580))

### Fixes
  * fixed handling of pipe descriptors in the fake filesystem
    (see [#581](../../issues/581))
  * added non-functional argument `effective_ids` to `os.access`
    (see [#585](../../issues/585))
  * correctly handle `os.file` for unreadable files
    (see [#588](../../issues/588))

### Infrastructure
  * added automatic documentation build and check-in

## [Version 4.3.3](https://pypi.python.org/pypi/pyfakefs/4.3.3) (2020-12-20)

Another bugfix release.

### Fixes
* Reverted one Windows-specific optimization that can break tests under some
  conditions (see [#573](../../issues/573))
* Setting `os` did not reset `os.sep` and related variables,
  fixed null device name, added `os.pathsep` and missing `os.path` variables
  (see [#572](../../issues/572))

## [Version 4.3.2](https://pypi.python.org/pypi/pyfakefs/4.3.2) (2020-11-26)

This is a bugfix release that fixes a regression introduced in version 4.2.0.

### Fixes
* `open` calls had not been patched for modules with a name ending with "io"
  (see [#569](../../issues/569))

## [Version 4.3.1](https://pypi.python.org/pypi/pyfakefs/4.3.1) (2020-11-23)

This is an update to the performance release, with more setup caching and the
possibility to disable it.

### Changes
* Added caching of patched modules to avoid lookup overhead
* Added `use_cache` option and `clear_cache` method to be able
  to deal with unwanted side effects of the newly introduced caching

### Infrastructure
* Moved CI builds to GitHub Actions for performance reasons

## [Version 4.3.0](https://pypi.python.org/pypi/pyfakefs/4.3.0) (2020-11-19)

This is mostly a performance release. The performance of the pyfakefs setup has
been decreasing sufficiently, especially with the 4.x releases. This release
corrects that by making the most expansive feature optional, and by adding some
other performance improvements. This shall decrease the setup time by about a
factor of 20, and it shall now be comparable to the performance of the 3.4
release.

### Changes
  * The `patchfs` decorator now expects a positional argument instead of the
    keyword arguments `fs`. This avoids confusion with the pytest `fs`
    fixture and conforms to the behavior of `mock.patch`. You may have to
    adapt the argument order if you use the `patchfs` and `mock.patch`
    decorators together (see [#566](../../issues/566))
  * Default arguments that are file system functions are now _not_ patched by
    default to avoid a large performance impact. An additional parameter
    `patch_default_args` has been added that switches this behavior on
    (see [#567](../../issues/567)).
  * Added performance improvements in the test setup, including caching the
    the unpatched modules

## [Version 4.2.1](https://pypi.python.org/pypi/pyfakefs/4.2.1) (2020-11-02)

This is a bugfix release that fixes a regression issue.

### Fixes
  * remove dependency of pyfakefs on `pytest` (regression,
    see [#565](../../issues/565))

## [Version 4.2.0](https://pydpi.python.org/pypi/pyfakefs/4.2.0) (2020-11-01)

#### New Features
  * add support for the `buffering` parameter in `open`
    (see [#549](../../issues/549))
  * add possibility to patch `io.open_code` using the new argument
    `patch_open_code` (since Python 3.8)
    (see [#554](../../issues/554))
  * add possibility to set file system OS via `FakeFilesystem.os`

#### Fixes
  * fix check for link in `os.walk` (see [#559](../../issues/559))
  * fix handling of real files in combination with `home` if simulating
    Posix under Windows (see [#558](../../issues/558))
  * do not call fake `open` if called from skipped module
    (see [#552](../../issues/552))
  * do not call fake `pathlib.Path` if called from skipped module
    (see [#553](../../issues/553))
  * fixed handling of `additional_skip_names` with several module components
  * allow to open existing pipe file descriptor
    (see [#493](../../issues/493))
  * do not truncate file on failed flush
    (see [#548](../../issues/548))
  * suppress deprecation warnings while collecting modules
    (see [#542](../../issues/542))
  * add support for `os.truncate` and `os.ftruncate`
    (see [#545](../../issues/545))

#### Infrastructure
  * fixed another problem with CI test scripts not always propagating errors
  * make sure pytest will work without pyfakefs installed
   (see [#550](../../issues/550))

## [Version 4.1.0](https://pypi.python.org/pypi/pyfakefs/4.1.0) (2020-07-12)

#### New Features
  * Added some support for pandas (`read_csv`, `read_excel` and more), and
   for django file locks to work with the fake filesystem
   (see [#531](../../issues/531))

#### Fixes
  * `os.expanduser` now works with a bytes path
  * Do not override global warnings setting in `Deprecator`
    (see [#526](../../issues/526))
  * Make sure filesystem modules in `pathlib` are patched
    (see [#527](../../issues/527))
  * Make sure that alternative path separators are correctly handled under Windows
    (see [#530](../../issues/530))

#### Infrastructure
  * Make sure all temporary files from real fs tests are removed

## [Version 4.0.2](https://pypi.python.org/pypi/pyfakefs/4.0.2) (2020-03-04)

This as a patch release that only builds for Python 3. Note that
versions 4.0.0 and 4.0.1 will be removed from PyPI to disable
installing them under Python 2.

#### Fixes
  * Do not build for Python 2 (see [#524](../../issues/524))

## [Version 4.0.1](https://pypi.python.org/pypi/pyfakefs/4.0.1) (2020-03-03)

This as a bug fix release for a regression bug.

_Note_: This version has been yanked from PyPI as it erroneously allowed
installation under Python 2. This has been fixed in version 4.0.2.

#### Fixes
  * Avoid exception if using `flask-restx` (see [#523](../../issues/523))

## [Version 4.0.0](https://pypi.python.org/pypi/pyfakefs/4.0.0) (2020-03-03)
pyfakefs 4.0.0 drops support for Python 2.7. If you still need
Python 2.7, you can continue to use pyfakefs 3.7.x.

_Note_: This version has been yanked from PyPI as it erroneously allowed
installation under Python 2. This has been fixed in version 4.0.2.

#### Changes
  * Removed Python 2.7 and 3.4 support (see [#492](../../issues/492))

#### New Features
  * Added support for handling keyword-only arguments in some `os` functions
  * Added possibility to pass additional parameters to `fs` pytest fixture
  * Added automatic patching of default arguments that are file system
    functions
  * Added convenience decorator `patchfs` to patch single functions using
    the fake filesystem

#### Fixes
  * Added missing `st_ino` in `makedir` (see [#515](../../issues/515))
  * Fixed handling of relative paths in `lresolve` / `os.lstat`
    (see [#516](../../issues/516))
  * Fixed handling of byte string paths
    (see [#517](../../issues/517))
  * Fixed `os.walk` if path ends with path separator
    (see [#512](../../issues/512))
  * Fixed handling of empty path in `os.makedirs`
    (see [#510](../../issues/510))
  * Fixed handling of `os.TMPFILE` flag under Linux
    (see [#509](../../issues/509) and [#511](../../issues/511))
  * Adapted fake `pathlib` to changes in Python 3.7.6/3.8.1
    (see [#508](../../issues/508))
  * Fixed behavior of `os.makedirs` in write-protected directory
    (see [#507](../../issues/507))

## [Version 3.7.2](https://pypi.python.org/pypi/pyfakefs/3.7.2) (2020-03-02)

This version backports some fixes from main.

#### Fixes
  * Fixed handling of relative paths in `lresolve` / `os.lstat`
    (see [#516](../../issues/516))
  * Fixed `os.walk` if path ends with path separator
    (see [#512](../../issues/512))
  * Fixed handling of empty path in `os.makedirs`
    (see [#510](../../issues/510))
  * Fixed handling of `os.TMPFILE` flag under Linux
    (see [#509](../../issues/509) and [#511](../../issues/511))
  * Fixed behavior of `os.makedirs` in write-protected directory
    (see [#507](../../issues/507))

## [Version 3.7.1](https://pypi.python.org/pypi/pyfakefs/3.7.1) (2020-02-14)

This version adds support for Python 3.7.6 and 3.8.1.

#### Fixes
  * Adapted fake `pathlib` to changes in Python 3.7.6/3.8.1
    (see [#508](../../issues/508)) (backported from main)

## [Version 3.7](https://pypi.python.org/pypi/pyfakefs/3.7) (2019-11-23)

This version adds support for Python 3.8.

_Note:_ This is the last pyfakefs version that will support Python 2.7
and Python 3.4 (possible bug fix releases notwithstanding).

#### New Features
  * added support for Python 3.8 (see [#504](../../issues/504))
  * added preliminary support for Windows-specific `os.stat_result` attributes
    `tst_file_attributes` and `st_reparse_tag` (see [#504](../../issues/504))
  * added support for fake `os.sendfile` (Posix only, Python 3 only)
    (see [#504](../../issues/504))

#### Fixes
  * support `devnull` in Windows under Python 3.8
    (see [#504](../../issues/504))
  * fixed side effect of calling `DirEntry.stat()` under Windows (changed
    st_nlink) (see [#502](../../issues/502))
  * fixed problem of fake modules still referenced after a test in modules
    loaded during the test (see [#501](../../issues/501) and [#427](../../issues/427))
  * correctly handle missing read permission for parent directory
    (see [#496](../../issues/496))
  * raise for `os.scandir` with non-existing directory
    (see [#498](../../issues/498))

#### Infrastructure
  * fixed CI tests scripts to always propagate errors
    (see [#500](../../issues/500))

## [Version 3.6.1](https://pypi.python.org/pypi/pyfakefs/3.6.1) (2019-10-07)

#### Fixes
  * avoid rare side effect during module iteration in test setup
    (see [#338](../../issues/338))
  * make sure real OS tests are not executed by default
    (see [#495](../../issues/495))

## [Version 3.6](https://pypi.python.org/pypi/pyfakefs/3.6) (2019-06-30)

#### Changes
  * removed unneeded parameter `use_dynamic_patch`

#### New Features
  * support for `src_dir_fd` and `dst_dir_fd` arguments in `os.rename`,
    `os.replace` and `os.link`
  * added possibility to use modules instead of module names for the
    `additional_skip_names` argument (see [#482](../../issues/482))
  * added argument `allow_root_user` to `Patcher` and `UnitTest` to allow
    forcing non-root access (see [#474](../../issues/474))
  * added basic support for `os.pipe` (see [#473](../../issues/473))
  * added support for symlinks in `add_real_directory`
  * added new public method `add_real_symlink`

#### Infrastructure
  * added check for correctly installed Python 3 version in Travis.CI
    (see [#487](../../issues/487))

#### Fixes
  * fixed incorrect argument names for some `os` functions
  * fake `DirEntry` now implements `os.PathLike` in Python >= 3.6
    (see [#483](../../issues/483))
  * fixed incorrect argument name for `os.makedirs`
    (see [#481](../../issues/481))
  * avoid pytest warning under Python 2.7 (see [#466](../../issues/466))
  * add __next__ to FakeFileWrapper (see [#485](../../issues/485))

## [Version 3.5.8](https://pypi.python.org/pypi/pyfakefs/3.5.8) (2019-06-21)

Another bug-fix release that mainly fixes a regression with Python 2 that has
been introduced in version 3.5.3.

#### Fixes
  * regression: patching built-in `open` under Python 2 broke unit tests
    (see [#469](../../issues/469))
  * fixed writing to file added with `add_real_file`
    (see [#470](../../issues/470))
  * fixed argument name of `FakeIOModule.open` (see [#471](../../pull/471))

#### Infrastructure
  * more changes to run tests using `python setup.py test` under Python 2
    regardless of `pathlib2` presence

## [Version 3.5.7](https://pypi.python.org/pypi/pyfakefs/3.5.7) (2019-02-08)

This is mostly a bug-fix release.

#### Fixes
  * regression: `pathlib` did not get patched in the presence of `pathlib2`
    (see [#467](../../issues/467))
  * fixed errors if running the PyCharm debugger under Python 2
    (see [#464](../../issues/464))

#### Infrastructure
  * do not run real file system tests by default (fixes deployment problem,
    see [#465](../../issues/465))
  * make tests run if running `python setup.py test` under Python 2

## [Version 3.5.6](https://pypi.python.org/pypi/pyfakefs/3.5.6) (2019-01-13)

#### Changes
  * import external `pathlib2` and `scandir` packages first if present
    (see [#462](../../issues/462))

## [Version 3.5.5](https://pypi.python.org/pypi/pyfakefs/3.5.5) (2018-12-20)

#### Fixes
  * removed shebang from test files to avoid packaging warnings
   (see [#461](../../issues/461))

## [Version 3.5.4](https://pypi.python.org/pypi/pyfakefs/3.5.4) (2018-12-19)

#### New Features
  * added context manager class `Pause` for pause/resume
    (see [#448](../../issues/448))

#### Fixes
  * fixed `AttributeError` shown while displaying `fs` in a failing pytest
    in Python 2
  * fixed permission handling for root user
  * avoid `AttributeError` triggered by modules without `__module__` attribute
    (see [#460](../../issues/460))

## [Version 3.5.3](https://pypi.python.org/pypi/pyfakefs/3.5.3) (2018-11-22)

This is a minor release to have a version with passing tests for OpenSUSE
packaging.

#### New Features
  * automatically patch file system methods imported as another name like
    `from os.path import exists as my_exists`, including builtin `open`
    and `io.open`

#### Fixes
  * make tests for access time less strict to account for file systems that
    do not change it immediately ([#453](../../issues/453))

## [Version 3.5.2](https://pypi.python.org/pypi/pyfakefs/3.5.2) (2018-11-11)

This is mostly a bug-fix release.

#### New Features
  * added support for pause/resume of patching the file system modules
    ([#448](../../issues/448))
  * allow to set current group ID, set current user ID and group ID as
    `st_uid` and `st_gid` in new files ([#449](../../issues/449))

#### Fixes
  * fixed using `modules_to_patch` (regression, see [#450](../../issues/450))
  * fixed recursion error on unpickling the fake file system
    ([#445](../../issues/445))
  * allow trailing path in `add_real_directory` ([#446](../../issues/446))

## [Version 3.5](https://pypi.python.org/pypi/pyfakefs/3.5) (2018-10-22)

#### Changes
  * This version of pyfakefs does not support Python 3.3. Python 3.3 users
    must keep using pyfakefs 3.4.3, or upgrade to a newer Python version.
  * The deprecation warnings for the old API are now switched on by default.
    To switch them off for legacy code, use:
    ```python
    from pyfakefs.deprecator import Deprecator

    Deprecator.show_warnings = False
    ```

#### New Features
  * Improved automatic patching:
    * automatically patch methods of a patched file system module imported like
      `from os.path import exists` ([#443](../../pull/443))
    * a module imported as another name (`import os as _os`) is now correctly
      patched without the need of additional parameters
      ([#434](../../pull/434))
    * automatically patch `Path` if imported like `from pathlib import Path`
      ([#440](../../issues/440))
    * parameter `patch_path` has been removed from `UnitTest` and `Patcher`,
      the correct patching of `path` imports is now done automatically
      ([#429](../../pull/429))
    * `UnitTest` /`Patcher` arguments can now also be set in `setUpPyfakefs()`
      ([#430](../../pull/430))
  * added possibility to set user ID ([#431](../../issues/431))
  * added side_effect option to fake files ([#433](../../pull/433))
  * added some support for extended filesystem attributes under Linux
    ([#423](../../issues/423))
  * handle `contents=None` in `create_file()` as empty contents if size not
    set ([#424](../../issues/424))
  * added `pathlib2` support ([#408](../../issues/408)) ([#422](../../issues/422))
  * added support for null device ([#418](../../issues/418))
  * improved error message for "Bad file descriptor in fake filesystem"
    ([#419](../../issues/419))

#### Fixes
  * fixed pytest when both pyfakefs and future are installed
    ([#441](../../issues/441))
  * file timestamps are now updated more according to the real behavior
    ([#435](../../issues/435))
  * fixed a problem related to patching `shutil` functions using `zipfile`
    ([#427](../../issues/427))

## [Version 3.4.3](https://pypi.python.org/pypi/pyfakefs/3.4.3) (2018-06-13)

This is mostly a bug fix release, mainly for bugs found by
[@agroce](https://github.com/agroce) using [tstl](https://github.com/agroce/tstl).

#### New Features
  * added support for path-like objects as arguments in `create_file()`,
  `create_dir()`, `create_symlink()`, `add_real_file()` and
  `add_real_directory()` (Python >= 3.6, see [#409](../../issues/409))

#### Infrastructure
  * moved tests into package
  * use README.md in pypi ([#358](../../issues/358))

#### Fixes
  * `tell` after `seek` gave incorrect result in append mode
  ([#363](../../issues/363))
  * a failing pytest did not display the test function correctly
  ([#381](../../issues/381))
  * flushing file contents after truncate was incorrect under some conditions
  ([#412](../../issues/412))
  * `readline()` did not work correctly in binary mode
  ([#411](../../issues/411))
  *  `pathlib.Path.resolve()` behaved incorrectly if the path does not exist
  ([#401](../../issues/401))
  * `closed` attribute was not implemented in fake file ([#380](../../issues/380))
  * `add_real_directory` did not behave correctly for nested paths
  * the following functions did not behave correctly for paths ending with a
  path separator (found by @agroce using [tstl](https://github.com/agroce/tstl)):
    * `os.rename` ([#400](../../issues/400))
    * `os.link` ([#399](../../issues/399), [#407](../../issues/407))
    * `os.rmdir` ([#398](../../issues/398))
    * `os.mkdir`, `os.makedirs` ([#396](../../issues/396))
    * `os.rename` ([#391](../../issues/391), [#395](../../issues/395),
    [#396](../../issues/396), [#389](../../issues/389),
    [#406](../../issues/406))
    * `os.symlink` ([#371](../../issues/371), [#390](../../issues/390))
    * `os.path.isdir` ([#387](../../issues/387))
    * `open` ([#362](../../issues/362), [#369](../../issues/369),
    [#397](../../issues/397))
    * `os.path.lexists`, `os.path.islink` ([#365](../../issues/365),
    [#373](../../issues/373), [#396](../../issues/396))
    * `os.remove` ([#360](../../issues/360), [#377](../../issues/377),
    [#396](../../issues/396))
    * `os.stat` ([#376](../../issues/376))
    * `os.path.isfile` ([#374](../../issues/374))
    * `os.path.getsize` ([#368](../../issues/368))
    * `os.lstat` ([#366](../../issues/366))
    * `os.path.exists` ([#364](../../issues/364))
    * `os.readlink` ([#359](../../issues/359), [#372](../../issues/372),
    [#392](../../issues/392))

## [Version 3.4.1](https://pypi.python.org/pypi/pyfakefs/3.4.1) (2018-03-18)

This is a bug fix only release.

#### Fixes
  * Missing cleanup after using dynamic patcher let to incorrect behavior of
   `tempfile` after test execution (regression, see [#356](../../issues/356))
  * `add_real_directory` does not work after `chdir` (see [#355](../../issues/355))

## [Version 3.4](https://pypi.python.org/pypi/pyfakefs/3.4) (2018-03-08)

This version of pyfakefs does not support Python 2.6.  Python 2.6 users
must use pyfakefs 3.3 or earlier.

#### New Features
  * Added possibility to map real files or directories to another path in
  the fake file system (see [#347](../../issues/347))
  * Configuration of `Patcher` and `TestCase`:
    * Possibility to reload modules is now also available in `Patcher`
    * Added possibility to add own fake modules via `modules_to_patch`
    argument (see [#345](../../issues/345))
    * Dynamic loading of modules after setup is now on by default and no more
    considered experimental (see [#340](../../issues/340))
  * Added support for file descriptor path parameter in `os.scandir`
   (Python >= 3.7, Posix only) (see [#346](../../issues/346))
  * Added support to fake out backported `scandir` module ([#332](../../issues/332))
  * `IOError`/`OSError` exception messages in the fake file system now always
  start with the message issued in the real file system in Unix systems (see [#202](../../issues/202))

#### Infrastructure
  * Changed API to be PEP-8 conform ([#186](../../issues/186)). Note: The old
    API is still available.
  * Removed Python 2.6 support ([#293](../../issues/293))
  * Added usage documentation to GitHub Pages
  * Added contributing guide
  * Added flake8 tests to Travis CI

#### Fixes
  * Links in base path in `os.scandir` shall not be resolved ([#350](../../issues/350))
  * Fixed unit tests when run on a computer not having umask set to 0022
  * Correctly handle newline parameter in `open()` for Python 3, added support for universal newline mode in Python 2 ([#339](../../issues/339))
  * Fixed handling of case-changing rename with symlink under MacOS ([#322](../../issues/322))
  * Creating a file with a path ending with path separator did not raise ([#320](../../issues/320))
  * Fixed more problems related to `flush` ([#302](../../issues/302), [#300](../../issues/300))
  * Correctly handle opening files more than once ([#343](../../issues/343))
  * Fake `os.lstat()` crashed with several trailing path separators ([#342](../../issues/342))
  * Fixed handling of path components starting with a drive letter([#337](../../issues/337))
  * Symlinks to absolute paths were incorrectly resolved under Windows ([#341](../../issues/341))
  * Unittest mock didn't work after setUpPyfakefs ([#334](../../issues/334))
  * `os.path.split()` and `os.path.dirname()` gave incorrect results under Windows ([#335](../../issues/335))

## [Version 3.3](https://pypi.python.org/pypi/pyfakefs/3.3) (2017-11-12)

This is the last release that supports Python 2.6.

#### New Features
  * The OS specific temp directory is now automatically created in `setUp()` (related to [#191](../../issues/191)).
    Note that this may break test code that assumes that the fake file system is completely empty at test start.
  * Added possibility to reload modules and switch on dynamic loading of modules
    after setup (experimental, see [#248](../../issues/248))
  * Added possibility to patch modules that import file system modules under
    another name, for example `import os as '_os` ([#231](../../issues/231))
  * Added support for `dir_fd` argument in several `os` functions
    ([#206](../../issues/206))
  * Added support for open file descriptor as path argument in `os.utime`,
    `os.chmod`, `os.chdir`, `os.chown`, `os.listdir`, `os.stat` and `os.lstat`
    (Python >= 3.3) ([#205](../../issues/205))
  * Added support for basic modes in fake `os.open()` ([#204](../../issues/204))
  * Added fake `os.path.samefile` implementation ([#193](../../issues/193))
  * Added support for `ns` argument in `os.utime()` (Python >= 3.3)
    ([#192](../../issues/192))
  * Added nanosecond time members in `os.stat_result` (Python >= 3.3)
    ([#196](../../issues/196))

#### Infrastructure
  * Added Travis CI tests for MacOSX (Python 2.7 and 3.6)
  * Added Appveyor CI tests for Windows (Python 2.7, 3.3 and 3.6)
  * Added auto-generated documentation for development version on GitHub Pages
  * Removed most of `fake_filesystem_shutil` implementation, relying on the
    patched `os` module instead ([#194](../../issues/194))
  * Removed `fake_tempfile` and `fake_filesystem_glob`, relying on the patched
    `os` module instead ([#189](../../issues/189), [#191](../../issues/191))

#### Fixes
  * Multiple fixes of bugs found using TSTL by @agroce (see about 100 issues
    with the `TSTL` label)
    * several problems with buffer handling in high-level IO functions
    * several problems with multiple handles on the same file
    * several problems with low-level IO functions
    * incorrect exception (`IOError` vs `OSError`) raised in several cases
    * Fake `rename` did not behave like `os.rename` in many cases
    * Symlinks have not been considered or incorrectly handled in several
      functions
    * A nonexistent file that has the same name as the content of the parent
      object was seen as existing
    * Incorrect error handling during directory creation
    * many fixes for OS-specific behavior
  * Also patch modules that are loaded between `__init__()` and `setUp()`
    ([#199](../../issues/199))
  * Creating files in read-only directory was possible ([#203](../../issues/203))

## [Version 3.2](https://pypi.python.org/pypi/pyfakefs/3.2) (2017-05-27)

#### New Features
  * The `errors` argument is supported for `io.open()` and `os.open()`
  * New methods `add_real_file()`, `add_real_directory()` and `add_real_paths()`
    make real files and directories appear within the fake file system.
    File contents are read from the real file system only as needed ([#170](../../issues/170)).
    See `example_test.py` for a usage example.
  * Deprecated `TestCase.copyRealFile()` in favor of `add_real_file()`.
    `copyRealFile()` remains only for backward compatibility.  Also, some
    less-popular argument combinations have been disallowed.
  * Added this file you are reading, `CHANGES.md`, to the release manifest

#### Infrastructure
  * The `mox3` package is no longer a prerequisite--the portion required by pyfakefs
    has been integrated into pyfakefs ([#182](../../issues/182))

#### Fixes
 * Corrected the handling of byte/unicode paths in several functions ([#187](../../issues/187))
 * `FakeShutilModule.rmtree()` failed for directories ending with path separator ([#177](../../issues/177))
 * Case was incorrectly handled for added Windows drives
 * `pathlib.glob()` incorrectly handled case under MacOS ([#167](../../issues/167))
 * tox support was broken ([#163](../../issues/163))
 * On Windows it was not possible to rename a file when only the case of the file
   name changed ([#160](../../issues/160))

## [Version 3.1](https://pypi.python.org/pypi/pyfakefs/3.1) (2017-02-11)

#### New Features
 * Added helper method `TestCase.copyRealFile()` to copy a file from
   the real file system to the fake file system. This makes it easy to use
   template, data and configuration files in your tests.
 * A pytest plugin is now installed with pyfakefs that exports the
   fake filesystem as pytest fixture `fs`.

#### Fixes
 * Incorrect disk usage calculation if too large file created ([#155](../../issues/155))

## [Version 3.0](https://pypi.python.org/pypi/pyfakefs/3.0) (2017-01-18)

#### New Features
 * Support for path-like objects as arguments in fake `os`
   and `os.path` modules (Python >= 3.6)
 * Some changes to make pyfakefs work with Python 3.6
 * Added fake `pathlib` module (Python >= 3.4) ([#29](../../issues/29))
 * Support for `os.replace` (Python >= 3.3)
 * `os.access`, `os.chmod`, `os.chown`, `os.stat`, `os.utime`:
   support for `follow_symlinks` argument (Python >= 3.3)
 * Support for `os.scandir` (Python >= 3.5) ([#119](../../issues/119))
 * Option to not fake modules named `path` ([#53](../../issues/53))
 * `glob.glob`, `glob.iglob`: support for `recursive` argument (Python >= 3.5) ([#116](../../issues/116))
 * Support for `glob.iglob` ([#59](../../issues/59))

#### Infrastructure
 * Added [auto-generated documentation](http://pytest-dev.github.io/pyfakefs/)

#### Fixes
 * `shutil.move` incorrectly moves directories ([#145](../../issues/145))
 * Missing support for 'x' mode in `open` (Python >= 3.3) ([#147](../../issues/147))
 * Incorrect exception type in Posix if path ancestor is a file ([#139](../../issues/139))
 * Exception handling when using `Patcher` with py.test ([#135](../../issues/135))
 * Fake `os.listdir` returned sorted instead of unsorted entries

## [Version 2.9](https://pypi.python.org/pypi/pyfakefs/2.9) (2016-10-02)

#### New Features
 * `io.open`, `os.open`: support for `encoding` argument ([#120](../../issues/120))
 * `os.makedirs`: support for `exist_ok` argument (Python >= 3.2) ([#98](../../issues/98))
 * Support for fake `io.open()` ([#70](../../issues/70))
 * Support for mount points ([#25](../../issues/25))
 * Support for hard links ([#75](../../issues/75))
 * Support for float times (mtime, ctime)
 * Windows support:
     * support for alternative path separator
     * support for case-insensitive filesystems ([#69](../../issues/69))
     * support for drive letters and UNC paths
 * Support for filesystem size ([#86](../../issues/86))
 * `shutil.rmtree`: support for `ignore_errors` and `onerror` arguments ([#72](../../issues/72))
 * Support for `os.fsync()` and `os.fdatasync()` ([#73](../../issues/73))
 * `os.walk`: Support for `followlinks` argument

#### Fixes
 * `shutil` functions like `make_archive` do not work with pyfakefs ([#104](../../issues/104))
 * File permissions on deletion not correctly handled ([#27](../../issues/27))
 * `shutil.copy` error with bytes contents ([#105](../../issues/105))
 * mtime and ctime not updated on content changes

## [Version 2.7](https://pypi.python.org/pypi/pyfakefs/2.7)

#### Infrastructure
 * Moved repository from GoogleCode to GitHub, merging 3 projects
 * Added continuous integration testing with Travis CI
 * Added usage documentation in project wiki
 * Better support for pypi releases

#### New Features
 * Added direct unit test support in `fake_filesystem_unittest`
   (transparently patches all calls to faked implementations)
 * Added support for doctests
 * Added support for cygwin
 * Better support for Python 3

#### Fixes
 * `os.utime` fails to traverse symlinks ([#49](../../issues/49))
 * `chown` incorrectly accepts non-integer uid/gid arguments ([#30](../../issues/30))
 * Reading from fake block devices doesn't work ([#24](../../issues/24))
 * `fake_tempfile` is using `AddOpenFile` incorrectly ([#23](../../issues/23))
 * Incorrect behavior of `relpath`, `abspath` and `normpath` on Windows.
 * Cygwin wasn't treated as Windows ([#37](../../issues/37))
 * Python 3 `open` in binary mode not working ([#32](../../issues/32))
 * `os.remove` doesn't work with relative paths ([#31](../../issues/31))
 * `mkstemp` returns no valid file descriptor ([#19](../../issues/19))
 * `open` methods lack `IOError` for prohibited operations ([#18](../../issues/18))
 * Incorrectly resolved relative path ([#3](../../issues/3))
 * `FakeFileOpen` keyword args do not match the `__builtin__` equivalents ([#5](../../issues/5))
 * Relative paths not supported ([#16](../../issues/16), [#17](../../issues/17)))

## Older Versions
There are no release notes for releases 2.6 and below.  The following versions are still available on PyPI:
 * [1.1](https://pypi.python.org/pypi/pyfakefs/1.1), [1.2](https://pypi.python.org/pypi/pyfakefs/1.2), [2.0](https://pypi.python.org/pypi/pyfakefs/2.0), [2.1](https://pypi.python.org/pypi/pyfakefs/2.1), [2.2](https://pypi.python.org/pypi/pyfakefs/2.2), [2.3](https://pypi.python.org/pypi/pyfakefs/2.3) and [2.4](https://pypi.python.org/pypi/pyfakefs/2.4)
