{"id":13557477,"url":"https://github.com/rafaelcaricio/sticker","last_synced_at":"2026-01-14T08:28:04.300Z","repository":{"id":31085339,"uuid":"126081831","full_name":"rafaelcaricio/sticker","owner":"rafaelcaricio","description":"Sticker is a powerful yet boilerplate-free alternative to writing your web API.","archived":true,"fork":false,"pushed_at":"2022-06-03T22:48:39.000Z","size":251,"stargazers_count":26,"open_issues_count":8,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-19T17:51:42.366Z","etag":null,"topics":["api-rest","bottle","flask","openapi","openapi3","python","sanic","tornado"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rafaelcaricio.png","metadata":{"files":{"readme":"README.rst","changelog":null,"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}},"created_at":"2018-03-20T21:00:32.000Z","updated_at":"2023-01-27T23:43:25.000Z","dependencies_parsed_at":"2022-09-16T20:00:30.626Z","dependency_job_id":null,"html_url":"https://github.com/rafaelcaricio/sticker","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/rafaelcaricio/sticker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelcaricio%2Fsticker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelcaricio%2Fsticker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelcaricio%2Fsticker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelcaricio%2Fsticker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rafaelcaricio","download_url":"https://codeload.github.com/rafaelcaricio/sticker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelcaricio%2Fsticker/sbom","scorecard":{"id":758152,"data":{"date":"2025-08-11","repo":{"name":"github.com/rafaelcaricio/sticker","commit":"823e34a829a5d662710569a8423a4905beb90ac0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/18 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":"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":"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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 12 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"62 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-120 / GHSA-45c4-8wx5-qw6w","Warn: Project is vulnerable to: PYSEC-2024-24 / GHSA-5h86-8mv2-jq9f","Warn: Project is vulnerable to: GHSA-5m98-qgg9-wh84","Warn: Project is vulnerable to: GHSA-7gpw-8wmc-pm8g","Warn: Project is vulnerable to: GHSA-8495-4g3g-x7pr","Warn: Project is vulnerable to: PYSEC-2024-26 / GHSA-8qpw-xqxj-h4r2","Warn: Project is vulnerable to: GHSA-9548-qrrj-x5pj","Warn: Project is vulnerable to: PYSEC-2023-246 / GHSA-gfw2-4jvh-wgfg","Warn: Project is vulnerable to: GHSA-pjjw-qhg8-p2p9","Warn: Project is vulnerable to: PYSEC-2023-250 / GHSA-q3qx-c6g2-7pw2","Warn: Project is vulnerable to: PYSEC-2023-251 / GHSA-qvrw-v9rv-5rjx","Warn: Project is vulnerable to: PYSEC-2023-247 / GHSA-xx9p-xxvh-7g8j","Warn: Project is vulnerable to: PYSEC-2021-129 / GHSA-qhx9-7hx7-cp4r","Warn: Project is vulnerable to: PYSEC-2022-227 / GHSA-xhp9-4947-rq78","Warn: Project is vulnerable to: PYSEC-2022-42986 / GHSA-43fp-rhv2-5gv8","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2023-62 / GHSA-m2qf-hxjv-5gpq","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-29gw-9793-fvw7","Warn: Project is vulnerable to: PYSEC-2022-12 / GHSA-pq7m-3gw7-gq5x","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: PYSEC-2022-42969","Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2020-176 / GHSA-3pqx-4fqf-j49f","Warn: Project is vulnerable to: PYSEC-2020-96 / GHSA-6757-jp84-gxfx","Warn: Project is vulnerable to: PYSEC-2021-142 / GHSA-8q59-q68h-6hv4","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: GHSA-7p79-6x2v-5h88","Warn: Project is vulnerable to: GHSA-8cw9-5hmv-77w6","Warn: Project is vulnerable to: GHSA-753j-mpmx-qq6g","Warn: Project is vulnerable to: GHSA-7cx3-6m66-7c5m","Warn: Project is vulnerable to: GHSA-8w49-h785-mj3c","Warn: Project is vulnerable to: PYSEC-2023-75 / GHSA-hj3f-6gcp-jg8j","Warn: Project is vulnerable to: GHSA-qppv-j76h-2rpx","Warn: Project is vulnerable to: GHSA-w235-7p84-xx57","Warn: Project is vulnerable to: GHSA-g7vv-2v7x-gj9p","Warn: Project is vulnerable to: PYSEC-2022-25 / GHSA-fh56-85cw-5pq6","Warn: Project is vulnerable to: GHSA-fm67-cv37-96ff","Warn: Project is vulnerable to: GHSA-wpqr-jcpx-745r","Warn: Project is vulnerable to: OSV-2021-955","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2021-108 / GHSA-q2q7-5pp4-w6pg","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: PYSEC-2024-211 / GHSA-3f84-rpwh-47g6","Warn: Project is vulnerable to: PYSEC-2022-169 / GHSA-4f7p-27jc-3c36","Warn: Project is vulnerable to: PYSEC-2024-210 / GHSA-9298-4cf8-g4wj","Warn: Project is vulnerable to: PYSEC-2024-188 / GHSA-mg3v-6m49-jhp3","Warn: Project is vulnerable to: PYSEC-2021-95 / GHSA-8ch4-58qp-g3mp","Warn: Project is vulnerable to: GHSA-2g68-c3qc-8985","Warn: Project is vulnerable to: GHSA-f9vj-2wh5-fj8j","Warn: Project is vulnerable to: PYSEC-2023-221 / GHSA-hrfv-mqp8-q5rw","Warn: Project is vulnerable to: PYSEC-2023-57 / GHSA-px8h-6qxv-m22q","Warn: Project is vulnerable to: GHSA-q34m-jh98-gwm2","Warn: Project is vulnerable to: PYSEC-2023-58 / GHSA-xg9f-g7g7-2323","Warn: Project is vulnerable to: PYSEC-2022-203"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T22:23:43.572Z","repository_id":31085339,"created_at":"2025-08-22T22:23:43.573Z","updated_at":"2025-08-22T22:23:43.573Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28414003,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:16:59.381Z","status":"ssl_error","status_checked_at":"2026-01-14T08:13:45.490Z","response_time":107,"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":["api-rest","bottle","flask","openapi","openapi3","python","sanic","tornado"],"created_at":"2024-08-01T12:04:22.598Z","updated_at":"2026-01-14T08:28:04.280Z","avatar_url":"https://github.com/rafaelcaricio.png","language":"Python","funding_links":[],"categories":["Python","flask"],"sub_categories":[],"readme":".. image:: https://github.com/rafaelcaricio/sticker/raw/master/docs/images/sticker_logo.png\n    :align: center\n    :alt: Sticker\n    :target: https://github.com/rafaelcaricio/sticker\n\n|\n\n.. image:: https://img.shields.io/pypi/v/sticker.svg\n    :target: https://pypi.python.org/pypi/sticker\n\n.. image:: https://img.shields.io/pypi/l/sticker.svg\n    :target: https://pypi.python.org/pypi/sticker\n\n.. image:: https://img.shields.io/pypi/pyversions/sticker.svg\n    :target: https://pypi.python.org/pypi/sticker\n\n.. image:: https://img.shields.io/github/contributors/rafaelcaricio/sticker.svg\n    :target: https://github.com/rafaelcaricio/sticker/graphs/contributors\n\nWrite boilerplate-free Python functions and use them as your API handlers.\nSticker allows you to choose Flask, bottle.py, Sanic, or Tornado as your\napplication runtime.\n\n**Highlights**:\n\n* Community created and maintained\n* Support for `OpenAPI 3.0 \u003chttps://swagger.io/specification/\u003e`_\n* Multi-framework support: `Flask \u003chttp://flask.pocoo.org/\u003e`_, `bottle.py \u003chttps://github.com/bottlepy/bottle\u003e`_, `Sanic \u003chttps://github.com/channelcat/sanic\u003e`_, and `Tornado \u003chttp://www.tornadoweb.org/en/stable/\u003e`_\n* Support for **pure Python handlers** (no boilerplate code)\n\nIt's Easy to Write\n==================\n\nYou need a little bit of Python.\n\n.. code-block:: python\n\n    def say_hello(params):\n        return {\"contents\": \"Hello World!\"}\n\nPlus bits of your API description.\n\n.. code-block:: YAML\n\n    openapi: \"3.0.0\"\n    paths:\n      /:\n        get:\n          operationId: hello.say_hello\n\nNow the fun part, you choose which web framework you want to use.\n\nRun with Flask:\n\n.. code-block:: python\n\n    from sticker import FlaskAPI\n    api = FlaskAPI('hello.yml')\n    api.get_app(__name__).run()\n\nRun with Bottle.py:\n\n.. code-block:: python\n\n    from sticker import BottleAPI\n    api = BottleAPI('hello.yml')\n    api.run()\n\nRun with Sanic:\n\n.. code-block:: python\n\n    from sticker import SanicAPI\n    api = SanicAPI('hello.yml')\n    api.get_app(__name__).run()\n\nRun with Tornado:\n\n.. code-block:: python\n\n    from sticker import TornadoAPI\n    import tornado.ioloop\n    api = TornadoAPI('hello.yml')\n    api.get_app().listen(8888)\n    tornado.ioloop.IOLoop.current().start()\n\nThe framework setup, validation, types conversion, and mocking is handled at runtime by Sticker.\n\n✨\n\nInstallation\n============\n\nSticker is published at PyPI, so you can use ``pip`` to install:\n\n.. code-block:: bash\n\n    $ pip install sticker\n\nRequirements\n============\n\nSticker was developed for **Python \u003e=3.6** and **OpenAPI 3.0**. Support for Python 2.7 is not present nor planned for this project.\n\nDocumentation\n=============\n\nSticker is a flexible metaframework for Web API development and execution. The OpenAPI 3.0 standard is used as\ndescription format for Sticker powered APIs. You provide the API specification and choose one of the\nSticker's runtimes to have a webserver up and running.\n\nIn this document we will describe a few different ways to write code that works well with Sticker.\n\nPure Python Handlers\n--------------------\n\nSticker supports the use of pure Python functions as handlers. Your code will be free of any framework\nspecific boilerplate code, including Sticker's itself. This allows you to swap between different frameworks\nas you wish. Sticker will take care of putting together your code, your API, and the framework you choose.\n\n.. code-block:: python\n\n    def myhandler(params):\n        return {\n            \"content\": f\"Hello {params.get(\"name\", \"World\")}!\",\n            \"status\": 200\n        }\n\nWriting tests for pure Python handles is easy and also\nfree of boilerplate code.\n\n.. code-block:: python\n\n    def test_myhandler():\n        params = {\n            \"name\": \"John Doe\"\n        }\n        response = myhandler(params)\n        assert response[\"content\"] == \"Hello John Doe!\"\n\nAs you could see in the example above, no imports from Sticker were necessary to define the API handler function.\nThis is only possible because Sticker expects your handlers to follow a code convention.\n\nAnatomy Of An API Handler Function\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWrite this part.\n\nResponses\n^^^^^^^^^\n\nAPI handlers are expected to return a Python dictionary (``dict``) object. The returned dictionary defines how a response\nwill look like. All keys in the dictionary are optional. The expected keys are described in the table bellow.\n\n=========== ======================== ===========\nKey         Type                     Description\n=========== ======================== ===========\ncontent     str                      Body of HTTP request. No treatment/parsing of this value is done. The value is passed directly to the chosen framework.\njson        Union[dict, List[dict]]  JSON value to be used in the body of the request. This is a shortcut to having the header \"Content-Type: application/json\" and serializing this value using the most common way done by the chosen framework.\nfile        Union[IO[AnyStr], str]   Data to be returned as byte stream. This is a shortcut for having the header \"Content-Type: application/octet-stream\". Uses the most common way to stream files with the chosen framework.\nredirect    str                      The path or full URL to be redirected. This is a shortcut for having the header \"Location:\" with HTTP status `301`.\nstatus      int                      The HTTP status code to be used in the response. This value overrides any shortcut default status code.\nheaders     Dict[str, str]           The HTTP headers to be used in the response. This value is merged with the shortcut values with priority.\n=========== ======================== ===========\n\n\nWe have exposed here some examples of using different configurations of the ``dict`` we've defined above to describe the\nHTTP response of API handlers. The actual HTTP response value generated will vary depending on the framework chosen as\nruntime. The examples are a minimal illustration of what to expect to be the HTTP response.\n\nThe \"content\" key can be used when it's desired to return a \"Hello world!\" string with status ``200``.\n\n.. code-block:: python\n\n    def say_hello(params):\n        return {\"content\": \"Hello world!\"}\n\nResults in the HTTP response similar to:\n\n.. code-block::\n\n    HTTP/1.1 200 OK\n    Content-Type: text/plain\n\n    Hello world!\n\nThe \"json\" key can be used when desired to return an JSON response with status ``201``.\n\n.. code-block:: python\n\n    def create(params):\n        data = {\n            \"id\": \"uhHuehuE\",\n            \"value\": \"something\"\n        }\n        return {\"json\": data, \"status\": 201}\n\nThe HTTP response generated will be similar to:\n\n.. code-block::\n\n    HTTP/1.1 201 Created\n    Content-Type: application/json\n\n    {\"id\":\"uhHuehuE\",\"value\":\"something\"}\n\nThe \"file\" key is used to return file contents.\n\n.. code-block:: python\n\n    def homepage(params):\n        return {\n            \"file\": open('templates/home.html', 'r'),\n            \"headers\": {\n                \"Content-Type\": \"text/html\"\n            }\n        }\n\nThe HTTP response will be similar to:\n\n.. code-block::\n\n    HTTP/1.1 200 OK\n    Content-Type: text/html\n\n    \u003chtml\u003e\u003ctitle\u003eMy homepage\u003c/title\u003e\u003cbody\u003e\u003ch1\u003eWelcome!\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e\n\nWhen necessary to redirect request, the \"redirect\" key can be used.\n\n.. code-block:: python\n\n    def old_endpoint(params):\n        return {'redirect': '/new-path'}\n\nThe HTTP response will be similar to:\n\n.. code-block::\n\n    HTTP/1.1 301 Moved Permanently\n    Location: https://example.com/new-path\n\nThe usage of keys \"status\" and \"headers\" were shown in the previous examples. The \"status\" and \"headers\" keys, when set,\noverride the values set by default when using the shortcut keys (\"json\", \"file\", and \"redirect\").\n\nError Handling\n--------------\n\nSticker expects you to define the error format to be returned by your API. A error handler is configurable,\nand called every time validation for the endpoint fails.\n\n.. code-block:: python\n\n    def error_handler(error):\n        return {\n            \"content\": {\n                \"error\": error[\"message\"]\n            },\n            \"headers\": {\n                \"Content-Type\": \"application/json\"\n            },\n            \"status_code\": 400\n        }\n\nDeveloping\n==========\n\nWe follow `Semantic Versioning \u003chttps://semver.org/spec/v2.0.0.html\u003e`_.\n\nContributing\n============\n\nSticker is developed under the `Apache 2.0 license \u003chttps://github.com/rafaelcaricio/sticker/blob/master/LICENSE\u003e`_\nand is publicly available to everyone. We are happy to accept contributions.\n\nHow to Contribute\n-----------------\n\n#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a `Good First Issue`_ tag for issues that should be ideal for people who are not very familiar with the codebase yet.\n#. Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it).\n#. Write a test which shows that the bug was fixed or that the feature works as expected.\n#. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_.\n\n.. _`the repository`: https://github.com/rafaelcaricio/sticker\n.. _AUTHORS: https://github.com/rafaelcaricio/sticker/blob/master/AUTHORS.rst\n.. _Good First Issue: https://github.com/rafaelcaricio/sticker/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelcaricio%2Fsticker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frafaelcaricio%2Fsticker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelcaricio%2Fsticker/lists"}