{"id":22273533,"url":"https://github.com/dfleta/ollivanders","last_synced_at":"2026-05-04T03:36:17.596Z","repository":{"id":94648368,"uuid":"327700216","full_name":"dfleta/ollivanders","owner":"dfleta","description":"API REST kata Gilded Rose con Flask-restful, Mongoengine y Mongo Atlas","archived":false,"fork":false,"pushed_at":"2022-03-29T10:08:21.000Z","size":53,"stargazers_count":1,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-25T16:51:37.559Z","etag":null,"topics":["flask","mongodb-atlas","mongoengine","pip-compile","python","restful-api"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dfleta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2021-01-07T18:59:37.000Z","updated_at":"2024-04-27T09:52:53.000Z","dependencies_parsed_at":"2023-07-28T22:02:32.094Z","dependency_job_id":null,"html_url":"https://github.com/dfleta/ollivanders","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dfleta/ollivanders","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Follivanders","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Follivanders/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Follivanders/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Follivanders/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dfleta","download_url":"https://codeload.github.com/dfleta/ollivanders/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Follivanders/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32593945,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"online","status_checked_at":"2026-05-04T02:00:06.625Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["flask","mongodb-atlas","mongoengine","pip-compile","python","restful-api"],"created_at":"2024-12-03T13:13:09.752Z","updated_at":"2026-05-04T03:36:17.591Z","avatar_url":"https://github.com/dfleta.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# API REST con Flask y Mongo Atlas\n\n## Instala el proyecto\n\n### Manual\n\n- Instala virtualenv:\n\n    `$ sudo apt-get install python3.6-venv`\n\n- Crea el directorio y sitúate en él:\n\n    ```bash\n    $ mkdir ./ollivanders\n    $ cd ollivanders\n    ```\n\n- Clona el projecto:\n\n    `$ git clone https://github.com/dfleta/api-rest-gildedrose.git`\n\n- Inicializa el entorno virtual e instala dependencias:\n\n    ```bash\n    $ python3.6 -m venv venv\n    $ source venv/bin/activate\n    (venv) $ pip3 install -r requirements.txt\n    ```\n\n### Como distribución\n\n- Crea el directorio y sitúate en él:\n\n    ```bash\n    $ mkdir ./ollivanders\n    $ cd ollivanders\n    ```\n\n- Clona el projecto:\n\n    `git clone https://github.com/dfleta/api-rest-gildedrose.git`\n\n- Inicializa el entorno virtual y actívalo.\n\n    ```bash\n    $ python3.6 -m venv venv\n    $ source venv/bin/activate\n    ```\n    \n- Instala el proyecto:\n\n    `$ pip3 install API_REST_GildedRose-0.0.1-py3-none-any.whl`\n\n\n### Prepara tu proyecto para distribuirlo\n\n1. Instala las `setuptools`\n\n    `$ pip install setuptools`\n\n2. Instala el paquete `wheel`\n\n    `$ pip3 install wheel`\n\n2. Prepara el fichero `setup.py`\n\n    [Flask tutorial deploy](https://flask.palletsprojects.com/en/1.1.x/tutorial/deploy/)\n\n3. Genera el fichero de distribución:\n\n    `$ python setup.py bdist_wheel` \n\n\n### Ejecuta la aplicación\n\n0. Antes has de dispone de una cuenta en Mongo Atlas y un cluster disponible. Crea una usuaria con su password correspondiente. Luego, obtén el drive para y escribe la URI en el fichero `db_atlas.py` en:\n\n    ```Python\n    connect(\n        host='URI')\n    ```\n\n    Esto conectará tu app con la base de datos `test` que por defecto ofrece MongoDB. \n    Si dispones de otra base de datos en Atlas, sustituye `test` por su nombre en la URI.\n\n1. Activa el entorno virtual:\n\n    `$ source venv/bin/activate`\n\n2. Configura las variables de entorno FLASK:\n\n    ```Bash\n    `$ export FLASK_APP=controller.py`\n    `$ export FLASK_EN=development`\n    ```\n3. Comprueba que tendrás acceso a MongoDB desde Atlas:\n\n    `$ curl portquiz.net:27017`\n\n3. Si es la primera vez que arrancas la app y no dispones de items en la base de datos, inicializala con el comando:\n\n    `$ flask init-db`\n\n4. Arranca la app para que corra en el localhost:\n\n    `$ flask run --host 0.0.0.0`\n\n    Comprueba en tu navegador o con `curl` que corre en:\n    `http://127.0.0.1:5000/`\n\n5. Si quieres que esté disponible en la red local en la ip de tu máquina, ejecuta:\n\n    `$ flask run --host 0.0.0.0`\n\n\n### Dependencias\n\nChequear si los paquetes instalados tienen dependencias compatibles:\n\n```sh\n$ pip3 check\nNo broken requirements found.\n```\n\nChequear si las dependencias no están actualizadas.\n\n```sh\n$ pip list --outdated\nPackage           Version Latest Type \n----------------- ------- ------ -----\naniso8601         8.0.0   9.0.1  wheel\nastroid           2.9.0   2.10.0 wheel\nClick             7.0     8.0.4  wheel\ndnspython         1.16.0  2.2.0  wheel\nFlask             1.1.1   2.0.3  wheel\nFlask-Cors        3.0.8   3.0.10 wheel\nflask-mongoengine 0.9.5   1.0.0  wheel\nFlask-RESTful     0.3.7   0.3.9  wheel\nFlask-WTF         0.14.2  1.0.0  wheel\n```\n\nun buen jaleo... vamos a automatizar el proceso de mantener las dependencias de manera determinista, es decir, siempre generando la misma instalación de las mismas versiones al ejecutar `pip install requirements.txt`\n\nIntalar pip-tools:\n\n`$ pip3 install pip-tools`\n\nCrear el fichero `requirements.in` para pinned (==) todas las dependencias:\n\n`Flask==2.0.3`  OK\n\n`Flask-Cors\u003e=3.0.9`  NOTOK\n\nIncluir sólo las dependencias de alto nivel:\n\n```txt\nFlask==2.0.3\nFlask-Cors==3.0.10\nflask-mongoengine==1.0.0\nFlask-RESTful==0.3.9\nmongoengine==0.24.0\npymongo==4.0\ngunicorn==20.0.4\n```\n\n**Sin** `setup.py` ejecutamos\n\n`pip-compile requirements.in`\n\npara generar el fichero `requirements.txt` con las versiones exactas de los paquetes de `.in` más sus dependencias (usando las últimas versiones que satisfacen las dependencias). Si hay incompatibilidades seguimos sus indicaciones:\n\n```sh\nThere are incompatible versions in the resolved dependencies:\n  pymongo==4.0.1 (from -r requirements.in (line 6))\n  pymongo\u003c=4.0,\u003e=3.4 (from mongoengine==0.24.0-\u003e-r requirements.in (line 5))\n```\n\n```sh\nrequirements.txt\n#\n# This file is autogenerated by pip-compile with python 3.8\n# To update, run:\n#\n#    pip-compile\n#\naniso8601==9.0.1\n    # via flask-restful\nclick==8.0.4\n    # via flask\n...\n```\n\nPara forzar a `pip-compile` a actualizar todos los paquetes en el `requirements.txt` existente, ejecutamos:\n\n`pip-compile --upgrade`\n\n\nSincronizar venv con requirements:\n\n`$ pip-sync`\n\n#### dev dependencies\n\nCrear el fichero `dev-requirements.txt` incluyendo las dependencias para el desarrollo de la app.\nEn la primera línea escribir `-c requirements.txt` para constrñir los dev requirements a los paquetes ya seleciconados para producción en `requirements.txt`.\n\n```sh\n# dev-requirements.in\n-c requirements.txt\npytest\n\n$ pip-compile dev-requirements.in\n```\n\nPara instalar las dependencias dev y producción:\n\n`pip-sync requirements.txt dev-requirements.txt`\n\n\n#### Recursos sobre dependency management\n\nhttps://github.com/jazzband/pip-tools\n\nhttps://nvie.com/posts/better-package-management/\n\nhttps://hynek.me/articles/python-app-deps-2018/\n\n\n### Docker\n\n```sh\n$ docker build -t ollivanders_pinned .\n\n$ docker container run --name ollivanders_pin -dp 5000:5000 ollivanders_pinned:latest\n\n$ docker container stop ollivanders_pin \n\n# Comprobar si .dockerignore ha hecho su trabajo\n$ docker exec -it ollivanders_pin sh\n$ ls\n```\n\n# Uso\n\n```sh\ncurl -w \"\\n\" http://localhost:5000/inventario -H \"Content-Type: application/x-www-form-urlencoded\"\n\ncurl -w \"\\n\" http://localhost:5000/inventario -H \"Content-Type: application/json\"\n\ncurl -d '{\"name\": \"Sombrero seleccionador\", \"sell_in\": 80, \"quality\": 30}' -H \"Content-Type: application/json\" -X POST http://localhost:5000/\n\ncurl -d name=\"Conjured Mana Cake\" -d sell_in=3 -d quality=6 http://127.0.0.1:5000/items -X POST\n\ncurl -d name=\"Conjured Mana Cake\" -d sell_in=3 -d quality=6 http://127.0.0.1:5000/items -X DELETE\n\ncurl -w \"\\n\" http://localhost:5000/items/name/Aged%20Brie -H \"Content-Type: application/json\" -v\n\ncurl -w \"\\n\" http://localhost:5000/items/quality/80 -H \"Content-Type: application/json\" -v\n\ncurl -w \"\\n\" http://localhost:5000/items/sellin/0 -H \"Content-Type: application/json\"\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfleta%2Follivanders","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdfleta%2Follivanders","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfleta%2Follivanders/lists"}