x.x.x (xx-xx-xxxx)
0.22.3 (05-01-2024) - minimal python version downgraded to 3.8
- ci: separate build and publish jobs
- docs: update/fix readthedocs configuration
- ci: fix workflow file extension from yaml to yml
- client.list: fix infinite symlink loop for . and .. on FTP servers with UNIX-like filesystem for client.list(path, recursive=True)
- project file structure: refactor to use pyproject.toml
- minimal python version bumped to 3.11
- ci: update publish/deploy job (#171)
- tests: use pytest_asyncio strict mode and proper decorations (#155)
- setup/tests: set low bound for version of async-timeout (#159)
- server/LIST: prevent broken links are listed, but can't be used with stat
- server: make User.get_permissions async
- tests: remove exception representation check
- tests: replace more specific ConnectionRefusedError with OSError for compatibility with FreeBSD (#152)
Thanks to `AMDmi3 https://github.com/AMDmi3`_
- server: support PASV response with custom address (#150)
Thanks to `janneronkko https://github.com/janneronkko`_
- server: fix real directory resolve for windows (#147)
Thanks to `ported-pw https://github.com/ported-pw`_
- add client argument to set priority of custom list parser (parse_list_line_custom_first) (#145)
- do not ignore failed parsing of list response (#144)
Thanks to `spolloni https://github.com/spolloni`_
- add client connection timeout (#140)
- remove explicit coroutine passing to asyncio.wait (#134)
Thanks to decaz
- sync tests with new siosocks (#127)
- some docs fixes
- log level changes
- server: fix MLSX time format (#125)
- server: resolve server address from connection (#125)
Thanks to PonyPC
- server: fix broken python -m aioftp after 3.7 migration
- common/stream: add readexactly proxy method
- tests: fix test_unlink_on_dir on POSIX compatible systems (#118)
- docs: fix extra parentheses (#122)
- client: replace ClientSession with Client.context
- client: strip date before parsing (#113)
- client: logger no longer prints out plaintext password (#114)
- client: add custom passive commands to client (#116)
Thanks to ndhansen
- server: remove obsolete pass to pass_ command renaming
Thanks to Puddly
- client: fix leap year bug at parse_ls_date method
- all: add base exception class
Thanks to decaz
- server: use explicit mapping of available commands for security reasons
Thanks to Puddly for report
- client: add socks proxy support via siosocks (#94)
- client: add custom list parser (#95)
Thanks to purpleskyfall, VyachAp
- client: add windows list parser (#82)
- client/server: fix implicit ssl mode (#89)
- tests: move to pytest
- all: small fixes
- all: add implicit ftps mode support (#81)
- server: fix memory pathio is not shared between connections
- client: add argument to list to allow manually specifying raw command (#78)
Thanks to thirtyseven
- client: fix parsing ls modify time (#60)
- all: add python3.7 support (__aiter__ must be regular function since now) (#76, #77)
Thanks to saulcruz, NickG123, rsichny, Modelmat, webknjaz
- client: more flexible EPSV response parsing
Thanks to p4l1ly
- server: fix ipv6 peername unpack
- server: connection object is accessible from path-io layer since now
- main: add command line argument to set version of IP protocol
- setup: fix failed test session return zero exit code
- client: fix download-mkdir (issue #68)
- client/server: add initial ipv6 support (issue #63)
- client: change PASV to EPSV with fallback to PASV
Thanks to jacobtomlinson, mbkr1992
- server: fix server address in passive mode
- server: do not reraise dispatcher exceptions
- server: remove wait_closed, close is coroutine since now
- client: ignore LIST lines, which can't be parsed
Thanks to bachya
- client/server: add explicit encoding
Thanks to anan-lee
- client: add base LIST parsing
- client: add client.list fallback on MLSD «not implemented» status code to LIST
- client: add client.stat fallback on MLST «not implemented» status code to LIST
- common: add setlocale context manager for LIST parsing, formatting and thread-safe usage of locale
- server: add LIST support for non-english locales
- server: fix PASV sequencies before data transfer (latest PASV win)
- stream.read will read whole data by default (as asyncio.StreamReader.read)
Thanks to sametmax
- replace docopt with argparse
- add syst server command
- improve client list documentation
- fix documentation main page client example
- fix modifed time field for list command result
- add ClientSession context
- add REST command to server and client
Thanks to rsichny
- change development status to production/stable
- add configuration to restrict port range for passive server
- build LIST string with stat.filemode
Thanks to rsichny
- improved performance on non-throttled streams
- default path io layer for client and server is PathIO since now
- added benchmark result
- async for for pathio list function
- async context manager for streams and pathio files io
- python 3.5 only
- logging provided by "aioftp.client" and "aioftp.server"
- all path errors are now reraised as PathIOError
- server does not drop connection on path io errors since now, but return "451" code
- fixed setup.py long-description
- added handling of OSError in dispatcher
- fixed client/server close not opened file in finally
- handling PASS after login
- handling miltiply USER commands
- user manager for dealing with user accounts
- fixed client usage WindowsPath instead of PurePosixPath on windows for virtual paths
- client protected from "0.0.0.0" ip address in PASV
- client use pathio
- throttle deal with multiply connections
- fixed throttle bug when slow path io (#20)
- path io timeouts moved to pathio.py
- with_timeout decorator for methods
- StreamIO deals with timeouts
- all socket streams are ThrottleStreamIO since now
- client throttle
- new server dispatcher (can wait for connections)
- maximum connections per user/server
- new client stream api
- end of line character "rn" everywhere
- setup.py support
- tests via "python setup.py test"
- "sh" module removed from test requirements
- bugfix on windows (can't make passive connection to 0.0.0.0:port)
- default host is "127.0.0.1" since now
- silently ignoring ipv6 sockets in server binding list
- bugfix on windows (ipv6 address come first in list of binded sockets)
- bugfix server on windows (PurePosixPath for virtual path)
- close data connection after client disconnects
Thanks to rsichny
- pep8 "Method definitions inside a class are surrounded by a single blank line"
- MemoryPathIO.Stats should include st_mode
Thanks to rsichny
- aioftp now executes like script ("python -m aioftp")
- typos in server strings
- docstrings for path abstraction layer
- server functionality
- path abstraction layer
- first release (client only)