{"id":39845432,"url":"https://github.com/ask/mode","last_synced_at":"2026-01-18T13:35:37.419Z","repository":{"id":26183721,"uuid":"105050087","full_name":"ask/mode","owner":"ask","description":"Python AsyncIO Services","archived":false,"fork":false,"pushed_at":"2024-03-29T22:30:51.000Z","size":1075,"stargazers_count":239,"open_issues_count":15,"forks_count":60,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-09-08T13:52:46.793Z","etag":null,"topics":["actors","asyncio","python3","services"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ask.png","metadata":{"files":{"readme":"README.rst","changelog":"Changelog","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.rst","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-09-27T17:47:32.000Z","updated_at":"2025-06-20T10:53:20.000Z","dependencies_parsed_at":"2024-06-18T15:28:45.258Z","dependency_job_id":"be92780c-23a1-45be-a927-bee66482e9f2","html_url":"https://github.com/ask/mode","commit_stats":{"total_commits":738,"total_committers":12,"mean_commits":61.5,"dds":"0.46883468834688347","last_synced_commit":"a104009f0c96790b9f6140179b4968da07a38c81"},"previous_names":[],"tags_count":89,"template":false,"template_full_name":null,"purl":"pkg:github/ask/mode","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ask%2Fmode","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ask%2Fmode/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ask%2Fmode/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ask%2Fmode/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ask","download_url":"https://codeload.github.com/ask/mode/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ask%2Fmode/sbom","scorecard":{"id":212266,"data":{"date":"2025-08-11","repo":{"name":"github.com/ask/mode","commit":"a104009f0c96790b9f6140179b4968da07a38c81"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-17T00:57:42.390Z","repository_id":26183721,"created_at":"2025-08-17T00:57:42.391Z","updated_at":"2025-08-17T00:57:42.391Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28536761,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T13:04:05.990Z","status":"ssl_error","status_checked_at":"2026-01-18T13:01:44.092Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["actors","asyncio","python3","services"],"created_at":"2026-01-18T13:35:37.310Z","updated_at":"2026-01-18T13:35:37.402Z","avatar_url":"https://github.com/ask.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"=====================================================================\n Mode: AsyncIO Services\n=====================================================================\n\n|build-status| |coverage| |license| |wheel| |pyversion| |pyimp|\n\n:Version: 4.3.2\n:Web: http://mode.readthedocs.org/\n:Download: http://pypi.org/project/mode\n:Source: http://github.com/ask/mode\n:Keywords: async, service, framework, actors, bootsteps, graph\n\nWhat is Mode?\n=============\n\nMode is a very minimal Python library built-on top of AsyncIO that makes\nit much easier to use.\n\nIn Mode your program is built out of services that you can start, stop,\nrestart and supervise.\n\nA service is just a class::\n\n    class PageViewCache(Service):\n        redis: Redis = None\n\n        async def on_start(self) -\u003e None:\n            self.redis = connect_to_redis()\n\n        async def update(self, url: str, n: int = 1) -\u003e int:\n            return await self.redis.incr(url, n)\n\n        async def get(self, url: str) -\u003e int:\n            return await self.redis.get(url)\n\n\nServices are started, stopped and restarted and have\ncallbacks for those actions.\n\nIt can start another service::\n\n    class App(Service):\n        page_view_cache: PageViewCache = None\n\n        async def on_start(self) -\u003e None:\n            await self.add_runtime_dependency(self.page_view_cache)\n\n        @cached_property\n        def page_view_cache(self) -\u003e PageViewCache:\n            return PageViewCache()\n\nIt can include background tasks::\n\n    class PageViewCache(Service):\n\n        @Service.timer(1.0)\n        async def _update_cache(self) -\u003e None:\n            self.data = await cache.get('key')\n\nServices that depends on other services actually form a graph\nthat you can visualize.\n\nWorker\n    Mode optionally provides a worker that you can use to start the program,\n    with support for logging, blocking detection, remote debugging and more.\n\n    To start a worker add this to your program::\n\n        if __name__ == '__main__':\n            from mode import Worker\n            Worker(Service(), loglevel=\"info\").execute_from_commandline()\n\n    Then execute your program to start the worker:\n\n    .. sourcecode:: console\n\n        $ python examples/tutorial.py\n        [2018-03-27 15:47:12,159: INFO]: [^Worker]: Starting...\n        [2018-03-27 15:47:12,160: INFO]: [^-AppService]: Starting...\n        [2018-03-27 15:47:12,160: INFO]: [^--Websockets]: Starting...\n        STARTING WEBSOCKET SERVER\n        [2018-03-27 15:47:12,161: INFO]: [^--UserCache]: Starting...\n        [2018-03-27 15:47:12,161: INFO]: [^--Webserver]: Starting...\n        [2018-03-27 15:47:12,164: INFO]: [^--Webserver]: Serving on port 8000\n        REMOVING EXPIRED USERS\n        REMOVING EXPIRED USERS\n\n    To stop it hit ``Control-c``:\n\n    .. sourcecode:: console\n\n        [2018-03-27 15:55:08,084: INFO]: [^Worker]: Stopping on signal received...\n        [2018-03-27 15:55:08,084: INFO]: [^Worker]: Stopping...\n        [2018-03-27 15:55:08,084: INFO]: [^-AppService]: Stopping...\n        [2018-03-27 15:55:08,084: INFO]: [^--UserCache]: Stopping...\n        REMOVING EXPIRED USERS\n        [2018-03-27 15:55:08,085: INFO]: [^Worker]: Gathering service tasks...\n        [2018-03-27 15:55:08,085: INFO]: [^--UserCache]: -Stopped!\n        [2018-03-27 15:55:08,085: INFO]: [^--Webserver]: Stopping...\n        [2018-03-27 15:55:08,085: INFO]: [^Worker]: Gathering all futures...\n        [2018-03-27 15:55:08,085: INFO]: [^--Webserver]: Closing server\n        [2018-03-27 15:55:08,086: INFO]: [^--Webserver]: Waiting for server to close handle\n        [2018-03-27 15:55:08,086: INFO]: [^--Webserver]: Shutting down web application\n        [2018-03-27 15:55:08,086: INFO]: [^--Webserver]: Waiting for handler to shut down\n        [2018-03-27 15:55:08,086: INFO]: [^--Webserver]: Cleanup\n        [2018-03-27 15:55:08,086: INFO]: [^--Webserver]: -Stopped!\n        [2018-03-27 15:55:08,086: INFO]: [^--Websockets]: Stopping...\n        [2018-03-27 15:55:08,086: INFO]: [^--Websockets]: -Stopped!\n        [2018-03-27 15:55:08,087: INFO]: [^-AppService]: -Stopped!\n        [2018-03-27 15:55:08,087: INFO]: [^Worker]: -Stopped!\n\nBeacons\n    The ``beacon`` object that we pass to services keeps track of the services\n    in a graph.\n\n    They are not stricly required, but can be used to visualize a running\n    system, for example we can render it as a pretty graph.\n\n    This requires you to have the ``pydot`` library and GraphViz\n    installed:\n\n    .. sourcecode:: console\n\n        $ pip install pydot\n\n    Let's change the app service class to dump the graph to an image\n    at startup::\n\n        class AppService(Service):\n\n            async def on_start(self) -\u003e None:\n                print('APP STARTING')\n                import pydot\n                import io\n                o = io.StringIO()\n                beacon = self.app.beacon.root or self.app.beacon\n                beacon.as_graph().to_dot(o)\n                graph, = pydot.graph_from_dot_data(o.getvalue())\n                print('WRITING GRAPH TO image.png')\n                with open('image.png', 'wb') as fh:\n                    fh.write(graph.create_png())\n\n\nCreating a Service\n==================\n\nTo define a service, simply subclass and fill in the methods\nto do stuff as the service is started/stopped etc.::\n\n    class MyService(Service):\n\n        async def on_start(self) -\u003e None:\n            print('Im starting now')\n\n        async def on_started(self) -\u003e None:\n            print('Im ready')\n\n        async def on_stop(self) -\u003e None:\n            print('Im stopping now')\n\nTo start the service, call ``await service.start()``::\n\n    await service.start()\n\nOr you can use ``mode.Worker`` (or a subclass of this) to start your\nservices-based asyncio program from the console::\n\n    if __name__ == '__main__':\n        import mode\n        worker = mode.Worker(\n            MyService(),\n            loglevel='INFO',\n            logfile=None,\n            daemon=False,\n        )\n        worker.execute_from_commandline()\n\nIt's a Graph!\n=============\n\nServices can start other services, coroutines, and background tasks.\n\n1) Starting other services using ``add_depenency``::\n\n    class MyService(Service):\n\n        def __post_init__(self) -\u003e None:\n           self.add_dependency(OtherService(loop=self.loop))\n\n2) Start a list of services using ``on_init_dependencies``::\n\n    class MyService(Service):\n\n        def on_init_dependencies(self) -\u003e None:\n            return [\n                ServiceA(loop=self.loop),\n                ServiceB(loop=self.loop),\n                ServiceC(loop=self.loop),\n            ]\n\n3) Start a future/coroutine (that will be waited on to complete on stop)::\n\n    class MyService(Service):\n\n        async def on_start(self) -\u003e None:\n            self.add_future(self.my_coro())\n\n        async def my_coro(self) -\u003e None:\n            print('Executing coroutine')\n\n4) Start a background task::\n\n    class MyService(Service):\n\n        @Service.task\n        async def _my_coro(self) -\u003e None:\n            print('Executing coroutine')\n\n\n5) Start a background task that keeps running::\n\n    class MyService(Service):\n\n        @Service.task\n        async def _my_coro(self) -\u003e None:\n            while not self.should_stop:\n                # NOTE: self.sleep will wait for one second, or\n                #       until service stopped/crashed.\n                await self.sleep(1.0)\n                print('Background thread waking up')\n\n.. _installation:\n\nInstallation\n============\n\nYou can install Mode either via the Python Package Index (PyPI)\nor from source.\n\nTo install using `pip`::\n\n    $ pip install -U mode\n\n.. _installing-from-source:\n\nDownloading and installing from source\n--------------------------------------\n\nDownload the latest version of Mode from\nhttp://pypi.org/project/mode\n\nYou can install it by doing the following::\n\n    $ tar xvfz mode-0.0.0.tar.gz\n    $ cd mode-0.0.0\n    $ python setup.py build\n    # python setup.py install\n\nThe last command must be executed as a privileged user if\nyou are not currently using a virtualenv.\n\n.. _installing-from-git:\n\nUsing the development version\n-----------------------------\n\nWith pip\n~~~~~~~~\n\nYou can install the latest snapshot of Mode using the following\npip command::\n\n    $ pip install https://github.com/ask/mode/zipball/master#egg=mode\n\nFAQ\n===\n\nCan I use Mode with Django/Flask/etc.?\n--------------------------------------\n\nYes! Use gevent/eventlet as a bridge to integrate with asyncio.\n\nUsing ``gevent``\n~~~~~~~~~~~~~~~~\n\nThis works with any blocking Python library that can work with gevent.\n\nUsing gevent requires you to install the ``aiogevent`` module,\nand you can install this as a bundle with Mode:\n\n.. sourcecode:: console\n\n    $ pip install -U mode[gevent]\n\nThen to actually use gevent as the event loop you have to\nexecute the following in your entrypoint module (usually where you\nstart the worker), before any other third party libraries are imported::\n\n    #!/usr/bin/env python3\n    import mode.loop\n    mode.loop.use('gevent')\n    # execute program\n\nREMEMBER: This must be located at the very top of the module,\nin such a way that it executes before you import other libraries.\n\n\nUsing ``eventlet``\n~~~~~~~~~~~~~~~~~~\n\nThis works with any blocking Python library that can work with eventlet.\n\nUsing eventlet requires you to install the ``aioeventlet`` module,\nand you can install this as a bundle with Mode:\n\n.. sourcecode:: console\n\n    $ pip install -U mode[eventlet]\n\nThen to actually use eventlet as the event loop you have to\nexecute the following in your entrypoint module (usually where you\nstart the worker), before any other third party libraries are imported::\n\n    #!/usr/bin/env python3\n    import mode.loop\n    mode.loop.use('eventlet')\n    # execute program\n\nREMEMBER: It's very important this is at the very top of the module,\nand that it executes before you import libraries.\n\nCan I use Mode with Tornado?\n----------------------------\n\nYes! Use the ``tornado.platform.asyncio`` bridge:\nhttp://www.tornadoweb.org/en/stable/asyncio.html\n\nCan I use Mode with Twisted?\n-----------------------------\n\nYes! Use the asyncio reactor implementation:\nhttps://twistedmatrix.com/documents/17.1.0/api/twisted.internet.asyncioreactor.html\n\nWill you support Python 3.5 or earlier?\n---------------------------------------\n\nThere are no immediate plans to support Python 3.5, but you are welcome to\ncontribute to the project.\n\nHere are some of the steps required to accomplish this:\n\n- Source code transformation to rewrite variable annotations to comments\n\n  for example, the code::\n\n        class Point:\n            x: int = 0\n            y: int = 0\n\n   must be rewritten into::\n\n        class Point:\n            x = 0  # type: int\n            y = 0  # type: int\n\n- Source code transformation to rewrite async functions\n\n    for example, the code::\n\n        async def foo():\n            await asyncio.sleep(1.0)\n\n    must be rewritten into::\n\n        @coroutine\n        def foo():\n            yield from asyncio.sleep(1.0)\n\nWill you support Python 2?\n--------------------------\n\nThere are no plans to support Python 2, but you are welcome to contribute to\nthe project (details in question above is relevant also for Python 2).\n\n\nAt Shutdown I get lots of warnings, what is this about?\n-------------------------------------------------------\n\nIf you get warnings such as this at shutdown:\n\n.. sourcecode:: text\n\n    Task was destroyed but it is pending!\n    task: \u003cTask pending coro=\u003cService._execute_task() running at /opt/devel/mode/mode/services.py:643\u003e wait_for=\u003cFuture pending cb=[\u003cTaskWakeupMethWrapper object at 0x1100a7468\u003e()]\u003e\u003e\n    Task was destroyed but it is pending!\n    task: \u003cTask pending coro=\u003cService._execute_task() running at /opt/devel/mode/mode/services.py:643\u003e wait_for=\u003cFuture pending cb=[\u003cTaskWakeupMethWrapper object at 0x1100a72e8\u003e()]\u003e\u003e\n    Task was destroyed but it is pending!\n    task: \u003cTask pending coro=\u003cService._execute_task() running at /opt/devel/mode/mode/services.py:643\u003e wait_for=\u003cFuture pending cb=[\u003cTaskWakeupMethWrapper object at 0x1100a7678\u003e()]\u003e\u003e\n    Task was destroyed but it is pending!\n    task: \u003cTask pending coro=\u003cEvent.wait() running at /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/locks.py:269\u003e cb=[_release_waiter(\u003cFuture pendi...1100a7468\u003e()]\u003e)() at /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/tasks.py:316]\u003e\n    Task was destroyed but it is pending!\n        task: \u003cTask pending coro=\u003cEvent.wait() running at /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/locks.py:269\u003e cb=[_release_waiter(\u003cFuture pendi...1100a7678\u003e()]\u003e)() at /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/tasks.py:316]\u003e\n\nIt usually means you forgot to stop a service before the process exited.\n\nCode of Conduct\n===============\n\nEveryone interacting in the project's codebases, issue trackers, chat rooms,\nand mailing lists is expected to follow the Mode Code of Conduct.\n\nAs contributors and maintainers of these projects, and in the interest of fostering\nan open and welcoming community, we pledge to respect all people who contribute\nthrough reporting issues, posting feature requests, updating documentation,\nsubmitting pull requests or patches, and other activities.\n\nWe are committed to making participation in these projects a harassment-free\nexperience for everyone, regardless of level of experience, gender,\ngender identity and expression, sexual orientation, disability,\npersonal appearance, body size, race, ethnicity, age,\nreligion, or nationality.\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery\n* Personal attacks\n* Trolling or insulting/derogatory comments\n* Public or private harassment\n* Publishing other's private information, such as physical\n  or electronic addresses, without explicit permission\n* Other unethical or unprofessional conduct.\n\nProject maintainers have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct. By adopting this Code of Conduct,\nproject maintainers commit themselves to fairly and consistently applying\nthese principles to every aspect of managing this project. Project maintainers\nwho do not follow or enforce the Code of Conduct may be permanently removed from\nthe project team.\n\nThis code of conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community.\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by opening an issue or contacting one or more of the project maintainers.\n\nThis Code of Conduct is adapted from the Contributor Covenant,\nversion 1.2.0 available at http://contributor-covenant.org/version/1/2/0/.\n\n.. |build-status| image:: https://secure.travis-ci.org/ask/mode.png?branch=master\n    :alt: Build status\n    :target: https://travis-ci.org/ask/mode\n\n.. |coverage| image:: https://codecov.io/github/ask/mode/coverage.svg?branch=master\n    :target: https://codecov.io/github/ask/mode?branch=master\n\n.. |license| image:: https://img.shields.io/pypi/l/mode.svg\n    :alt: BSD License\n    :target: https://opensource.org/licenses/BSD-3-Clause\n\n.. |wheel| image:: https://img.shields.io/pypi/wheel/mode.svg\n    :alt: Mode can be installed via wheel\n    :target: http://pypi.org/project/mode/\n\n.. |pyversion| image:: https://img.shields.io/pypi/pyversions/mode.svg\n    :alt: Supported Python versions.\n    :target: http://pypi.org/project/mode/\n\n.. |pyimp| image:: https://img.shields.io/pypi/implementation/mode.svg\n    :alt: Supported Python implementations.\n    :target: http://pypi.org/project/mode/\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fask%2Fmode","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fask%2Fmode","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fask%2Fmode/lists"}