{"id":18584672,"url":"https://github.com/ivknv/yadisk","last_synced_at":"2025-05-16T08:04:33.568Z","repository":{"id":42352438,"uuid":"105886450","full_name":"ivknv/yadisk","owner":"ivknv","description":"Библиотека-клиент REST API Яндекс.Диска для Python / Yandex.Disk REST API client library for Python","archived":false,"fork":false,"pushed_at":"2025-04-28T20:08:56.000Z","size":1992,"stargazers_count":143,"open_issues_count":0,"forks_count":11,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-28T20:33:47.034Z","etag":null,"topics":["python","python3","rest-api","yandex","yandex-disk"],"latest_commit_sha":null,"homepage":"https://yadisk.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ivknv.png","metadata":{"files":{"readme":"README.en.rst","changelog":null,"contributing":"CONTRIBUTING.rst","funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-10-05T12:20:54.000Z","updated_at":"2025-04-09T06:20:32.000Z","dependencies_parsed_at":"2024-06-18T21:27:30.394Z","dependency_job_id":"93884088-9adf-459e-b9e1-afb00cda2d34","html_url":"https://github.com/ivknv/yadisk","commit_stats":{"total_commits":213,"total_committers":2,"mean_commits":106.5,"dds":0.431924882629108,"last_synced_commit":"e49263de8525cf1c74e9e778a3333829ed74546d"},"previous_names":[],"tags_count":42,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivknv%2Fyadisk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivknv%2Fyadisk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivknv%2Fyadisk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivknv%2Fyadisk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ivknv","download_url":"https://codeload.github.com/ivknv/yadisk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254493378,"owners_count":22080126,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","python3","rest-api","yandex","yandex-disk"],"created_at":"2024-11-07T00:28:23.202Z","updated_at":"2025-05-16T08:04:28.559Z","avatar_url":"https://github.com/ivknv.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"YaDisk\n======\n\n.. |RTD Badge| image:: https://img.shields.io/readthedocs/yadisk.svg\n   :alt: Read the Docs\n   :target: https://yadisk.readthedocs.io/en/latest/\n\n.. |CI Badge| image:: https://img.shields.io/github/actions/workflow/status/ivknv/yadisk/lint_and_test.yml\n   :alt: GitHub Actions Workflow Status\n\n.. |PyPI Badge| image:: https://img.shields.io/pypi/v/yadisk.svg\n   :alt: PyPI\n   :target: https://pypi.org/project/yadisk\n\n.. |Python Version Badge| image:: https://img.shields.io/pypi/pyversions/yadisk\n   :alt: PyPI - Python Version\n\n.. |Coverage Badge| image:: https://coveralls.io/repos/github/ivknv/yadisk/badge.svg?branch=master\n   :alt: Coverage\n   :target: https://coveralls.io/github/ivknv/yadisk\n\n|RTD Badge| |CI Badge| |PyPI Badge| |Python Version Badge| |Coverage Badge|\n\nYaDisk is a Yandex.Disk REST API client library.\n\n.. _Read the Docs (EN): https://yadisk.readthedocs.io\n.. _Read the Docs (RU): https://yadisk.readthedocs.io/ru/latest\n\nDocumentation is available at `Read the Docs (EN)`_ and `Read the Docs (RU)`_.\n\n.. contents:: Table of contents:\n\nInstallation\n************\n\n:code:`yadisk` supports multiple HTTP client libraries and has both synchronous and\nasynchronous API.\n\nThe following HTTP client libraries are currently supported:\n\n* :code:`requests` (used by default for synchronous API)\n* :code:`httpx` (both synchronous and asynchronous, used by default for asynchronous API)\n* :code:`aiohttp` (asynchronous only)\n* :code:`pycurl` (synchronous only)\n\nFor synchronous API (installs :code:`requests`):\n\n.. code:: bash\n\n   pip install yadisk[sync_defaults]\n\nFor asynchronous API (installs :code:`aiofiles` and :code:`httpx`):\n\n.. code:: bash\n\n   pip install yadisk[async_defaults]\n\nAlternatively, you can manually choose which optional libraries to install:\n\n.. code:: bash\n\n   # For use with pycurl\n   pip install yadisk[pycurl]\n\n   # For use with aiohttp, will also install aiofiles\n   pip install yadisk[async_files,aiofiles]\n\nExamples\n********\n\nSynchronous API\n---------------\n\n.. code:: python\n\n    import yadisk\n\n    client = yadisk.Client(token=\"\u003ctoken\u003e\")\n    # or\n    # client = yadisk.Client(\"\u003capplication-id\u003e\", \"\u003capplication-secret\u003e\", \"\u003ctoken\u003e\")\n\n    # You can either use the with statement or manually call client.close() later\n    with client:\n        # Check if the token is valid\n        print(client.check_token())\n\n        # Get disk information\n        print(client.get_disk_info())\n\n        # Print files and directories at \"/some/path\"\n        print(list(client.listdir(\"/some/path\")))\n\n        # Upload \"file_to_upload.txt\" to \"/destination.txt\"\n        client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # Same thing\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            client.upload(f, \"/destination.txt\")\n\n        # Download \"/some-file-to-download.txt\" to \"downloaded.txt\"\n        client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # Permanently remove \"/file-to-remove\"\n        client.remove(\"/file-to-remove\", permanently=True)\n\n        # Create a new directory at \"/test-dir\"\n        print(client.mkdir(\"/test-dir\"))\n\nAsynchronous API\n----------------\n\n.. code:: python\n\n    import yadisk\n    import aiofiles\n\n    client = yadisk.AsyncClient(token=\"\u003ctoken\u003e\")\n    # or\n    # client = yadisk.AsyncClient(\"\u003capplication-id\u003e\", \"\u003capplication-secret\u003e\", \"\u003ctoken\u003e\")\n\n    # You can either use the with statement or manually call client.close() later\n    async with client:\n        # Check if the token is valid\n        print(await client.check_token())\n\n        # Get disk information\n        print(await client.get_disk_info())\n\n        # Print files and directories at \"/some/path\"\n        print([i async for i in client.listdir(\"/some/path\")])\n\n        # Upload \"file_to_upload.txt\" to \"/destination.txt\"\n        await client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # Same thing\n        async with aiofiles.open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # Same thing but with regular files\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # Download \"/some-file-to-download.txt\" to \"downloaded.txt\"\n        await client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # Same thing\n        async with aiofiles.open(\"downloaded.txt\", \"wb\") as f:\n            await client.download(\"/some-file-to-download.txt\", f)\n\n        # Permanently remove \"/file-to-remove\"\n        await client.remove(\"/file-to-remove\", permanently=True)\n\n        # Create a new directory at \"/test-dir\"\n        print(await client.mkdir(\"/test-dir\"))\n\nContributing\n************\n\nIf you would like to contribute to this project, see\n`CONTRIBUTING.rst \u003chttps://github.com/ivknv/yadisk/blob/master/CONTRIBUTING.rst\u003e`_.\n\nChangelog\n*********\n\n.. _issue #2: https://github.com/ivknv/yadisk/issues/2\n.. _issue #4: https://github.com/ivknv/yadisk/issues/4\n.. _issue #7: https://github.com/ivknv/yadisk/issues/7\n.. _issue #23: https://github.com/ivknv/yadisk/issues/23\n.. _issue #26: https://github.com/ivknv/yadisk/issues/26\n.. _issue #28: https://github.com/ivknv/yadisk/issues/28\n.. _issue #29: https://github.com/ivknv/yadisk/issues/29\n.. _PR #31: https://github.com/ivknv/yadisk/pull/31\n.. _issue #43: https://github.com/ivknv/yadisk/issues/43\n.. _issue #45: https://github.com/ivknv/yadisk/issues/45\n.. _issue #49: https://github.com/ivknv/yadisk/issues/49\n.. _issue #53: https://github.com/ivknv/yadisk/issues/53\n.. _Introduction: https://yadisk.readthedocs.io/en/latest/intro.html\n.. _API Reference: https://yadisk.readthedocs.io/en/latest/api_reference/index.html\n.. _Available Session Implementations: https://yadisk.readthedocs.io/en/latest/api_reference/sessions.html\n.. _Session Interface: https://yadisk.readthedocs.io/en/latest/api_reference/session_interface.html\n.. _requests: https://pypi.org/project/requests\n.. _Migration Guide: https://yadisk.readthedocs.io/en/latest/migration_guide.html\n\n* **Release 3.2.0 (2025-02-03)**\n\n  * New features:\n\n    * Added new method: :code:`Client.makedirs()` / :code:`AsyncClient.makedirs()`\n      (see `issue #53`_)\n    * Added several missing fields for :code:`DiskInfoObject`:\n\n      * :code:`photounlim_size`\n      * :code:`will_be_overdrawn`\n      * :code:`free_photounlim_end_date`\n      * :code:`payment_flow`\n\n    * Added missing field :code:`sizes` for :code:`ResourceObject` and related\n      objects\n\n  * Bug fixes:\n\n    * :code:`Client.rename()` / :code:`AsyncClient.rename()` now raises\n      :code:`ValueError` on attempt to rename the root directory\n    * Automatic retry attempt numbers were logged off by one, now they are\n      logged correctly\n\n* **Release 3.1.0 (2024-07-12)**\n\n  * New features:\n\n    * Added new exception classes: :code:`GoneError` and\n      :code:`ResourceDownloadLimitExceededError`\n    * Added a new method: :code:`Client.get_all_public_resources()` and\n      :code:`AsyncClient.get_all_public_resources()`\n  * Bug fixes:\n\n    * Fixed setting :code:`headers` and session arguments to :code:`None` causing\n      errors\n    * Fixed incorrect handling of empty filename in :code:`Client.rename()` and\n      :code:`AsyncClient.rename()`\n    * Fixed several typos in async convenience method implementations\n      (:code:`listdir()` and related)\n    * Fixed :code:`PublicResourceListObject` having the wrong type for its\n      :code:`items` member\n    * Fixed API requests not working with :code:`PycURLSession` when\n      :code:`stream=True` is set\n    * No data will be written to the output file by :code:`Client.download()`,\n      :code:`Client.download_by_link()`, :code:`AsyncClient.download()` and\n      :code:`AsyncClient.download_by_link()` if the server returns a bad status\n      code\n\n* **Release 3.0.1 (2024-07-09)**\n\n  * Fixed broken :code:`pyproject.toml` that did not include full package\n    contents (see `issue #49`_)\n\n* **Release 3.0.0 (2024-07-09)**\n\n  * Breaking changes:\n\n    - See `Migration Guide`_ for full details\n    - All methods wait for asynchronous operations to complete by default\n      (see the new :code:`wait=\u003cbool\u003e` parameter)\n    - Iterating over the result of :code:`AsyncClient.listdir()` no longer\n      requires the additional await keyword.\n    - Number of returned items of :code:`Client.get_files()` /\n      :code:`AsyncClient.get_files()` is now controlled by the :code:`max_items`\n      parameter, rather than :code:`limit`\n    - Methods :code:`set_token()`, :code:`set_headers()` of :code:`Session` and\n      :code:`AsyncSession` were removed\n    - Some methods no longer accept the :code:`fields` parameter\n    - :code:`Client.get_last_uploaded()` / :code:`AsyncClient.get_last_uploaded()`\n      now return a list instead of a generator\n    - :code:`yadisk.api` is now a private module\n    - All private modules were renamed to have names that start with :code:`_`\n      (e.g, :code:`yadisk._api`)\n  * New features:\n\n    - Added methods to wait until an asynchronous operation completes\n      (see :code:`Client.wait_for_operation()` / :code:`AsyncClient.wait_for_operation()`)\n    - Methods that may start an asynchronous operation now accept additional\n      parameters: :code:`wait: bool = True`,\n      :code:`poll_interval: float = 1.0` and\n      :code:`poll_timeout: Optional[float] = None`\n    - :code:`Client.listdir()`, :code:`Client.get_files()` and their async\n      variants now accept a new parameter\n      :code:`max_items: Optional[int] = None`, which can be used to limit\n      the maximum number of returned items\n    - Most :code:`Client` and :code:`AsyncClient` methods now accept an optional\n      parameter :code:`retry_on: Optional[Tuple[Type[Exception], ...]] = None`,\n      which lets you specify a tuple of additional exceptions that can trigger\n      an automatic retry\n    - :code:`yadisk.types` module is now public\n    - Added basic logging of outgoing API requests and automatic retries\n    - The logger instance for the library can be accessed as\n      :code:`yadisk.settings.logger`\n    - Added :code:`YaDiskObject.field()` and the :code:`@` operator\n      (:code:`YaDiskObject.__matmul__()`) which verify that the given field is\n      not :code:`None`\n    - Added :code:`Client.get_upload_link_object()`,\n      :code:`AsyncClient.get_upload_link_object()` whose return values\n      additionally contain :code:`operation_id`\n    - :code:`utils.auto_retry()` now accepts more parameters\n    - Added a few missing fields for :code:`DiskInfoObject`\n    - :code:`EXIFObject` now contains GPS coordinates\n    - :code:`CaseInsensitiveDict` is now part of :code:`yadisk.utils`\n  * Improvements:\n\n    - Added full type hints for :code:`Client`, :code:`AsyncClient` through\n      :code:`.pyi` stub files\n    - Docstrings for :code:`Client` / :code:`AsyncClient` now include more\n      parameters\n    - Errors during JSON processing (e.g. :code:`InvalidResponseError`) also\n      trigger automatic retries\n    - Error message when the default session module is not available is now\n      less confusing (see `issue #43`_)\n    - Reduced :code:`Client.listdir()`'s default :code:`limit` to :code:`500`\n      from :code:`10000` to avoid timeouts on large directories (see `issue #45`_)\n    - Reduced :code:`Client.get_files()`'s default :code:`limit` to :code:`200`\n      from :code:`1000` to avoid timeouts\n    - :code:`Client.download()` and similar methods no longer set\n      :code:`Connection: close` header, since it's not necessary (unlike with\n      :code:`Client.upload()`)\n    - :code:`UnknownYaDiskError` now includes status code in the error message\n  * Bug fixes:\n\n    - Fixed :code:`httpx`- and :code:`aiohttp`-based session implementations\n      not converting their exceptions to :code:`RequestError` in their\n      :code:`Response.json()` / :code:`AsyncResponse.json()` implementations\n    - Fixed :code:`stream=True` not being set by default in\n      :code:`AsyncClient.download()`, :code:`AsyncClient.download_public()`\n  * Other changes:\n\n    - :code:`typing_extensions` is now required for Python \u003c 3.10\n\n\n* **Release 2.1.0 (2024-01-03)**\n\n  * Fixed a bug where POST request parameters were not encoded correctly\n  * Fixed a bug in :code:`PycURLSession.send_request()` that made it ignore passed headers\n  * :code:`RequestsSession.close()` now closes all underlying session\n    instances, instead of only the current thread-local one\n  * All methods of :code:`Client` and :code:`AsyncClient` now use existing session\n  * Removed :code:`session_factory` attribute and :code:`make_session()` method\n    of :code:`Client` and :code:`AsyncClient`\n  * Session class can now be specified as a string\n  * Added :code:`Client.get_device_code()`/:code:`AsyncClient.get_device_code()` methods\n  * Added :code:`Client.get_token_from_device_code()`/:code:`AsyncClient.get_token_from_device_code()` methods\n  * Added missing :code:`redirect_uri` parameter for :code:`Client.get_auth_url()`/:code:`AsyncClient.get_auth_url()`\n    and :code:`Client.get_code_url()`/:code:`AsyncClient.get_code_url()`\n  * Added support for PKCE parameters for :code:`Client.get_auth_url()`/:code:`AsyncClient.get_auth_url()`,\n    :code:`Client.get_code_url()`/:code:`AsyncClient.get_code_url()` and\n    :code:`Client.get_token()`/:code:`AsyncClient.get_token()`\n  * Added :code:`scope` attribute for :code:`TokenObject`\n  * Added new exception classes: :code:`InvalidClientError`, :code:`InvalidGrantError`,\n    :code:`AuthorizationPendingError`, :code:`BadVerificationCodeError` and\n    :code:`UnsupportedTokenTypeError`\n\n* **Release 2.0.0 (2023-12-12)**\n\n  * The library now provides both synchronous and asynchronous APIs (see\n    `Introduction`_ and `API Reference`_)\n  * Multiple HTTP libraries are supported by default (see\n    `Available Session Implementations`_ for the full list)\n  * It is now possible to add support for any HTTP library (see\n    `Session Interface`_)\n  * `requests`_ is now an optional dependency (although it's still used by\n    default for synchronous API)\n  * Note that now requests-specific arguments must be passed differently\n    (see `Available Session Implementations`_)\n  * Preferred HTTP client libraries must be explicitly installed now\n    (see `Introduction`_)\n  * :code:`Client.upload()` and :code:`Client.upload_by_link()` can now accept\n    a function that returns an iterator (or a generator) as a payload\n\n* **Release 1.3.4 (2023-10-15)**\n\n  * :code:`upload()` and :code:`download()` (and related) methods can now\n    upload/download non-seekable file-like objects (e.g. :code:`stdin` or :code:`stdout`\n    when open in binary mode), see `PR #31`_\n\n* **Release 1.3.3 (2023-04-22)**\n\n  * :code:`app:/` paths now work correctly (see `issue #26`_)\n\n* **Release 1.3.2 (2023-03-20)**\n\n  * Fixed `issue #29`_: TypeError: 'type' object is not subscriptable\n\n* **Release 1.3.1 (2023-02-28)**\n\n  * Fixed `issue #28`_: calling :code:`download_public()` with :code:`path` keyword argument raises :code:`TypeError`\n  * Fixed :code:`AttributeError` raised when calling :code:`ResourceLinkObject.public_listdir()`\n\n* **Release 1.3.0 (2023-01-30)**\n\n  * Added convenience methods to :code:`...Object` objects (e.g. see :code:`ResourceObject` in docs)\n  * Added type hints\n  * Improved error checking and response validation\n  * Added :code:`InvalidResponseError`, :code:`PayloadTooLargeError`, :code:`UploadTrafficLimitExceededError`\n  * Added a few missing fields to :code:`DiskInfoObject` and :code:`SystemFoldersObject`\n  * Added :code:`rename()`, :code:`upload_by_link()` and :code:`download_by_link()` methods\n  * Added :code:`default_args` field for :code:`YaDisk` object\n  * :code:`download()` and :code:`upload()` now return :code:`ResourceLinkObject`\n  * Returned :code:`LinkObject` instances have been replaced by more specific subclasses\n  * :code:`ConnectionError` now also triggers a retry\n\n* **Release 1.2.19 (2023-01-20)**\n\n  * Fixed incorrect behavior of the fix from 1.2.18 for paths :code:`disk:`\n    and :code:`trash:` (only these two).\n\n* **Release 1.2.18 (2023-01-20)**\n\n  * Fixed `issue #26`_: ':' character in filenames causes :code:`BadRequestError`.\n    This is due the behavior of Yandex.Disk's REST API itself but is avoided\n    on the library level with this fix.\n\n* **Release 1.2.17 (2022-12-11)**\n\n  * Fixed a minor bug which could cause a :code:`ReferenceError`\n    (which would not cause a crash, but still show an error message). The bug\n    involved using :code:`__del__()` method in :code:`SelfDestructingSession`\n    to automatically close the sessions it seems to affect primarily old Python\n    versions (such as 3.4).\n\n* **Release 1.2.16 (2022-08-17)**\n\n  * Fixed a bug in :code:`check_token()`: could throw :code:`ForbiddenError` if\n    the application lacks necessary permissions (`issue #23`_).\n\n* **Release 1.2.15 (2021-12-31)**\n\n  * Fixed an issue where :code:`http://` links were not recognized as operation links\n    (they were assumed to always be :code:`https://`, since all the other\n    requests are always HTTPS).\n    Occasionally, Yandex.Disk can for some reason return an :code:`http://` link\n    to an asynchronous operation instead of :code:`https://`.\n    Both links are now recognized correctly and an :code:`https://` version will\n    always be used by :code:`get_operation_status()`, regardless of which one\n    Yandex.Disk returned.\n\n* **Release 1.2.14 (2019-03-26)**\n\n  * Fixed a :code:`TypeError` in :code:`get_public_*` functions when passing :code:`path` parameter\n    (see `issue #7`_)\n  * Added :code:`unlimited_autoupload_enabled` attribute for :code:`DiskInfoObject`\n\n* **Release 1.2.13 (2019-02-23)**\n\n  * Added :code:`md5` parameter for :code:`remove()`\n  * Added :code:`UserPublicInfoObject`\n  * Added :code:`country` attribute for :code:`UserObject`\n  * Added :code:`photoslice_time` attribute for :code:`ResourceObject`, :code:`PublicResourceObject`\n    and :code:`TrashResourceObject`\n\n* **Release 1.2.13 (2019-02-23)**\n\n  * Added :code:`md5` parameter for :code:`remove()`\n  * Added :code:`UserPublicInfoObject`\n  * Added :code:`country` attribute for :code:`UserObject`\n  * Added :code:`photoslice_time` attribute for :code:`ResourceObject`, :code:`PublicResourceObject`\n    and :code:`TrashResourceObject`\n\n* **Release 1.2.12 (2018-10-11)**\n\n  * Fixed `fields` parameter not working properly in `listdir()` (`issue #4`_)\n\n* **Release 1.2.11 (2018-06-30)**\n\n  * Added the missing parameter :code:`sort` for :code:`get_meta()`\n  * Added :code:`file` and :code:`antivirus_status` attributes for :code:`ResourceObject`,\n    :code:`PublicResourceObject` and :code:`TrashResourceObject`\n  * Added :code:`headers` parameter\n  * Fixed a typo in :code:`download()` and :code:`download_public()` (`issue #2`_)\n  * Removed :code:`*args` parameter everywhere\n\n* **Release 1.2.10 (2018-06-14)**\n\n  * Fixed :code:`timeout=None` behavior. :code:`None` is supposed to mean 'no timeout' but\n    in the older versions it was synonymous with the default timeout.\n\n* **Release 1.2.9 (2018-04-28)**\n\n  * Changed the license to LGPLv3 (see :code:`COPYING` and :code:`COPYING.lesser`)\n  * Other package info updates\n\n* **Release 1.2.8 (2018-04-17)**\n\n  * Fixed a couple of typos: :code:`PublicResourceListObject.items` and\n    :code:`TrashResourceListObject.items` had wrong types\n  * Substitute field aliases in :code:`fields` parameter when performing\n    API requests (e.g. :code:`embedded` -\u003e :code:`_embedded`)\n\n* **Release 1.2.7 (2018-04-15)**\n\n  * Fixed a file rewinding bug when uploading/downloading files after a retry\n\n* **Release 1.2.6 (2018-04-13)**\n\n  * Now caching :code:`requests` sessions so that open connections\n    can be reused (which can significantly speed things up sometimes)\n  * Disable :code:`keep-alive` when uploading/downloading files by default\n\n* **Release 1.2.5 (2018-03-31)**\n\n  * Fixed an off-by-one bug in :code:`utils.auto_retry()`\n    (which could sometimes result in :code:`AttributeError`)\n  * Retry the whole request for :code:`upload()`, :code:`download()` and :code:`download_public()`\n  * Set :code:`stream=True` for :code:`download()` and :code:`download_public()`\n  * Other minor fixes\n\n* **Release 1.2.4 (2018-02-19)**\n\n  * Fixed :code:`TokenObject` having :code:`exprires_in` instead of :code:`expires_in` (fixed a typo)\n\n* **Release 1.2.3 (2018-01-20)**\n\n  * Fixed a :code:`TypeError` when :code:`WrongResourceTypeError` is raised\n\n* **Release 1.2.2 (2018-01-19)**\n\n  * :code:`refresh_token()` no longer requires a valid or empty token.\n\n* **Release 1.2.1 (2018-01-14)**\n\n  * Fixed auto retries not working. Whoops.\n\n* **Release 1.2.0 (2018-01-14)**\n\n  * Fixed passing :code:`n_retries=0` to :code:`upload()`,\n    :code:`download()` and :code:`download_public()`\n  * :code:`upload()`, :code:`download()` and :code:`download_public()`\n    no longer return anything (see the docs)\n  * Added :code:`utils` module (see the docs)\n  * Added :code:`RetriableYaDiskError`, :code:`WrongResourceTypeError`,\n    :code:`BadGatewayError` and :code:`GatewayTimeoutError`\n  * :code:`listdir()` now raises :code:`WrongResourceTypeError`\n    instead of :code:`NotADirectoryError`\n\n* **Release 1.1.1 (2017-12-29)**\n\n  * Fixed argument handling in :code:`upload()`, :code:`download()` and :code:`download_public()`.\n    Previously, passing :code:`n_retries` and :code:`retry_interval` would raise an exception (:code:`TypeError`).\n\n* **Release 1.1.0 (2017-12-27)**\n\n  * Better exceptions (see the docs)\n  * Added support for :code:`force_async` parameter\n  * Minor bug fixes\n\n* **Release 1.0.8 (2017-11-29)**\n\n  * Fixed yet another :code:`listdir()` bug\n\n* **Release 1.0.7 (2017-11-04)**\n\n  * Added :code:`install_requires` argument to :code:`setup.py`\n\n* **Release 1.0.6 (2017-11-04)**\n\n  * Return :code:`OperationLinkObject` in some functions\n\n* **Release 1.0.5 (2017-10-29)**\n\n  * Fixed :code:`setup.py` to exclude tests\n\n* **Release 1.0.4 (2017-10-23)**\n\n  * Fixed bugs in :code:`upload`, :code:`download` and :code:`listdir` functions\n  * Set default :code:`listdir` :code:`limit` to :code:`10000`\n\n* **Release 1.0.3 (2017-10-22)**\n\n  * Added settings\n\n* **Release 1.0.2 (2017-10-19)**\n\n  * Fixed :code:`get_code_url` function (added missing parameters)\n\n* **Release 1.0.1 (2017-10-18)**\n\n  * Fixed a major bug in :code:`GetTokenRequest` (added missing parameter)\n\n* **Release 1.0.0 (2017-10-18)**\n\n  * Initial release\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivknv%2Fyadisk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fivknv%2Fyadisk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivknv%2Fyadisk/lists"}