From c4d0e833f7ac7581402c79f7fddd2369a254ccd7 Mon Sep 17 00:00:00 2001 From: lorenagubaira <102861577+Lorenagubaira@users.noreply.github.com> Date: Thu, 15 Jun 2023 17:30:08 +0000 Subject: [PATCH 01/33] the instructions were updated --- README.es.md | 2 ++ README.md | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.es.md b/README.es.md index bba888c..71e28a3 100644 --- a/README.es.md +++ b/README.es.md @@ -20,6 +20,8 @@ Puedes empezar estos ejercicios en pocos segundos haciendo clic en: [Abrir en Co ### Instalación local: +Clona el repositorio en tu ambiente local y sigue los siguientes pasos: + 1. Instala learnpack, el administrador de paquetes para tutoriales de aprendizaje y el complemento del compilador html para learnpack, asegúrate de tener también node.js 14+: ```bash diff --git a/README.md b/README.md index 6f9b0df..9f0d59d 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,10 @@ # 🐍 Python API Requests Tutorial and Exercises By @alesanchezr and other contributors at 4Geeks Academy. - *Estas instrucciones [están disponibles en 🇪🇸 español](https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises/blob/master/README.es.md) :es:* + + In this series you will Learn HTTP and how to use the Python Requests package to create HTTP Requests GET, POST, PUT, DELETE. The entire tutorial is 👆 interactive, ✅ auto-graded and with. 📹 video tutorials. @@ -17,9 +18,10 @@ You can open these exercises in just a few seconds by clicking: [Open in Codespa > Once you have VSCode open the LearnPack exercises should start automatically. If exercises don't run automatically you can try typing on your terminal: `$ learnpack start` - ## Local Installation +Clone the repository in your local environment and follow the steps below: + 1. Install learnpack, the package manager for learning tutorials and the html compiler plugin for learnpack, make sure you also have node.js 14+: ``` From 9463887e7e496331e9f88c7e638865f349725978 Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Wed, 16 Aug 2023 14:08:32 -0400 Subject: [PATCH 02/33] Update learn.json --- learn.json | 1 + 1 file changed, 1 insertion(+) diff --git a/learn.json b/learn.json index 18b3203..7e42241 100644 --- a/learn.json +++ b/learn.json @@ -4,6 +4,7 @@ "description": "Create a Todo list API Interactively using Python language and the Flask Framework", "repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", "videoSolutions": false, + "preview": "https://storage.googleapis.com/breathecode-asset-images/Screenshot%202023-08-16%20at%202.06.51%20PM.png", "projectType": "tutorial", "bugsLink": "https://github.com/learnpack/learnpack/issues/new", From 1d8eeffe16e10f851ad35d6ec0e1c851eec70048 Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Wed, 16 Aug 2023 14:13:17 -0400 Subject: [PATCH 03/33] Update learn.json --- learn.json | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/learn.json b/learn.json index 7e42241..6e28cf4 100644 --- a/learn.json +++ b/learn.json @@ -1,15 +1,25 @@ { "language": "python3", - "slug": "python-flask-api-tutorial", - "description": "Create a Todo list API Interactively using Python language and the Flask Framework", + "title": { + "us": "Learn how to build HTTP requests with Python", + "es": "Aprende a hacer requests HTTP con Python" + }, + "slug": "python-http-requests-api-tutorial-exercises", + "description": { + "us": "Learn interactively to consume and create HTTP requests to API's using Python", + "es": "Aprende interactivamente cómo consumir APIs y hacer requests HTTP con Python" + }, "repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", + "duration": 4, "videoSolutions": false, + "difficulty": "easy", "preview": "https://storage.googleapis.com/breathecode-asset-images/Screenshot%202023-08-16%20at%202.06.51%20PM.png", + "repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", "projectType": "tutorial", + "autoPlay": true, "bugsLink": "https://github.com/learnpack/learnpack/issues/new", - - "editor": { - "version": "1.0.73" - } + "editor": { + "version": "1.0.73" + } } From 082ac08114456cffe83c40078591be9610ca1329 Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Wed, 16 Aug 2023 14:13:27 -0400 Subject: [PATCH 04/33] Update learn.json --- learn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/learn.json b/learn.json index 6e28cf4..0f77ed9 100644 --- a/learn.json +++ b/learn.json @@ -1,5 +1,5 @@ { - "language": "python3", + "language": "python", "title": { "us": "Learn how to build HTTP requests with Python", "es": "Aprende a hacer requests HTTP con Python" From 52f030660c805b2835a7a30d3ff2b3af8a730d44 Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Wed, 16 Aug 2023 14:16:15 -0400 Subject: [PATCH 05/33] Add files via upload --- preview.png | Bin 0 -> 215350 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 preview.png diff --git a/preview.png b/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..00ede431c27167270b2b430b71270dd11bc8714e GIT binary patch literal 215350 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 z

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 literal 0 HcmV?d00001 From 8b6eb7b2bcd4f15a57cdebac8b8a95f66d8de2c6 Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Wed, 16 Aug 2023 14:16:40 -0400 Subject: [PATCH 06/33] Update learn.json --- learn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/learn.json b/learn.json index 0f77ed9..02512d3 100644 --- a/learn.json +++ b/learn.json @@ -13,7 +13,7 @@ "duration": 4, "videoSolutions": false, "difficulty": "easy", - "preview": "https://storage.googleapis.com/breathecode-asset-images/Screenshot%202023-08-16%20at%202.06.51%20PM.png", + "preview": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises/blob/master/preview.png?raw=true", "repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", "projectType": "tutorial", "autoPlay": true, From 9082c9ec8aec7ceafe762cb5aa62cc66aa26b14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charly=20Chac=C3=B3n?= <107764250+Charlytoc@users.noreply.github.com> Date: Tue, 27 Feb 2024 01:28:08 -0500 Subject: [PATCH 07/33] Update devcontainer.json --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 6ffab33..d653790 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -21,7 +21,7 @@ "extensions": ["learn-pack.learnpack-vscode"] } }, - "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@2.1.20 -g && learnpack plugins:install @learnpack/python@1.0.0" + "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@2.1.35 -g && learnpack plugins:install @learnpack/python@1.0.0" // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, From 06a6cbae4cf20f6a2783e51c94448e244755f252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charly=20Chac=C3=B3n?= <107764250+Charlytoc@users.noreply.github.com> Date: Tue, 27 Feb 2024 01:28:40 -0500 Subject: [PATCH 08/33] Update learn.json --- learn.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/learn.json b/learn.json index 02512d3..671213e 100644 --- a/learn.json +++ b/learn.json @@ -19,7 +19,6 @@ "autoPlay": true, "bugsLink": "https://github.com/learnpack/learnpack/issues/new", "editor": { - "version": "1.0.73" + "version": "3.1.6" } - } From 69be5d6d287bd3f317800edcef8c88356f06fc3d Mon Sep 17 00:00:00 2001 From: Jose Mora <109150320+josemoracard@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:25:08 +0100 Subject: [PATCH 09/33] Update README.es.md --- README.es.md | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/README.es.md b/README.es.md index 71e28a3..910aadb 100644 --- a/README.es.md +++ b/README.es.md @@ -1,14 +1,14 @@ # 🐍 Tutorial y Ejercicios de Python API Requests -Por @alesanchezr y otros contribuidores at 4Geeks Academy +Por @alesanchezr y otros contribuidores de 4Geeks Academy -En esta serie, aprenderás HTTP y cómo usar el package requests de Python para crear solicitudes HTTP GET, POST, PUT, DELETE. +En esta serie, aprenderás HTTP (*Hypertext Transfer Protocol*) y cómo usar el **package requests** de Python para crear solicitudes HTTP GET, POST, PUT, DELETE. Todo el tutorial es 👆 interactivo, ✅ calificado automáticamente y con 📹 videos tutoriales. -Estos Ejercicios son colaborativos, ¡te necesitamos! Si encuentras algún error o falta de ortografía, por favor contribuye y repórtalo. +Estos ejercicios son colaborativos, ¡te necesitamos! Si encuentras algún error o falta de ortografía, por favor contribuye y repórtalo. @@ -16,29 +16,20 @@ Estos Ejercicios son colaborativos, ¡te necesitamos! Si encuentras algún error Puedes empezar estos ejercicios en pocos segundos haciendo clic en: [Abrir en Codespaces](https://codespaces.new/?repo=4GeeksAcademy/python-http-requests-api-tutorial-exercises) (recomendado) o [Abrir en Gitpod](https://gitpod.io#https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises). -> Una vez ya tengas abirto VSCode los ejercicios de LearnPack deberían empezar automáticamente, si esto no sucede puedes intentar empezar los ejercicios escribiendo este comando en tu terminal: `$ learnpack start` +> Una vez ya tengas abierto VSCode los ejercicios de LearnPack deberían empezar automáticamente, si esto no sucede puedes intentar empezar los ejercicios escribiendo este comando en tu terminal: `$ learnpack start` ### Instalación local: Clona el repositorio en tu ambiente local y sigue los siguientes pasos: -1. Instala learnpack, el administrador de paquetes para tutoriales de aprendizaje y el complemento del compilador html para learnpack, asegúrate de tener también node.js 14+: +1. Asegúrate de instalar LearnPack, node.js versión 14+ y Python versión 3+. Este es el comando para instalar LearnPack: ```bash $ npm i learnpack -g $ learnpack plugins:install learnpack-python ``` -2. Descarga este ejercicio en particular usando learnpack y `cd` para entrar en la carpeta: - -```bash -$ learnpack download python-http-requests-api-tutorial-exercises -$ cd python-http-requests-api-tutorial-exercises -``` - -> Nota: Una vez que termine de descargar, encontrarás la carpeta "exercises" que contiene todos los ejercicios. - -3. Comienza con los ejercicios ejecutando el siguiente en el mismo nivel que tu archivo learn.json: +2. Comienza con los ejercicios ejecutando el siguiente comando en el mismo nivel que tu archivo `learn.json`: ```bash $ pip install pytest==4.4.2 mock pytest-testdox @@ -50,20 +41,20 @@ $ learnpack start Cada ejercicio es un pequeño proyecto en Python que contiene los siguientes archivos: -1. **app.py:** representa el archivo de entrada de python que será ejecutado en el computador. +1. **app.py:** representa el archivo de entrada de Python que será ejecutado en el computador. 2. **README.md:** contiene las instrucciones del ejercicio. 3. **test.py:** no tienes que abrir este archivo. Contiene los scripts de pruebas del ejercicio. -> Nota: Estos ejercicios tienen calificación automática pero es un tanto rígida, te recomiendo ignorar los tests, considéralos como una recomendación o podrías frustrarte. +> Nota: Estos ejercicios tienen calificación automática. Los tests son muy rígidos y estrictos, mi recomendación es que no prestes demasiada atención a los tests y los uses solo como una sugerencia o podrías frustrarte. ## Colaboradores Gracias a estas personas maravillosas ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)): -1. [Alejandro Sanchez (alesanchezr)](https://github.com/alesanchezr), contribución: (programador) 💻 (idea) 🤔, (build-tests) ⚠️ , (pull-request-review) 🤓 (build-tutorial) ✅ (documentación) 📖 +1. [Alejandro Sanchez (alesanchezr)](https://github.com/alesanchezr), contribución: (programador) 💻, (idea) 🤔, (build-tests) ⚠️, (pull-request-review) 👀, (build-tutorial) ✅, (documentación) 📖 -2. [Paolo (plucodev)](https://github.com/plucodev), contribución: (bug reports) 🐛, (programador), (traducción) 🌎 +2. [Paolo (plucodev)](https://github.com/plucodev), contribución: (bug reports) 🐛, (programador) 💻, (traducción) 🌎 Este proyecto sigue la especificación [all-contributors](https://github.com/kentcdodds/all-contributors). ¡Todas las contribuciones son bienvenidas! -Este y otros ejercicios son usados para [aprender a programar](https://4geeksacademy.com/es/aprender-a-programar/aprender-a-programar-desde-cero) por parte de los alumnos de 4Geeks Academy [Coding Bootcamp](https://4geeksacademy.com/us/coding-bootcamp) realizado por [Alejandro Sánchez](https://twitter.com/alesanchezr) y muchos otros contribuyentes. Conoce más sobre nuestros [Curso de Programación](https://4geeksacademy.com/es/curso-de-programacion-desde-cero?lang=es) para convertirte en [Full Stack Developer](https://4geeksacademy.com/es/coding-bootcamps/desarrollador-full-stack/?lang=es), o nuestro [Data Science Bootcamp](https://4geeksacademy.com/es/coding-bootcamps/curso-datascience-machine-learning). +Este y otros ejercicios son usados para [aprender a programar](https://4geeksacademy.com/es/aprender-a-programar/aprender-a-programar-desde-cero) por parte de los alumnos de 4Geeks Academy [Coding Bootcamp](https://4geeksacademy.com/es/inicio) realizado por [Alejandro Sánchez](https://twitter.com/alesanchezr) y muchos otros contribuyentes. Conoce más sobre nuestros [Cursos de Programación](https://4geeksacademy.com/es/curso-de-programacion-desde-cero?lang=es) para convertirte en [Full Stack Developer](https://4geeksacademy.com/es/coding-bootcamps/desarrollador-full-stack/?lang=es), o nuestro [Data Science Bootcamp](https://4geeksacademy.com/es/coding-bootcamps/curso-datascience-machine-learning). From 99b06ebae6317cd7baeed23beeb0df884b269187 Mon Sep 17 00:00:00 2001 From: Jose Mora <109150320+josemoracard@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:33:13 +0100 Subject: [PATCH 10/33] Update README.es.md --- README.es.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.es.md b/README.es.md index 910aadb..c541afd 100644 --- a/README.es.md +++ b/README.es.md @@ -22,7 +22,7 @@ Puedes empezar estos ejercicios en pocos segundos haciendo clic en: [Abrir en Co Clona el repositorio en tu ambiente local y sigue los siguientes pasos: -1. Asegúrate de instalar LearnPack, node.js versión 14+ y Python versión 3+. Este es el comando para instalar LearnPack: +1. Asegúrate de instalar [LearnPack](https://www.learnpack.co/), node.js versión 14+ y Python versión 3+. Este es el comando para instalar LearnPack: ```bash $ npm i learnpack -g From 9128ef6577fa367498828d4120f2142f03009b01 Mon Sep 17 00:00:00 2001 From: Jose Mora <109150320+josemoracard@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:34:15 +0100 Subject: [PATCH 11/33] Update README.es.md --- README.es.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.es.md b/README.es.md index c541afd..3a2dbe5 100644 --- a/README.es.md +++ b/README.es.md @@ -29,7 +29,7 @@ $ npm i learnpack -g $ learnpack plugins:install learnpack-python ``` -2. Comienza con los ejercicios ejecutando el siguiente comando en el mismo nivel que tu archivo `learn.json`: +2. Comienza con los ejercicios ejecutando el siguiente comando al mismo nivel que tu archivo `learn.json`: ```bash $ pip install pytest==4.4.2 mock pytest-testdox From e0c63f3cfcc8196dc43fbef03be78a37a854797e Mon Sep 17 00:00:00 2001 From: Jose Mora <109150320+josemoracard@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:36:08 +0100 Subject: [PATCH 12/33] Update README.md --- README.md | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 9f0d59d..b28d3f4 100644 --- a/README.md +++ b/README.md @@ -7,40 +7,33 @@ By @alesanchezr and Note: The exercises have automatic grading but its very rigid and string, my recomendation is to ignore the tests and use them only as a recomendation or you can get frustrated. +> Note: The exercises have automatic grading, but it's very rigid and strict, my recommendation is to not take the tests too serious and use them only as a suggestion, or you may get frustrated. ## Contributors Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)): -1. [Alejandro Sanchez (alesanchezr)](https://github.com/alesanchezr), contribution: (coder) 💻 (idea) 🤔, (build-tests) ⚠️ , (pull-request-review) 👀 (build-tutorial) ✅ (documentation) 📖 +1. [Alejandro Sanchez (alesanchezr)](https://github.com/alesanchezr), contribution: (coder) 💻, (idea) 🤔, (build-tests) ⚠️, (pull-request-review) 👀, (build-tutorial) ✅, (documentation) 📖 -2. [Paolo (plucodev)](https://github.com/plucodev), contribution: (bug reports) 🐛, contribution: (coder), (translation) 🌎 +2. [Paolo (plucodev)](https://github.com/plucodev), contribution: (bug reports) 🐛, contribution: (coder) 💻, (translation) 🌎 -This project follows the[all-contributors](https://github.com/kentcdodds/all-contributors) specification.Contributions of any kind are welcome! +This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind are welcome! -This and many other exercises are built by students as part of the 4Geeks Academy [Coding Bootcamp](https://4geeksacademy.com/us/coding-bootcamp) by [Alejandro Sánchez](https://twitter.com/alesanchezr) and many other contributors. Find out more about our [Full Stack Developer Course](https://4geeksacademy.com/us/coding-bootcamps/part-time-full-stack-developer), and [Data Science Bootcamp](https://4geeksacademy.com/us/coding-bootcamps/datascience-machine-learning). \ No newline at end of file +This and many other exercises are built by students as part of the 4Geeks Academy [Coding Bootcamp](https://4geeksacademy.com/us/coding-bootcamp) by [Alejandro Sánchez](https://twitter.com/alesanchezr) and many other contributors. Find out more about our [Full Stack Developer Course](https://4geeksacademy.com/us/coding-bootcamps/part-time-full-stack-developer), and [Data Science Bootcamp](https://4geeksacademy.com/us/coding-bootcamps/datascience-machine-learning). From 6b1bcaad867dddd0cc8cf3ccb83c671066299b79 Mon Sep 17 00:00:00 2001 From: Jose Mora <109150320+josemoracard@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:39:22 +0100 Subject: [PATCH 13/33] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b28d3f4..4848bb7 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ $ learnpack plugins:install learnpack-python 2. Start the tutorial/exercises by running the following command at the same level your `learn.json` file is: ```bash -$ pip install pytest==4.4.2 mock pytest-testdox +$ pip3 install pytest==6.2.5 pytest-testdox mock requests toml $ learnpack start ``` From b9dd88373f5ce56d5953ebb704716291d7690227 Mon Sep 17 00:00:00 2001 From: Jose Mora <109150320+josemoracard@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:39:24 +0100 Subject: [PATCH 14/33] Update README.es.md --- README.es.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.es.md b/README.es.md index 3a2dbe5..4ba74fb 100644 --- a/README.es.md +++ b/README.es.md @@ -32,7 +32,7 @@ $ learnpack plugins:install learnpack-python 2. Comienza con los ejercicios ejecutando el siguiente comando al mismo nivel que tu archivo `learn.json`: ```bash -$ pip install pytest==4.4.2 mock pytest-testdox +$ pip3 install pytest==6.2.5 pytest-testdox mock requests toml $ learnpack start ``` From 6b4373d1793a45b342f227f9ad29245438586abe Mon Sep 17 00:00:00 2001 From: Jose Mora <109150320+josemoracard@users.noreply.github.com> Date: Tue, 26 Mar 2024 07:19:35 +0000 Subject: [PATCH 15/33] Pending changes exported from your codespace --- .learn/resets/03-response-body/app.py | 10 ++++++++++ .../README.es.md | 6 +++--- exercises/00-welcome/README.md | 13 ++++++++++++ exercises/01-creating-a-request/README.es.md | 20 +++++++++++++++++++ .../README.md | 10 +++++----- .../app.py | 0 .../01-creating-a-request/solution.hide.py | 6 ++++++ .../test.py | 0 exercises/01-hello-world/README.md | 13 ------------ exercises/01-what-is-a-request/README.es.md | 20 ------------------- exercises/02-random-status/README.es.md | 11 +++++----- exercises/02-random-status/README.md | 12 +++++------ exercises/02-random-status/solution.hide.py | 14 +++++++++++++ exercises/02-random-status/test.py | 14 ++++++++++--- exercises/03-response-body/README.es.md | 14 ++++++++----- exercises/03-response-body/README.md | 12 +++++++---- exercises/03-response-body/app.py | 9 ++++++++- exercises/03-response-body/solution.hide.py | 10 ++++++++++ exercises/03-response-body/test.py | 4 ++-- exercises/04-response-body-json/README.es.md | 14 ++++++------- exercises/04-response-body-json/README.md | 12 +++++------ learn.json | 2 +- 22 files changed, 145 insertions(+), 81 deletions(-) create mode 100644 .learn/resets/03-response-body/app.py rename exercises/{01-hello-world => 00-welcome}/README.es.md (59%) create mode 100644 exercises/00-welcome/README.md create mode 100644 exercises/01-creating-a-request/README.es.md rename exercises/{01-what-is-a-request => 01-creating-a-request}/README.md (66%) rename exercises/{01-what-is-a-request => 01-creating-a-request}/app.py (100%) create mode 100644 exercises/01-creating-a-request/solution.hide.py rename exercises/{01-what-is-a-request => 01-creating-a-request}/test.py (100%) delete mode 100644 exercises/01-hello-world/README.md delete mode 100644 exercises/01-what-is-a-request/README.es.md create mode 100644 exercises/02-random-status/solution.hide.py create mode 100644 exercises/03-response-body/solution.hide.py diff --git a/.learn/resets/03-response-body/app.py b/.learn/resets/03-response-body/app.py new file mode 100644 index 0000000..9409dea --- /dev/null +++ b/.learn/resets/03-response-body/app.py @@ -0,0 +1,10 @@ +import requests + +url = "https://assets.breatheco.de/apis/fake/sample/random-status.php" + +response = requests.get(url) + +if response.status_code == 200: + print(response.text) +else: + print("Something went wrong") \ No newline at end of file diff --git a/exercises/01-hello-world/README.es.md b/exercises/00-welcome/README.es.md similarity index 59% rename from exercises/01-hello-world/README.es.md rename to exercises/00-welcome/README.es.md index 30f83f8..e5c364b 100644 --- a/exercises/01-hello-world/README.es.md +++ b/exercises/00-welcome/README.es.md @@ -1,13 +1,13 @@ -# Python API Requests +# `00` Welcome to Python API Requests! Python Requests es el paquete más popular para consumir API y hacer solicitudes HTTP. Aquí aprenderás: 1. Cómo hacer solicitudes GET. -2. Cómo obtener propiedades de una data e información. +2. Cómo obtener propiedades de datos e información. 3. Cómo configurar request headers. 4. Cómo configurar request content-type. 5. Cómo hacer solicitudes POST. -Haga click en el botón `next →` en la esquina superior derecha para continuar. \ No newline at end of file +Haga clic en el botón `Next →` en la esquina superior derecha para continuar. \ No newline at end of file diff --git a/exercises/00-welcome/README.md b/exercises/00-welcome/README.md new file mode 100644 index 0000000..580410c --- /dev/null +++ b/exercises/00-welcome/README.md @@ -0,0 +1,13 @@ +# `00` Welcome to Python API Requests! + +Python Requests is the most popular package for consuming APIs and doing HTTP requests. + +Here you will learn: + +1. How to do GET requests. +2. How to fetch data properties and information. +3. How to set request headers. +4. How to set request content-type. +5. How to do POST requests. + +Click the `Next →` button on the top right to continue. \ No newline at end of file diff --git a/exercises/01-creating-a-request/README.es.md b/exercises/01-creating-a-request/README.es.md new file mode 100644 index 0000000..652d819 --- /dev/null +++ b/exercises/01-creating-a-request/README.es.md @@ -0,0 +1,20 @@ +# `01` Creating a Request + +Python tiene integrado un [paquete de solicitudes (*requests package*)](https://requests.readthedocs.io/en/master/) eso permite a los desarrolladores crear solicitudes HTTP con bastante facilidad. + +Así es como en Python hacemos una solicitud HTTP GET: + +```python +response = requests.get('') +print(response.status_code) +``` + +## 📝 Instrucciones: + +Actualiza la variable `url` para que solicite a esta dirección: + +```bash +https://assets.breatheco.de/apis/fake/sample/hello.php +``` + +> Nota: La consola debe imprimir un código de estado 200. \ No newline at end of file diff --git a/exercises/01-what-is-a-request/README.md b/exercises/01-creating-a-request/README.md similarity index 66% rename from exercises/01-what-is-a-request/README.md rename to exercises/01-creating-a-request/README.md index 413bd2e..6ff6b36 100644 --- a/exercises/01-what-is-a-request/README.md +++ b/exercises/01-creating-a-request/README.md @@ -1,4 +1,4 @@ -# 02 Creating a request +# `01` Creating a Request Python has a [requests package](https://requests.readthedocs.io/en/master/) that allows developers to create HTTP request pretty easily. @@ -9,12 +9,12 @@ response = requests.get('') print(response.status_code) ``` -# 📝 Instructions +## 📝 Instructions: -Change the variable url to make it request to: +Update the `url` variable to make it request to this address: -```bash +```text https://assets.breatheco.de/apis/fake/sample/hello.php ``` -Note: The console should print a 200 status code. \ No newline at end of file +> Note: The console should print a 200 status code. \ No newline at end of file diff --git a/exercises/01-what-is-a-request/app.py b/exercises/01-creating-a-request/app.py similarity index 100% rename from exercises/01-what-is-a-request/app.py rename to exercises/01-creating-a-request/app.py diff --git a/exercises/01-creating-a-request/solution.hide.py b/exercises/01-creating-a-request/solution.hide.py new file mode 100644 index 0000000..4834ba5 --- /dev/null +++ b/exercises/01-creating-a-request/solution.hide.py @@ -0,0 +1,6 @@ +import requests + +url = "https://assets.breatheco.de/apis/fake/sample/hello.php" +response = requests.get(url) + +print("The response status is: "+str(response.status_code)) \ No newline at end of file diff --git a/exercises/01-what-is-a-request/test.py b/exercises/01-creating-a-request/test.py similarity index 100% rename from exercises/01-what-is-a-request/test.py rename to exercises/01-creating-a-request/test.py diff --git a/exercises/01-hello-world/README.md b/exercises/01-hello-world/README.md deleted file mode 100644 index 3cb9e7e..0000000 --- a/exercises/01-hello-world/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Python API Requests - -Python Requests is the most popular package for consuming API's and doing HTTP requests. - -Here you will learn: - -1. How to do GET requests. -2. How to fech data properties and information. -3. How to set request headers. -4. How to set request content-type. -5. How to do POST requests. - -Click the `next →` button on the top right to continue. \ No newline at end of file diff --git a/exercises/01-what-is-a-request/README.es.md b/exercises/01-what-is-a-request/README.es.md deleted file mode 100644 index 408b1d2..0000000 --- a/exercises/01-what-is-a-request/README.es.md +++ /dev/null @@ -1,20 +0,0 @@ -# 02 Creando una solicitud (request) - -Python tiene un [paquete de solicitud (requests package)](https://requests.readthedocs.io/en/master/) eso permite a los desarrolladores crear solicitudes HTTP con bastante facilidad. - -Así es como en Python hacemos una solicitud HTTP GET: - -```python -response = requests.get('') -print(response.status_code) -``` - -# 📝 Instrucciones - -Cambie la variable URL para que solicite: - -```bash -https://assets.breatheco.de/apis/fake/sample/hello.php -``` - -Nota: La consola debe imprimir un código de estado 200. \ No newline at end of file diff --git a/exercises/02-random-status/README.es.md b/exercises/02-random-status/README.es.md index a1a3d54..e670821 100644 --- a/exercises/02-random-status/README.es.md +++ b/exercises/02-random-status/README.es.md @@ -1,14 +1,15 @@ -# `02` Manejar el Status de Respuesta +# `02` Handle Response Status La siguiente solicitud GET siempre devuelve un código de status diferente, nunca se sabe qué respuesta está recibiendo del servidor. -## 📝Instrucciones +## 📝 Instrucciones: Crea una condición para imprimir en la consola los siguientes mensajes según el status de respuesta: -| Status | Message | +| Status | Mensaje | | ----- | ----- | -| 404 | The URL you asked is not found | +| 404 | The URL you asked for is not found | | 503 | Unavailable right now | | 200 | Everything went perfect | -| 400 | Something is wrong on the request params | \ No newline at end of file +| 400 | Something is wrong with the request params | +| Otro código de status | Unknown status code | \ No newline at end of file diff --git a/exercises/02-random-status/README.md b/exercises/02-random-status/README.md index 7cbf29c..93df280 100644 --- a/exercises/02-random-status/README.md +++ b/exercises/02-random-status/README.md @@ -1,15 +1,15 @@ # `02` Handle Response Status -The following GET request is always returning a different status code, you never know what reponse you are getting form the server. +The following GET request is always returning a different status code; you never know what response you are getting from the server. -## 📝Instructions +## 📝 Instructions: -Create a condition to print on the console the following messages depending on the response status: +Create a condition to print on the console the following messages, depending on the response status: | Status | Message | | ----- | ----- | -| 404 | The URL you asked is not found | +| 404 | The URL you asked for is not found | | 503 | Unavailable right now | | 200 | Everything went perfect | -| 400 | Something is wrong on the request params | -| anything else | anything | \ No newline at end of file +| 400 | Something is wrong with the request params | +| Any other code | Unknown status code | \ No newline at end of file diff --git a/exercises/02-random-status/solution.hide.py b/exercises/02-random-status/solution.hide.py new file mode 100644 index 0000000..59beb63 --- /dev/null +++ b/exercises/02-random-status/solution.hide.py @@ -0,0 +1,14 @@ +import requests + +response = requests.get("https://assets.breatheco.de/apis/fake/sample/random-status.php") + +if response.status_code == 404: + print("The URL you asked for is not found") +elif response.status_code == 503: + print("Unavailable right now") +elif response.status_code == 200: + print("Everything went perfect") +elif response.status_code == 400: + print("Something is wrong with the request params") +else: + print("Unknown code") \ No newline at end of file diff --git a/exercises/02-random-status/test.py b/exercises/02-random-status/test.py index e552c51..111bc00 100644 --- a/exercises/02-random-status/test.py +++ b/exercises/02-random-status/test.py @@ -16,7 +16,7 @@ def test_url_200(capsys, app): captured = capsys.readouterr() assert "Everything went perfect\n" == captured.out -@pytest.mark.it("When testing for 404 it should print The URL you asked is not found'") +@pytest.mark.it("Testing for 404: The URL you asked for is not found'") def test_url_404(capsys, app): with patch('requests.get') as mock_request: mock_request.return_value.status_code = 404 @@ -32,10 +32,18 @@ def test_url_503(capsys, app): captured = capsys.readouterr() assert "Unavailable right now\n" == captured.out -@pytest.mark.it("Testing for 400: Something is wrong on the request params") +@pytest.mark.it("Testing for 400: Something is wrong with the request params") def test_url_400(capsys, app): with patch('requests.get') as mock_request: mock_request.return_value.status_code = 400 app() captured = capsys.readouterr() - assert "Something is wrong on the request params\n" == captured.out + assert "Something is wrong with the request params\n" == captured.out + +@pytest.mark.it("Testing for any other code: Unknown status code") +def test_url_generic_response(capsys, app): + with patch('requests.get') as mock_request: + mock_request.return_value.status_code = 500 # For example, using status code 500 for generic response + app() + captured = capsys.readouterr() + assert "Unknown status code\n" == captured.out \ No newline at end of file diff --git a/exercises/03-response-body/README.es.md b/exercises/03-response-body/README.es.md index 8e93d07..348bb72 100644 --- a/exercises/03-response-body/README.es.md +++ b/exercises/03-response-body/README.es.md @@ -1,14 +1,18 @@ -# `03` Respuesta en Body +# `03` Response Body Haga clic en este enlace para ver la respuesta que esta solicitud GET está dando en el body: [https://assets.breatheco.de/apis/fake/sample/random-status.php](https://assets.breatheco.de/apis/fake/sample/random-status.php) -Ahora, si deseas obtener ese body como respuesta (texto), todo lo que tiene que hacer es: +Ahora, si deseas obtener el *body* de la respuesta (texto/contenido), todo lo que tienes que hacer es: + ```py -# plain text print(response.text) ``` -# 📝 Instrucciones +## 📝 Instrucciones: + +Imprime en la consola el *body* de la respuesta solo para solicitudes con status `200`, para el resto imprime: -Imprime en la consola la the responde body solo para solicitudes 200, para el resto imprima "Something went wrong". \ No newline at end of file +```text +"Something went wrong" +``` \ No newline at end of file diff --git a/exercises/03-response-body/README.md b/exercises/03-response-body/README.md index abe927f..2f7d516 100644 --- a/exercises/03-response-body/README.md +++ b/exercises/03-response-body/README.md @@ -3,12 +3,16 @@ Click on this link to see the response body that this GET request is giving: [https://assets.breatheco.de/apis/fake/sample/random-status.php](https://assets.breatheco.de/apis/fake/sample/random-status.php) -Now, if you want to get that response body (text) all you have to do is: +Now, if you want to get that response body (text/content) all you have to do is this: + ```py -# plain text print(response.text) ``` -# 📝 Instructions +## 📝 Instructions: + +Print on the console the response body for status code `200`, for all the other print: -Print on the console the response body only for 200 requests, for all the other print "Something went wrong". \ No newline at end of file +```text +"Something went wrong" +``` \ No newline at end of file diff --git a/exercises/03-response-body/app.py b/exercises/03-response-body/app.py index 37cdac0..9409dea 100644 --- a/exercises/03-response-body/app.py +++ b/exercises/03-response-body/app.py @@ -1,3 +1,10 @@ import requests -url = "https://assets.breatheco.de/apis/fake/sample/random-status.php" \ No newline at end of file +url = "https://assets.breatheco.de/apis/fake/sample/random-status.php" + +response = requests.get(url) + +if response.status_code == 200: + print(response.text) +else: + print("Something went wrong") \ No newline at end of file diff --git a/exercises/03-response-body/solution.hide.py b/exercises/03-response-body/solution.hide.py new file mode 100644 index 0000000..9409dea --- /dev/null +++ b/exercises/03-response-body/solution.hide.py @@ -0,0 +1,10 @@ +import requests + +url = "https://assets.breatheco.de/apis/fake/sample/random-status.php" + +response = requests.get(url) + +if response.status_code == 200: + print(response.text) +else: + print("Something went wrong") \ No newline at end of file diff --git a/exercises/03-response-body/test.py b/exercises/03-response-body/test.py index c138063..7dfd71a 100644 --- a/exercises/03-response-body/test.py +++ b/exercises/03-response-body/test.py @@ -7,7 +7,7 @@ def test_url_call(capsys, app): app() mock_request.assert_called_once_with("https://assets.breatheco.de/apis/fake/sample/random-status.php") -@pytest.mark.it("Testing for 200: Everythign went perfect") +@pytest.mark.it("Testing for 200: Everything went perfect") def test_url_200(capsys, app): with patch('requests.get') as mock_request: mock_request.return_value.status_code = 200 @@ -16,7 +16,7 @@ def test_url_200(capsys, app): captured = capsys.readouterr() assert "something\n" == captured.out -@pytest.mark.it("When testing for 404 it should print 'Something went wrong'") +@pytest.mark.it("Testing for any other code: Something went wrong") def test_url_404(capsys, app): with patch('requests.get') as mock_request: mock_request.return_value.status_code = 404 diff --git a/exercises/04-response-body-json/README.es.md b/exercises/04-response-body-json/README.es.md index 5b00639..e5005d4 100644 --- a/exercises/04-response-body-json/README.es.md +++ b/exercises/04-response-body-json/README.es.md @@ -1,8 +1,8 @@ -# `04` Respuesta JSON +# `04` Response JSON Pero tener una respuesta basada en texto no es muy útil, es por eso que las API normalmente responden en formato CSV, JSON, YAML o XML. -# 📝 Instrucciones +## 📝 Instrucciones: El siguiente endpoint devuelve la hora actual en un formato JSON cada vez que se solicita utilizando el método GET. @@ -22,15 +22,15 @@ Response body: } ``` -Haga una solicitud GET a ese endpoint e imprima la hora en la consola con este formato: +Haga una solicitud GET a ese endpoint e imprime la hora en la consola con este formato: ```bash Current time: 17 hrs 06 min and 23 sec ``` -## 💡Pista +## 💡 Pistas: -1. Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario y almacenarlo en una variable -2. Obtenga las propiedades `horas`,` minutos` y `segundos` del diccionario -3. Concatenar todo de esta manera: `Hora actual: 17 h 06 min y 23 seg` +1. Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario y almacenarlo en una variable. +2. Obtenga las propiedades `hours`, `minutes` y `seconds` del diccionario. +3. Concatenar todo de esta manera: `Hora actual: 17 h 06 min y 23 seg`. diff --git a/exercises/04-response-body-json/README.md b/exercises/04-response-body-json/README.md index bdd7ddb..b8bdea5 100644 --- a/exercises/04-response-body-json/README.md +++ b/exercises/04-response-body-json/README.md @@ -2,7 +2,7 @@ But having a text based response is not very useful, that is why API's normally respond in CSV, JSON, YAML or XML format. -# 📝 Instructions +## 📝 Instructions: The following endpoint returns the current time in a JSON format every time it is requested using the GET method. @@ -24,13 +24,13 @@ Response body: Please do a GET request to that endpoint and print the time on the console with this format: -```bash +```text Current time: 17 hrs 06 min and 23 sec ``` -## 💡Hint +## 💡 Hints: -1. Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary and store it in a variable -2. Get the `hours`, `minutes` and `seconds` properties from the dictionary -3. Concatenate everything together like this: `Current time: 17 hrs 06 min and 23 sec` +1. Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary and store it in a variable. +2. Get the `hours`, `minutes` and `seconds` properties from the dictionary. +3. Concatenate everything together like this: `Current time: 17 hrs 06 min and 23 sec`. diff --git a/learn.json b/learn.json index 02512d3..ab22723 100644 --- a/learn.json +++ b/learn.json @@ -6,7 +6,7 @@ }, "slug": "python-http-requests-api-tutorial-exercises", "description": { - "us": "Learn interactively to consume and create HTTP requests to API's using Python", + "us": "Learn interactively to consume and create HTTP requests to APIs using Python", "es": "Aprende interactivamente cómo consumir APIs y hacer requests HTTP con Python" }, "repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", From 8e299a4466b160aaa18b3f84ea19cb7b06d52fe0 Mon Sep 17 00:00:00 2001 From: josemoracard Date: Tue, 26 Mar 2024 15:10:49 +0000 Subject: [PATCH 16/33] exercises, .gitignore, solutions, tests --- .gitignore | 1 + .learn/resets/03-response-body/app.py | 10 ------ exercises/00-welcome/README.es.md | 2 +- exercises/02-random-status/solution.hide.py | 2 +- exercises/02-random-status/test.py | 2 +- exercises/03-response-body/app.py | 7 ---- exercises/03-response-body/test.py | 2 +- exercises/04-response-body-json/README.es.md | 8 ++--- exercises/04-response-body-json/README.md | 10 +++--- .../04-response-body-json/solution.hide.py | 16 ++++++++++ exercises/04-response-body-json/test.py | 2 +- exercises/05-project-name/README.es.md | 22 ++++++------- exercises/05-project-name/README.md | 18 +++++------ exercises/05-project-name/app.py | 2 +- exercises/05-project-name/solution.hide.py | 15 +++++++++ exercises/05-project-name/test.py | 7 ++-- exercises/06-project-list/README.es.md | 32 ++++++++++--------- exercises/06-project-list/README.md | 27 ++++++++-------- exercises/06-project-list/app.py | 2 +- exercises/06-project-list/solution.hide.py | 15 +++++++++ exercises/06-project-list/test.py | 14 ++++---- exercises/07-project-list-image/README.es.md | 23 ++++++------- exercises/07-project-list-image/README.md | 21 ++++++------ exercises/07-project-list-image/app.py | 2 +- .../07-project-list-image/solution.hide.py | 19 +++++++++++ exercises/07-project-list-image/test.py | 6 ++-- exercises/08-blog-post-author/README.es.md | 26 ++++++++------- exercises/08-blog-post-author/README.md | 20 ++++++------ exercises/08-blog-post-author/app.py | 2 +- .../08-blog-post-author/solution.hide.py | 21 ++++++++++++ exercises/08-blog-post-author/test.py | 2 +- .../09-array-of-blog-titles/README.es.md | 20 ------------ exercises/09-array-of-blog-titles/README.md | 21 ------------ exercises/09-list-of-blog-titles/README.es.md | 20 ++++++++++++ exercises/09-list-of-blog-titles/README.md | 21 ++++++++++++ .../app.py | 2 +- .../09-list-of-blog-titles/solution.hide.py | 25 +++++++++++++++ .../test.py | 8 ++--- exercises/10-get-post-tags/README.es.md | 14 ++++++++ exercises/10-get-post-tags/README.md | 14 ++++++++ .../app.py | 2 +- exercises/10-get-post-tags/solution.hide.py | 23 +++++++++++++ .../test.py | 0 exercises/10-get_post_tags/README.es.md | 14 -------- exercises/10-get_post_tags/README.md | 14 -------- .../11-get-attachment-by-id/README.es.md | 13 ++++++++ exercises/11-get-attachment-by-id/README.md | 13 ++++++++ .../app.py | 2 +- .../11-get-attachment-by-id/solution.hide.py | 25 +++++++++++++++ .../test.py | 16 +++++----- .../11-get_attachment_by_id/README.es.md | 13 -------- exercises/11-get_attachment_by_id/README.md | 13 -------- exercises/12-post-request/README.es.md | 17 +++++----- exercises/12-post-request/README.md | 15 ++++----- exercises/12-post-request/app.py | 2 +- exercises/12-post-request/solution.hide.py | 8 +++++ exercises/12-post-request/test.py | 2 +- exercises/13-post-request-body/README.es.md | 19 +++++------ exercises/13-post-request-body/README.md | 19 +++++------ exercises/13-post-request-body/app.py | 4 +-- .../13-post-request-body/solution.hide.py | 18 +++++++++++ exercises/13-post-request-body/test.py | 4 +-- 62 files changed, 468 insertions(+), 291 deletions(-) delete mode 100644 .learn/resets/03-response-body/app.py create mode 100644 exercises/04-response-body-json/solution.hide.py create mode 100644 exercises/05-project-name/solution.hide.py create mode 100644 exercises/06-project-list/solution.hide.py create mode 100644 exercises/07-project-list-image/solution.hide.py create mode 100644 exercises/08-blog-post-author/solution.hide.py delete mode 100644 exercises/09-array-of-blog-titles/README.es.md delete mode 100644 exercises/09-array-of-blog-titles/README.md create mode 100644 exercises/09-list-of-blog-titles/README.es.md create mode 100644 exercises/09-list-of-blog-titles/README.md rename exercises/{09-array-of-blog-titles => 09-list-of-blog-titles}/app.py (77%) create mode 100644 exercises/09-list-of-blog-titles/solution.hide.py rename exercises/{09-array-of-blog-titles => 09-list-of-blog-titles}/test.py (80%) create mode 100644 exercises/10-get-post-tags/README.es.md create mode 100644 exercises/10-get-post-tags/README.md rename exercises/{10-get_post_tags => 10-get-post-tags}/app.py (80%) create mode 100644 exercises/10-get-post-tags/solution.hide.py rename exercises/{10-get_post_tags => 10-get-post-tags}/test.py (100%) delete mode 100644 exercises/10-get_post_tags/README.es.md delete mode 100644 exercises/10-get_post_tags/README.md create mode 100644 exercises/11-get-attachment-by-id/README.es.md create mode 100644 exercises/11-get-attachment-by-id/README.md rename exercises/{11-get_attachment_by_id => 11-get-attachment-by-id}/app.py (83%) create mode 100644 exercises/11-get-attachment-by-id/solution.hide.py rename exercises/{11-get_attachment_by_id => 11-get-attachment-by-id}/test.py (63%) delete mode 100644 exercises/11-get_attachment_by_id/README.es.md delete mode 100644 exercises/11-get_attachment_by_id/README.md create mode 100644 exercises/12-post-request/solution.hide.py create mode 100644 exercises/13-post-request-body/solution.hide.py diff --git a/.gitignore b/.gitignore index 4598f93..54245b5 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ !/exercises !/exercises/* +exercises/*/__pycache__/ !/.learn /.learn/** diff --git a/.learn/resets/03-response-body/app.py b/.learn/resets/03-response-body/app.py deleted file mode 100644 index 9409dea..0000000 --- a/.learn/resets/03-response-body/app.py +++ /dev/null @@ -1,10 +0,0 @@ -import requests - -url = "https://assets.breatheco.de/apis/fake/sample/random-status.php" - -response = requests.get(url) - -if response.status_code == 200: - print(response.text) -else: - print("Something went wrong") \ No newline at end of file diff --git a/exercises/00-welcome/README.es.md b/exercises/00-welcome/README.es.md index e5c364b..9c91a02 100644 --- a/exercises/00-welcome/README.es.md +++ b/exercises/00-welcome/README.es.md @@ -1,6 +1,6 @@ # `00` Welcome to Python API Requests! -Python Requests es el paquete más popular para consumir API y hacer solicitudes HTTP. +Python Requests es el paquete más popular para consumir APIs y hacer solicitudes HTTP. Aquí aprenderás: diff --git a/exercises/02-random-status/solution.hide.py b/exercises/02-random-status/solution.hide.py index 59beb63..c5f53cb 100644 --- a/exercises/02-random-status/solution.hide.py +++ b/exercises/02-random-status/solution.hide.py @@ -11,4 +11,4 @@ elif response.status_code == 400: print("Something is wrong with the request params") else: - print("Unknown code") \ No newline at end of file + print("Unknown status code") \ No newline at end of file diff --git a/exercises/02-random-status/test.py b/exercises/02-random-status/test.py index 111bc00..9e774ac 100644 --- a/exercises/02-random-status/test.py +++ b/exercises/02-random-status/test.py @@ -22,7 +22,7 @@ def test_url_404(capsys, app): mock_request.return_value.status_code = 404 app() captured = capsys.readouterr() - assert "The URL you asked is not found\n" == captured.out + assert "The URL you asked for is not found\n" == captured.out @pytest.mark.it("Testing for 503: Unavailable right now") def test_url_503(capsys, app): diff --git a/exercises/03-response-body/app.py b/exercises/03-response-body/app.py index 9409dea..66b2f6b 100644 --- a/exercises/03-response-body/app.py +++ b/exercises/03-response-body/app.py @@ -1,10 +1,3 @@ import requests url = "https://assets.breatheco.de/apis/fake/sample/random-status.php" - -response = requests.get(url) - -if response.status_code == 200: - print(response.text) -else: - print("Something went wrong") \ No newline at end of file diff --git a/exercises/03-response-body/test.py b/exercises/03-response-body/test.py index 7dfd71a..09972c4 100644 --- a/exercises/03-response-body/test.py +++ b/exercises/03-response-body/test.py @@ -7,7 +7,7 @@ def test_url_call(capsys, app): app() mock_request.assert_called_once_with("https://assets.breatheco.de/apis/fake/sample/random-status.php") -@pytest.mark.it("Testing for 200: Everything went perfect") +@pytest.mark.it("Testing for 200: Ok") def test_url_200(capsys, app): with patch('requests.get') as mock_request: mock_request.return_value.status_code = 200 diff --git a/exercises/04-response-body-json/README.es.md b/exercises/04-response-body-json/README.es.md index e5005d4..600a412 100644 --- a/exercises/04-response-body-json/README.es.md +++ b/exercises/04-response-body-json/README.es.md @@ -22,7 +22,7 @@ Response body: } ``` -Haga una solicitud GET a ese endpoint e imprime la hora en la consola con este formato: +1. Haz una solicitud GET a ese endpoint e imprime la hora en la consola con este formato: ```bash Current time: 17 hrs 06 min and 23 sec @@ -30,7 +30,7 @@ Current time: 17 hrs 06 min and 23 sec ## 💡 Pistas: -1. Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario y almacenarlo en una variable. -2. Obtenga las propiedades `hours`, `minutes` y `seconds` del diccionario. -3. Concatenar todo de esta manera: `Hora actual: 17 h 06 min y 23 seg`. ++ Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario y almacenarlo en una variable. ++ Obtenga las propiedades `hours`, `minutes` y `seconds` del diccionario. ++ Concatenar todo de esta manera: `Hora actual: 17 h 06 min y 23 seg`. diff --git a/exercises/04-response-body-json/README.md b/exercises/04-response-body-json/README.md index b8bdea5..5e7e6db 100644 --- a/exercises/04-response-body-json/README.md +++ b/exercises/04-response-body-json/README.md @@ -1,6 +1,6 @@ # `04` Response JSON -But having a text based response is not very useful, that is why API's normally respond in CSV, JSON, YAML or XML format. +But having a text based response is not very useful, that is why APIs normally respond in CSV, JSON, YAML or XML format. ## 📝 Instructions: @@ -22,7 +22,7 @@ Response body: } ``` -Please do a GET request to that endpoint and print the time on the console with this format: +1. Please do a GET request to that endpoint and print the time on the console with this format: ```text Current time: 17 hrs 06 min and 23 sec @@ -30,7 +30,7 @@ Current time: 17 hrs 06 min and 23 sec ## 💡 Hints: -1. Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary and store it in a variable. -2. Get the `hours`, `minutes` and `seconds` properties from the dictionary. -3. Concatenate everything together like this: `Current time: 17 hrs 06 min and 23 sec`. ++ Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary and store it in a variable. ++ Get the `hours`, `minutes` and `seconds` properties from the dictionary. ++ Concatenate everything together like this: `Current time: 17 hrs 06 min and 23 sec`. diff --git a/exercises/04-response-body-json/solution.hide.py b/exercises/04-response-body-json/solution.hide.py new file mode 100644 index 0000000..cc2f069 --- /dev/null +++ b/exercises/04-response-body-json/solution.hide.py @@ -0,0 +1,16 @@ +import requests + +response = requests.get("https://assets.breatheco.de/apis/fake/sample/time.php") + +if response.status_code == 200: + # Parsing JSON response + time_data = response.json() + + # Extracting hours, minutes, and seconds + hours = time_data["hours"] + minutes = time_data["minutes"] + seconds = time_data["seconds"] + + print(f"Current time: {hours} hrs {minutes} min and {seconds} sec") +else: + print("Failed to fetch current time.") \ No newline at end of file diff --git a/exercises/04-response-body-json/test.py b/exercises/04-response-body-json/test.py index 28031b9..a057d36 100644 --- a/exercises/04-response-body-json/test.py +++ b/exercises/04-response-body-json/test.py @@ -14,7 +14,7 @@ def test_url_call(capsys, app): app() mock_request.assert_called_once_with("https://assets.breatheco.de/apis/fake/sample/time.php") -@pytest.mark.it("You should print on the console a stirng like: Current time: 19 hrs 45 min and 06 sec") +@pytest.mark.it("You should print on the console a string like: Current time: 19 hrs 45 min and 06 sec") def test_url_output(capsys, app): with patch('requests.get') as mock_request: mock_request.return_value = FakeResponse() diff --git a/exercises/05-project-name/README.es.md b/exercises/05-project-name/README.es.md index 65ddfed..002f6e1 100644 --- a/exercises/05-project-name/README.es.md +++ b/exercises/05-project-name/README.es.md @@ -1,4 +1,4 @@ -# `05` Nombre de Proyecto +# `05` Project name El siguiente endpoint es ideal para recuperar proyectos de estudiantes: @@ -8,7 +8,7 @@ GET [https://assets.breatheco.de/apis/fake/sample/project1.php](https://assets.b { "name": "Coursera eLearning", "thumb": "https://unsplash.it/450/320?image=178", - "description": "The coolest elarning site on the planet", + "description": "The coolest eLearning site on the planet", "images": [ "https://unsplash.it/450/320?image=178", "https://unsplash.it/450/320?image=179", @@ -18,19 +18,19 @@ GET [https://assets.breatheco.de/apis/fake/sample/project1.php](https://assets.b } ``` -# 📝 Instrucciones +## 📝 Instrucciones: -Llama al endpoint e imprime el nombre del proyecto en el terminal (solo el nombre del proyecto) +1. Llama al endpoint e imprime el nombre del proyecto en el terminal (solo el nombre del proyecto). -Example output: -```bash +Ejemplo de salida: + +```text Coursera eLearning ``` -## 💡Pista +## 💡 Pistas: -1. Ejercicio similar al anterior. -2. Haz una solicitud GET al endpoint. -3. Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario (igual que lo hizo en el último ejercicio). -4. Imprime el nombre del proyecto, puedes acceder al nombre de la propiedad en el diccionario de respuestas. ++ Haz una solicitud GET al endpoint. ++ Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario (igual que en el último ejercicio). ++ Imprime el nombre del proyecto, puedes acceder al nombre de la propiedad en el diccionario de respuestas. diff --git a/exercises/05-project-name/README.md b/exercises/05-project-name/README.md index 2543185..7731838 100644 --- a/exercises/05-project-name/README.md +++ b/exercises/05-project-name/README.md @@ -8,7 +8,7 @@ GET [https://assets.breatheco.de/apis/fake/sample/project1.php](https://assets.b { "name": "Coursera eLearning", "thumb": "https://unsplash.it/450/320?image=178", - "description": "The coolest elarning site on the planet", + "description": "The coolest eLearning site on the planet", "images": [ "https://unsplash.it/450/320?image=178", "https://unsplash.it/450/320?image=179", @@ -18,19 +18,19 @@ GET [https://assets.breatheco.de/apis/fake/sample/project1.php](https://assets.b } ``` -# 📝 Instructions +## 📝 Instructions: -Please call the endpoint and print the project name on the terminal (only the project name) +1. Please call the endpoint and print the project name on the terminal (only the project name). Example output: -```bash + +```text Coursera eLearning ``` -## 💡Hint +## 💡 Hints: -1. Similar exercise to the previous one. -2. Do a GET request to the endpoint. -3. Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary (same as you did on last exercise). -4. Print the project name, you can access the property name on the response dictionary. ++ Make a GET request to the endpoint. ++ Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary (same as you did on the last exercise). ++ Print the project name; you can access the property name in the response dictionary. diff --git a/exercises/05-project-name/app.py b/exercises/05-project-name/app.py index a471294..0ca5c86 100644 --- a/exercises/05-project-name/app.py +++ b/exercises/05-project-name/app.py @@ -1,3 +1,3 @@ import requests -# your code here \ No newline at end of file +# Your code here \ No newline at end of file diff --git a/exercises/05-project-name/solution.hide.py b/exercises/05-project-name/solution.hide.py new file mode 100644 index 0000000..c840be4 --- /dev/null +++ b/exercises/05-project-name/solution.hide.py @@ -0,0 +1,15 @@ +import requests + +# Your code here +response = requests.get("https://assets.breatheco.de/apis/fake/sample/project1.php") + +if response.status_code == 200: + # Parsing JSON response + project_data = response.json() + + # Extracting project name + project_name = project_data["name"] + + print(project_name) +else: + print("Failed to fetch project data.") \ No newline at end of file diff --git a/exercises/05-project-name/test.py b/exercises/05-project-name/test.py index e95a4da..1256d31 100644 --- a/exercises/05-project-name/test.py +++ b/exercises/05-project-name/test.py @@ -8,7 +8,7 @@ def json(self): return { "name": "Sample Project", "thumb": "https://unsplash.it/450/320?image=178", - "description": "The coolest elarning site on the planet", + "description": "The coolest eLearning site on the planet", "images": [ "https://unsplash.it/450/320?image=178", "https://unsplash.it/450/320?image=179", @@ -17,13 +17,14 @@ def json(self): ] } -@pytest.mark.it("requests.get has to be called to the project url") +@pytest.mark.it("requests.get has to be called for the project.php url") def test_url_call(capsys, app): with patch('requests.get') as mock_request: app() mock_request.assert_called_once_with("https://assets.breatheco.de/apis/fake/sample/project1.php") -@pytest.mark.it("You should print on the console a stirng like: Current time: 19 hrs 45 min and 06 sec") + +@pytest.mark.it("You should print the name of the project on the console") def test_url_output(capsys, app): with patch('requests.get') as mock_request: mock_request.return_value = FakeResponse() diff --git a/exercises/06-project-list/README.es.md b/exercises/06-project-list/README.es.md index 0850906..d54db13 100644 --- a/exercises/06-project-list/README.es.md +++ b/exercises/06-project-list/README.es.md @@ -1,15 +1,16 @@ -# `06` Lista de Proyectos +# `06` Project List -El siguiente endpoint devuelve una respuesta con formato JSON con varios proyectos en una lista: +El siguiente endpoint devuelve una respuesta en formato JSON con varios proyectos en una lista: GET: [https://assets.breatheco.de/apis/fake/sample/project_list.php](https://assets.breatheco.de/apis/fake/sample/project_list.php) Cada uno de los proyectos tiene el siguiente formato (ejemplo): + ```json { "name": "Coursera eLearning", "thumb": "https://unsplash.it/450/320?image=178", - "description": "The coolest elarning site on the planet", + "description": "The coolest eLearning site on the planet", "images": [ "https://unsplash.it/450/320?image=178", "https://unsplash.it/450/320?image=179", @@ -19,22 +20,23 @@ Cada uno de los proyectos tiene el siguiente formato (ejemplo): } ``` -# 📝 Instrucciones +## 📝 Instrucciones: + +1. Llama al endpoint e imprime el nombre del **SEGUNDO** proyecto en la lista: -Llame al punto final e imprima el nombre del **SEGUNDO** proyecto en la lista: +Ejemplo de salida: -Ejemplo: -```bash +```text Coursera eLearning ``` -## 💡Pista +## 💡 Pistas: -1. Abre el endpoint en tu navegador y analiza la respuesta que se encuentra en el body, necesitas saber qué esperar, cuál será la estructura de los datos (body response) que regresan del servidor. -2. En este caso, el body response comienza con un corchete `[`, es una lista, debe acceder al segundo proyecto utilizando posiciones numéricas. -2. Haga una solicitud GET al endpoint. -3. Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp)para obtener el body response como un diccionario. -4. Encuentra el segundo proyecto -5. Imprime el nombre del proyecto, puedes acceder a la propiedad nombre "name" del diccionario del proyecto. -6. No necesitas hacer un bucle (loop), solo accede al segundo elemento como una lista usando la posición ++ Abre el endpoint en tu navegador y analiza la respuesta que se encuentra en el body, necesitas saber qué esperar, cuál será la estructura de los datos (response body) que devuelve el servidor. ++ En este caso, el response body comienza con un corchete `[`, es una lista, debes acceder al segundo proyecto utilizando posiciones numéricas. ++ Haz una solicitud GET al endpoint. ++ Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario. ++ Encuentra el segundo proyecto de la lista. ++ Imprime el nombre del proyecto, puedes acceder a la propiedad `name` del diccionario del proyecto. ++ No necesitas hacer un bucle (loop), solo accede al segundo elemento como una lista usando la posición. diff --git a/exercises/06-project-list/README.md b/exercises/06-project-list/README.md index 1312bfd..c4c8e0e 100644 --- a/exercises/06-project-list/README.md +++ b/exercises/06-project-list/README.md @@ -1,15 +1,16 @@ # `06` Project List -The following endpoint returns a JSON formated response with several projects in a list: +The following endpoint returns a JSON formatted response with several projects in a list: GET: [https://assets.breatheco.de/apis/fake/sample/project_list.php](https://assets.breatheco.de/apis/fake/sample/project_list.php) Each of the projects has the following format (example): + ```json { "name": "Coursera eLearning", "thumb": "https://unsplash.it/450/320?image=178", - "description": "The coolest elarning site on the planet", + "description": "The coolest eLearning site on the planet", "images": [ "https://unsplash.it/450/320?image=178", "https://unsplash.it/450/320?image=179", @@ -19,22 +20,22 @@ Each of the projects has the following format (example): } ``` -# 📝 Instructions +## 📝 Instructions: -Please call the endpoint and print the name of the **SECOND** project on the list: +1. Please call the endpoint and print the name of the **SECOND** project on the list: Example output: -```bash +```text Coursera eLearning ``` -## 💡Hint +## 💡 Hints: -1. Open the endpoint on your browser and analyze the response body, you need to know what to expect, what is going to be the structure of the data (response body) coming back from the server. -2. In this case the response body starts with a square bracket `[`, it's a list, you have to access the second project by using numerical positions. -2. Do a GET request to the endpoint. -3. Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary. -4. Find the second project on the list. -5. Print the project name, you can access the property name of the project dictionary. -6. You don't need to loop, just access the second item like a list using the position ++ Open the endpoint on your browser and analyze the response body, you need to know what to expect, what is going to be the structure of the data (response body) coming back from the server. ++ In this case, the response body starts with a square bracket `[`, it's a list, and you have to access the second project by using numerical positions. ++ Make a GET request to the endpoint. ++ Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary. ++ Find the second project on the list. ++ Print the project name, you can access the property `name` of the project dictionary. ++ You don't need to loop, just access the second item like a list using the position. diff --git a/exercises/06-project-list/app.py b/exercises/06-project-list/app.py index a471294..0ca5c86 100644 --- a/exercises/06-project-list/app.py +++ b/exercises/06-project-list/app.py @@ -1,3 +1,3 @@ import requests -# your code here \ No newline at end of file +# Your code here \ No newline at end of file diff --git a/exercises/06-project-list/solution.hide.py b/exercises/06-project-list/solution.hide.py new file mode 100644 index 0000000..8cdcd5f --- /dev/null +++ b/exercises/06-project-list/solution.hide.py @@ -0,0 +1,15 @@ +import requests + +# Your code here +response = requests.get("https://assets.breatheco.de/apis/fake/sample/project_list.php") + +if response.status_code == 200: + # Parsing JSON response + project_list = response.json() + + # Extracting the name of the second project + second_project_name = project_list[1]["name"] + + print(second_project_name) +else: + print("Failed to fetch project list.") \ No newline at end of file diff --git a/exercises/06-project-list/test.py b/exercises/06-project-list/test.py index 4d7945b..66ba249 100644 --- a/exercises/06-project-list/test.py +++ b/exercises/06-project-list/test.py @@ -6,9 +6,9 @@ class FakeResponse(object): status_code = 200 def json(self): return [{ - "name": "Stackbucks for milkshakes", + "name": "Starbucks for milkshakes", "thumb": "https://unsplash.it/450/320?image=178", - "description": "The coolest elarning site on the planet", + "description": "", "images": [ "https://unsplash.it/450/320?image=178", "https://unsplash.it/450/320?image=179", @@ -19,7 +19,7 @@ def json(self): { "name": "Uber for trucks", "thumb": "https://unsplash.it/450/320?image=178", - "description": "The coolest elarning site on the planet", + "description": "", "images": [ "https://unsplash.it/450/320?image=178", "https://unsplash.it/450/320?image=179", @@ -28,9 +28,9 @@ def json(self): ] }, { - "name": "McDonals for tacos", + "name": "McDonalds for tacos", "thumb": "https://unsplash.it/450/320?image=178", - "description": "The coolest elarning site on the planet", + "description": "", "images": [ "https://unsplash.it/450/320?image=178", "https://unsplash.it/450/320?image=179", @@ -40,7 +40,7 @@ def json(self): } ] -@pytest.mark.it("requests.get has to be called to the project url") +@pytest.mark.it("requests.get has to be called for the project_list.php url") def test_url_call(capsys, app): with patch('requests.get') as mock_request: app() @@ -52,7 +52,7 @@ def test_url_output2(capsys, app): mock_request.return_value = FakeResponse() app() captured = capsys.readouterr() - assert "McDonals for tacos\n" != captured.out + assert "McDonalds for tacos\n" != captured.out @pytest.mark.it("Make sure you are printing the project name") def test_url_output1(capsys, app): diff --git a/exercises/07-project-list-image/README.es.md b/exercises/07-project-list-image/README.es.md index 0c5c96b..d155f02 100644 --- a/exercises/07-project-list-image/README.es.md +++ b/exercises/07-project-list-image/README.es.md @@ -1,20 +1,21 @@ -# `07` Lista de las Imagenes del Proyecto +# `07` Project List Image -# 📝 Instrucciones +## 📝 Instrucciones: -Haz una solicitud GET a la misma URL que en el ejercicio anterior, imprime la `última` url image (imagen de la url) en el `último` proyecto. +1. Haz una solicitud GET a la misma URL que en el ejercicio anterior, imprime la **última** URL de las imagenes del **último** proyecto. Ejemplo: -```bash + +```text https://image.shutterstock.com/image-vector/trophy-cup-award-vector-icon-260nw-592525184.jpg ``` -## 💡Pista +## 💡 Pistas: -1. Haz una solicitud GET al endpoint. -2. Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario. -3. Encuentra el último proyecto en la lista. -4. Encuentra la última imagen de ese proyecto. -5. Imprima la imagen de la URL en la consola. -6. No es necesario realizar un bucle (loop), solo use las posiciones numéricas (índice/index) para acceder a la información ++ Haz una solicitud GET al endpoint. ++ Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario. ++ Encuentra el último proyecto en la lista. ++ Encuentra la última imagen de ese proyecto. ++ Imprime la URL de esa imagen en la consola. ++ No es necesario realizar un bucle, solo usa las posiciones numéricas (índice/index) para acceder a la información. diff --git a/exercises/07-project-list-image/README.md b/exercises/07-project-list-image/README.md index 5b37214..94985d1 100644 --- a/exercises/07-project-list-image/README.md +++ b/exercises/07-project-list-image/README.md @@ -1,20 +1,21 @@ # `07` Project List Image -# 📝 Instructions +## 📝 Instructions: -Do a GET request to the same URL as in the previous exercise, print the `last` image URL in the `last` project. +1. Do a GET request to the same URL as in the previous exercise, print the **last** image URL in the **last** project. Example output: -```bash + +```text https://image.shutterstock.com/image-vector/trophy-cup-award-vector-icon-260nw-592525184.jpg ``` -## 💡Hint +## 💡 Hints: -1. Do a GET request to the endpoint. -2. Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary. -3. Find the last project on the list. -4. Find the last image of that project. -5. Print the image URL on the console. -6. No need to loop, just use the numerical positions (index) to access the information ++ Do a GET request to the endpoint. ++ Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary. ++ Find the last project on the list. ++ Find the last image of that project. ++ Print the image URL on the console. ++ No need to loop, just use the numerical positions (index) to access the information. diff --git a/exercises/07-project-list-image/app.py b/exercises/07-project-list-image/app.py index a471294..0ca5c86 100644 --- a/exercises/07-project-list-image/app.py +++ b/exercises/07-project-list-image/app.py @@ -1,3 +1,3 @@ import requests -# your code here \ No newline at end of file +# Your code here \ No newline at end of file diff --git a/exercises/07-project-list-image/solution.hide.py b/exercises/07-project-list-image/solution.hide.py new file mode 100644 index 0000000..b52a93f --- /dev/null +++ b/exercises/07-project-list-image/solution.hide.py @@ -0,0 +1,19 @@ +import requests + +# Your code here +response = requests.get("https://assets.breatheco.de/apis/fake/sample/project_list.php") + +if response.status_code == 200: + # Parsing JSON response + project_list = response.json() + + # Extracting the last project + last_project = project_list[-1] + + # Extracting the last image URL + last_image_url = last_project["images"][-1] + + # Printing the last image URL + print(last_image_url) +else: + print("Failed to fetch project list.") \ No newline at end of file diff --git a/exercises/07-project-list-image/test.py b/exercises/07-project-list-image/test.py index 3a733a7..b18b204 100644 --- a/exercises/07-project-list-image/test.py +++ b/exercises/07-project-list-image/test.py @@ -18,7 +18,7 @@ def json(self): { "name" : "Coursera eLearning", "thumb" : "https://unsplash.it/450/320?image=178", - "description" : "The coolest elarning site on the planet", + "description" : "The coolest eLearning site on the planet", "images" : [ "https://unsplash.it/450/320?image=178", "https://unsplash.it/450/320?image=179", @@ -29,7 +29,7 @@ def json(self): { "name" : "Company Website", "thumb" : "https://unsplash.it/450/320?image=278", - "description" : "Super boring company porfolio website with the tipical about us, home, contact us sections", + "description" : "Super boring company portfolio website with the typical about us, home, and contact us sections", "images" : [ "https://unsplash.it/450/320?image=278", "https://unsplash.it/450/320?image=280", @@ -38,7 +38,7 @@ def json(self): } ] -@pytest.mark.it("requests.get has to be called to the project url") +@pytest.mark.it("requests.get has to be called for the project_list.php url") def test_url_call(capsys, app): with patch('requests.get') as mock_request: app() diff --git a/exercises/08-blog-post-author/README.es.md b/exercises/08-blog-post-author/README.es.md index ba99543..46037b0 100644 --- a/exercises/08-blog-post-author/README.es.md +++ b/exercises/08-blog-post-author/README.es.md @@ -1,20 +1,22 @@ -# `08` Publicar autor de blog +# `08` Post blog author -Tómate un momento para comprender el body response al hacer una solicitud GET a este endpoint: +Tómate un momento para comprender el response body al hacer una solicitud GET a este endpoint: [https://assets.breatheco.de/apis/fake/sample/weird_portfolio.php](https://assets.breatheco.de/apis/fake/sample/weird_portfolio.php) -👉🏼 [Aquí hay una breve explicación en video.](https://www.youtube.com/watch?v=fwfBYVrvSk0) +> 👉🏼 [Aquí hay una breve explicación en video.](https://www.youtube.com/watch?v=fwfBYVrvSk0) -# 📝 Instrucciones +![explicación del json](https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises/blob/master/assets/traversion_json.png?raw=true) -Obtén el nombre del autor de la primera publicación. +## 📝 Instrucciones: -## 💡Pista +1. Obtén el nombre del autor de la primera publicación. -1. Haz una solicitud GET al endpoint. -2. Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario. -3. Encuentra la primera publicación -4. Obtén el autor del diccionario -5. Escribe el nombre del autor -6. No necesitas hacer un bucle (loop), solo usa las posiciones (índice/index) +## 💡 Pistas: + ++ Haz una solicitud GET al endpoint. ++ Usa el [metodo .json()](https://www.w3schools.com/python/ref_requests_response.asp) para obtener el response body como un diccionario. ++ Encuentra la primera publicación. ++ Obtén el diccionario `author`. ++ Imprime el nombre del autor. ++ No necesitas hacer un bucle, solo usa las posiciones (índice/index). diff --git a/exercises/08-blog-post-author/README.md b/exercises/08-blog-post-author/README.md index 17d8775..f31550a 100644 --- a/exercises/08-blog-post-author/README.md +++ b/exercises/08-blog-post-author/README.md @@ -3,20 +3,20 @@ Take a moment to understand the response body when doing a GET request to this endpoint: [https://assets.breatheco.de/apis/fake/sample/weird_portfolio.php](https://assets.breatheco.de/apis/fake/sample/weird_portfolio.php) -👉🏼 [Here is a brief video explanation.](https://www.youtube.com/watch?v=fwfBYVrvSk0) +> 👉🏼 [Here is a brief video explanation.](https://www.youtube.com/watch?v=fwfBYVrvSk0) ![json explanation](https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises/blob/master/assets/traversion_json.png?raw=true) -# 📝 Instructions +## 📝 Instructions: -Get the author name of the first post. +1. Get the author name of the first post. -## 💡Hint +## 💡 Hints: -1. Do a GET request to the endpoint. -2. Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary. -3. Find the first post -4. Get the author dictionary -5. Print author name -6. You dont need to loop, jsut use the positions (index). ++ Do a GET request to the endpoint. ++ Use the [.json() method](https://www.w3schools.com/python/ref_requests_response.asp) to get the response body as a dictionary. ++ Find the first post. ++ Get the `author` dictionary. ++ Print the author name. ++ You don't need to loop, just use the positions (index). diff --git a/exercises/08-blog-post-author/app.py b/exercises/08-blog-post-author/app.py index a471294..0ca5c86 100644 --- a/exercises/08-blog-post-author/app.py +++ b/exercises/08-blog-post-author/app.py @@ -1,3 +1,3 @@ import requests -# your code here \ No newline at end of file +# Your code here \ No newline at end of file diff --git a/exercises/08-blog-post-author/solution.hide.py b/exercises/08-blog-post-author/solution.hide.py new file mode 100644 index 0000000..2d25260 --- /dev/null +++ b/exercises/08-blog-post-author/solution.hide.py @@ -0,0 +1,21 @@ +import requests + +# Your code here +response = requests.get("https://assets.breatheco.de/apis/fake/sample/weird_portfolio.php") + +if response.status_code == 200: + # Parsing JSON response + data = response.json() + + # Getting the first post + first_post = data["posts"][0] + + # Getting the author dictionary + author_dict = first_post["author"] + + # Getting the author name + author_name = author_dict["name"] + + print(author_name) +else: + print("Failed to fetch data from the endpoint.") \ No newline at end of file diff --git a/exercises/08-blog-post-author/test.py b/exercises/08-blog-post-author/test.py index 6bb9ed6..a69d0f4 100644 --- a/exercises/08-blog-post-author/test.py +++ b/exercises/08-blog-post-author/test.py @@ -11,7 +11,7 @@ def json(self): ] } -@pytest.mark.it("requests.get has to be called to the project url") +@pytest.mark.it("requests.get has to be called for the weird_portfolio.php url") def test_url_call(capsys, app): with patch('requests.get') as mock_request: app() diff --git a/exercises/09-array-of-blog-titles/README.es.md b/exercises/09-array-of-blog-titles/README.es.md deleted file mode 100644 index a341d3e..0000000 --- a/exercises/09-array-of-blog-titles/README.es.md +++ /dev/null @@ -1,20 +0,0 @@ -# `09` Arreglo con titulos de publicaciones - -# 📝 Instrucciones - -Usando el mismo endpoint del ejercicio anterior, crea una función `get_titles` que retorne los titulos de todos los post (publicaciones) encontradas en el response body. - -## 💡Pista - -1. Crea una función `get_titles`. -2. Declara un array vacío llamado `titles`. -3. Haz el request del API adentro de la función. -4. realiza un bucle (Loop) que itere para cada publicación. -5. Agregue cada título de publicación al nuevo arreglo. -6. Retorna el arreglo. - -La salida de la consola debería verse parecido a esto: - -```python -['title 1','title 2', 'title 3'] -``` \ No newline at end of file diff --git a/exercises/09-array-of-blog-titles/README.md b/exercises/09-array-of-blog-titles/README.md deleted file mode 100644 index 0c1a241..0000000 --- a/exercises/09-array-of-blog-titles/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# `09` Array of blog titles - -# 📝 Instructions - -Using the same endpoint from the previous exercise, create a function `get_titles` that returns the titles of all the posts found in the response body. - -## 💡Hint - -1. Create the function `get_titles`. -2. Declare a new empty array called `titles`. -3. Do the request to the endpoint inside of the function. -4. Loop each post from the list of posts. -5. Get the title of each post. -6. Add that title to the new array. -7. Return the titles array. - -The console output should be something similar to this: - -```python -['title 1','title 2', 'title 3'] -``` \ No newline at end of file diff --git a/exercises/09-list-of-blog-titles/README.es.md b/exercises/09-list-of-blog-titles/README.es.md new file mode 100644 index 0000000..496528f --- /dev/null +++ b/exercises/09-list-of-blog-titles/README.es.md @@ -0,0 +1,20 @@ +# `09` List of blog titles + +## 📝 Instrucciones: + +1. Usando el mismo endpoint del ejercicio anterior, crea una función `get_titles` que retorne los títulos de todas las publicaciones encontradas en el response body. + +## 💡 Pistas: + ++ Crea una función `get_titles`. ++ Declara una lista vacía llamada `titles`. ++ Haz el request del API adentro de la función. ++ realiza un bucle que itere para cada publicación. ++ Agregue cada título a la nueva lista. ++ Retorna la lista `titles`. + +La salida de la consola debería verse parecido a esto: + +```python +['title 1', 'title 2', 'title 3'] +``` \ No newline at end of file diff --git a/exercises/09-list-of-blog-titles/README.md b/exercises/09-list-of-blog-titles/README.md new file mode 100644 index 0000000..dd5b70f --- /dev/null +++ b/exercises/09-list-of-blog-titles/README.md @@ -0,0 +1,21 @@ +# `09` List of blog titles + +## 📝 Instructions: + +1. Using the same endpoint from the previous exercise, create a function `get_titles` that returns the titles of all the posts found in the response body. + +## 💡 Hints: + ++ Create the function `get_titles`. ++ Declare a new empty list called `titles`. ++ Do the request to the endpoint inside the function. ++ Loop each post from the list of posts. ++ Get the title of each post. ++ Add that title to the new list. ++ Return the `titles` list. + +The console output should be something similar to this: + +```python +['title 1', 'title 2', 'title 3'] +``` \ No newline at end of file diff --git a/exercises/09-array-of-blog-titles/app.py b/exercises/09-list-of-blog-titles/app.py similarity index 77% rename from exercises/09-array-of-blog-titles/app.py rename to exercises/09-list-of-blog-titles/app.py index e464bad..cc536a8 100644 --- a/exercises/09-array-of-blog-titles/app.py +++ b/exercises/09-list-of-blog-titles/app.py @@ -1,7 +1,7 @@ import requests def get_titles(): - # your code here + # Your code here return None diff --git a/exercises/09-list-of-blog-titles/solution.hide.py b/exercises/09-list-of-blog-titles/solution.hide.py new file mode 100644 index 0000000..090093b --- /dev/null +++ b/exercises/09-list-of-blog-titles/solution.hide.py @@ -0,0 +1,25 @@ +import requests + +def get_titles(): + # Your code here + url = "https://assets.breatheco.de/apis/fake/sample/weird_portfolio.php" + + titles = [] + + response = requests.get(url) + + if response.status_code == 200: + # Parsing JSON response + data = response.json() + + for post in data["posts"]: + title = post["title"] + if title: + titles.append(title) + else: + print("Failed to fetch data from the endpoint.") + + return titles + + +print(get_titles()) \ No newline at end of file diff --git a/exercises/09-array-of-blog-titles/test.py b/exercises/09-list-of-blog-titles/test.py similarity index 80% rename from exercises/09-array-of-blog-titles/test.py rename to exercises/09-list-of-blog-titles/test.py index 59965c8..e1b05b8 100644 --- a/exercises/09-array-of-blog-titles/test.py +++ b/exercises/09-list-of-blog-titles/test.py @@ -7,14 +7,14 @@ class FakeResponse(object): def json(self): return { "posts": [ - { "title": 'R.I.P. Ruby on Rails. Thanks for everything.' }, + {"title": 'R.I.P. Ruby on Rails. Thanks for everything.'}, {"title": 'The fraud behind the C.A. of digital certificates is over'}, {"title": 'Manteniendo las raices'}, - {"title":'DF Tech Meetup, ya es una realidad'} + {"title": 'DF Tech Meetup, ya es una realidad'} ] } -@pytest.mark.it("You seem to be returning None or not retuning anything") +@pytest.mark.it("You seem to be returning None or not returning anything") def test_for_null(app): with patch('requests.get') as mock_request: from app import get_titles @@ -30,7 +30,7 @@ def test_return_type(app): tags = get_titles() assert isinstance(tags, list) -@pytest.mark.it("Return a list of post titles like: ['title 1','title 2', 'title 3']") +@pytest.mark.it("Return a list of post titles like: ['title 1', 'title 2', 'title 3']") def test_array_content(app): with patch('requests.get') as mock_request: from app import get_titles diff --git a/exercises/10-get-post-tags/README.es.md b/exercises/10-get-post-tags/README.es.md new file mode 100644 index 0000000..cff0c68 --- /dev/null +++ b/exercises/10-get-post-tags/README.es.md @@ -0,0 +1,14 @@ +# `10` Get post tags + +## 📝 Instrucciones: + +1. Usando el mismo endpoint del ejercicio anterior, crea una función `get_post_tags` que retorne el arreglo de etiquetas (tags) de un `post_id` dado. + +## 💡 Pistas: + ++ Crea la función `get_post_tags`. ++ Obtén todas las publicaciones (post) haciendo la solicitud GET al endpoint. ++ Declare la variable para almacenar el body serializado. ++ Usando el parámetro `post_id`, recorre con un loop todas las publicaciones y compara sus ID para ver si coinciden con el `post_id`. ++ Cuando encuentres la publicación que deseas, devuelve una lista de etiquetas (tags). + diff --git a/exercises/10-get-post-tags/README.md b/exercises/10-get-post-tags/README.md new file mode 100644 index 0000000..6d974a7 --- /dev/null +++ b/exercises/10-get-post-tags/README.md @@ -0,0 +1,14 @@ +# `10` Get post tags + +## 📝 Instructions: + +1. Using the same endpoint from the previous exercise, create a function `get_post_tags` that returns the array of tags of a given `post_id` + +## 💡 Hints: + ++ Create the function `get_post_tags`. ++ GET all the posts by sending a GET request to the endpoint. ++ Declare the variable to store the serialized body ++ Using the `post_id` parameter, loop all the posts and compare their `id`s to see if they match the `post_id`. ++ When you find the post you want, return its list of tags. + diff --git a/exercises/10-get_post_tags/app.py b/exercises/10-get-post-tags/app.py similarity index 80% rename from exercises/10-get_post_tags/app.py rename to exercises/10-get-post-tags/app.py index 0889c24..ff6d142 100644 --- a/exercises/10-get_post_tags/app.py +++ b/exercises/10-get-post-tags/app.py @@ -1,7 +1,7 @@ import requests def get_post_tags(post_id): - # your code here + # Your code here return None diff --git a/exercises/10-get-post-tags/solution.hide.py b/exercises/10-get-post-tags/solution.hide.py new file mode 100644 index 0000000..f97c043 --- /dev/null +++ b/exercises/10-get-post-tags/solution.hide.py @@ -0,0 +1,23 @@ +import requests + +def get_post_tags(post_id): + # Your code here + url = "https://assets.breatheco.de/apis/fake/sample/weird_portfolio.php" + + response = requests.get(url) + + if response.status_code == 200: + # Parsing JSON response + data = response.json() + + # Loop through each post to find the one with matching post_id + for post in data["posts"]: + if post["id"] == post_id: + return post["tags"] + print("No post found") + + else: + print("Failed to fetch data from the endpoint.") + + +print(get_post_tags(146)) \ No newline at end of file diff --git a/exercises/10-get_post_tags/test.py b/exercises/10-get-post-tags/test.py similarity index 100% rename from exercises/10-get_post_tags/test.py rename to exercises/10-get-post-tags/test.py diff --git a/exercises/10-get_post_tags/README.es.md b/exercises/10-get_post_tags/README.es.md deleted file mode 100644 index 3293758..0000000 --- a/exercises/10-get_post_tags/README.es.md +++ /dev/null @@ -1,14 +0,0 @@ -# `10` Obtener etiqueta de publicación - -# 📝 Instrucciones - -Usando el mismo endpoint del ejercicio anterior, crea una función `get_post_tags` que retorne el arreglo de etiquetas (tags) de un `post id` dado. - -## 💡Pista - -1. Crea la función `get_post_tags`. -2. Obtén todas las publicaciones (post) haciendo la solicitud GET al endpoint. -3. Declare la variable para almacenar el body serializado -4. Usando el parámetro `post_id`, recorre con un loop todas las publicaciones y compara sus ID para ver si coinciden con el` post_id`. -3. Cuando encuentres la publicación que deseas, devuelve una lista de etiquetas (tags) - diff --git a/exercises/10-get_post_tags/README.md b/exercises/10-get_post_tags/README.md deleted file mode 100644 index 9529c07..0000000 --- a/exercises/10-get_post_tags/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# `10` Get post tags - -# 📝 Instructions - -Using the same endpoint from the previous exercise, create a function `get_post_tags` that returns the array of tags of a given `post id` - -## 💡Hint - -1. Create the function `get_post_tags`. -2. GET all the posts by doing the GET request to the endpoint. -3. declare the variable to store the serialized body -4. Using the `post_id` parameter loop all the posts and compare their id's to see if they match the `post_id`. -3. When you find the post you want, return it's list of tags - diff --git a/exercises/11-get-attachment-by-id/README.es.md b/exercises/11-get-attachment-by-id/README.es.md new file mode 100644 index 0000000..3b3ce59 --- /dev/null +++ b/exercises/11-get-attachment-by-id/README.es.md @@ -0,0 +1,13 @@ +# `11` Get attachment by id + +## 📝 Instrucciones: + +1. Usando el mismo endpoint del ejercicio anterior, crea una función `get_attachment_by_id` que retorne el título de los archivos adjuntos (attachments) que corresponden con el `id` dado. + +## 💡 Pistas: + ++ Crea la función `get_attachment_by_id` que reciba el `attachment_id` como un parámetro. ++ Recorre con un bucle todos los posts. ++ Recorre con un bucle todos los archivos adjuntos (attachments) de cada post. ++ Si el archivo adjunto (attachment) tiene el `attachment_id` dado en el parámetro de la función, devuélvelo. + diff --git a/exercises/11-get-attachment-by-id/README.md b/exercises/11-get-attachment-by-id/README.md new file mode 100644 index 0000000..5fb34df --- /dev/null +++ b/exercises/11-get-attachment-by-id/README.md @@ -0,0 +1,13 @@ +# `11` Get attachment by id + +## 📝 Instructions: + +1. Using the same endpoint from the previous exercise, create a function `get_attachment_by_id` that returns the title of the attachment that corresponds to the given `id`. + +## 💡 Hints: + ++ Create the function `get_attachment_by_id` that receives the `attachment_id` as a parameter. ++ Loop all the posts. ++ Loop all the `attachments` for each post. ++ If the attachment has the given `attachment_id` in the function parameter, return it. + diff --git a/exercises/11-get_attachment_by_id/app.py b/exercises/11-get-attachment-by-id/app.py similarity index 83% rename from exercises/11-get_attachment_by_id/app.py rename to exercises/11-get-attachment-by-id/app.py index 26274ff..3571d84 100644 --- a/exercises/11-get_attachment_by_id/app.py +++ b/exercises/11-get-attachment-by-id/app.py @@ -1,7 +1,7 @@ import requests def get_attachment_by_id(attachment_id): - # your code here + # Your code here return None print(get_attachment_by_id(137)) \ No newline at end of file diff --git a/exercises/11-get-attachment-by-id/solution.hide.py b/exercises/11-get-attachment-by-id/solution.hide.py new file mode 100644 index 0000000..d09dc7d --- /dev/null +++ b/exercises/11-get-attachment-by-id/solution.hide.py @@ -0,0 +1,25 @@ +import requests + +def get_attachment_by_id(attachment_id): + # Your code here + url = "https://assets.breatheco.de/apis/fake/sample/weird_portfolio.php" + + response = requests.get(url) + + if response.status_code == 200: + # Parsing JSON response + data = response.json() + + for post in data["posts"]: + # Check if the post has attachments + if "attachments" in post: + # Loop through each attachment + for attachment in post["attachments"]: + if attachment["id"] == attachment_id: + return attachment["title"] + + print("No attachment found") + else: + print("Failed to fetch data from the endpoint.") + +print(get_attachment_by_id(137)) \ No newline at end of file diff --git a/exercises/11-get_attachment_by_id/test.py b/exercises/11-get-attachment-by-id/test.py similarity index 63% rename from exercises/11-get_attachment_by_id/test.py rename to exercises/11-get-attachment-by-id/test.py index c413668..739579d 100644 --- a/exercises/11-get_attachment_by_id/test.py +++ b/exercises/11-get-attachment-by-id/test.py @@ -7,15 +7,15 @@ class FakeResponse(object): def json(self): return { "posts": [ - { "attachments": [{ "id": 22, "title": "asd" }] }, - { "attachments": [{ "id": 137, "title": "cert" }] }, - { "attachments": [{ "id": 11, "title": "asd" }] }, - { "attachments": [{ "id": 40, "title": "asd" }] }, - { "attachments": [{ "id": 314, "title": "asd" }] }, + { "attachments": [{ "id": 22, "title": "Invoice" }] }, + { "attachments": [{ "id": 137, "title": "Training Certificate" }] }, + { "attachments": [{ "id": 11, "title": "Presentation Slides" }] }, + { "attachments": [{ "id": 40, "title": "Meeting Agenda" }] }, + { "attachments": [{ "id": 314, "title": "Project Proposal" }] }, ] } -@pytest.mark.it("You seem to be returning None or not retuning anything on the function") +@pytest.mark.it("You seem to be returning None or not returning anything on the function") def test_for_null(app): with patch('requests.get') as mock_request: from app import get_attachment_by_id @@ -23,7 +23,7 @@ def test_for_null(app): att = get_attachment_by_id(137) assert att is not None -@pytest.mark.it("The function should have returned a string (the att title) but returnied something different") +@pytest.mark.it("The function should have returned a string (the attachment title) but returned something different") def test_return_type(app): with patch('requests.get') as mock_request: from app import get_attachment_by_id @@ -37,4 +37,4 @@ def test_array_content(app): from app import get_attachment_by_id mock_request.return_value = FakeResponse() title = get_attachment_by_id(137) - assert title == "cert" + assert title == "Training Certificate" diff --git a/exercises/11-get_attachment_by_id/README.es.md b/exercises/11-get_attachment_by_id/README.es.md deleted file mode 100644 index d7b82c2..0000000 --- a/exercises/11-get_attachment_by_id/README.es.md +++ /dev/null @@ -1,13 +0,0 @@ -# `11` Obtener un archivo adjunto (attachment) por id - -# 📝 Instrucciones - -Usando el mismo endpoint del ejercicio anterior, crea una función `get_attachment_by_id` que retornes el titulo de los adjuntos que correspondan con el id dado. - -## 💡Pista - -1. Crea la función `get_attachment_by_id` que reciba el `attachment_id` como un parametro. -2. Recorre (Loop) todos los posts. -3. Recorre (Loop) todos los attachments (adjuntos) de cada post. -4. Si el archivo adjunto (attachment) tiene el `attach_id` dado en el parámetro de la función, devuélvalo. - diff --git a/exercises/11-get_attachment_by_id/README.md b/exercises/11-get_attachment_by_id/README.md deleted file mode 100644 index 5f3864e..0000000 --- a/exercises/11-get_attachment_by_id/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# `11` Get attachment by id - -# 📝 Instructions - -Using the same endpoint from the previous exercise, create a function `get_attachment_by_id` that returns the title of the attachtment that corresponds to the given id. - -## 💡Hint - -1. Create the function `get_attachment_by_id` that recives the `attachment_id` as a parameter. -2. Loop all the posts. -3. Loop all the attachments for each post. -4. If the attachment has the given `attachment_id` in the function parameter, return it. - diff --git a/exercises/12-post-request/README.es.md b/exercises/12-post-request/README.es.md index fc7a1a7..13db050 100644 --- a/exercises/12-post-request/README.es.md +++ b/exercises/12-post-request/README.es.md @@ -1,8 +1,8 @@ -# `12` Solicitud POST +# `12` POST request -Las solicitudes POST están destinadas a la creación, por ejemplo, si tu negocio es un e-comerce de camisas , es probable que desee tener una forma de agregar nuevos clientes. +Las solicitudes POST están destinadas a la creación, por ejemplo, si tu negocio es un e-commerce de camisetas, es probable que desees tener una forma de agregar nuevos clientes. -Una solicitud de post generalmente tiene: +Una solicitud de POST (*POST request*) generalmente tiene: | | | | ---- | ---- | @@ -10,16 +10,15 @@ Una solicitud de post generalmente tiene: | Content-Type | application/json | | Body (payload) | JSON string | -# 📝 Instrucciones +## 📝 Instrucciones: -Envía una solitud POST al siguiente URL: +1. Envía una solitud POST al siguiente URL: POST: https://assets.breatheco.de/apis/fake/sample/post.php -E imprime la respuesta (text response) en la consolae +2. Imprime la respuesta (response text) en la consola. -## 💡Pista +## 💡 Pista: -Usa el paquete de solicitudes del metodo post: -https://www.w3schools.com/python/ref_requests_post.asp ++ Usa el método POST del paquete *requests*: https://www.w3schools.com/python/ref_requests_post.asp diff --git a/exercises/12-post-request/README.md b/exercises/12-post-request/README.md index fab7e53..7633825 100644 --- a/exercises/12-post-request/README.md +++ b/exercises/12-post-request/README.md @@ -1,8 +1,8 @@ # `12` POST request -POST requests are meant for creation, for example, if your business is an t-shirt e-commerce you probably want to have a way to add new clients. +POST requests are meant for creation, for example, if your business is a t-shirt e-commerce you probably want to have a way to add new clients. -A post request usually have: +A POST request usually has: | | | | ---- | ---- | @@ -10,16 +10,15 @@ A post request usually have: | Content-Type | application/json | | Body (payload) | JSON string | -# 📝 Instructions +## 📝 Instructions: -Send a POST request to the following URL: +1. Send a POST request to the following URL: POST: https://assets.breatheco.de/apis/fake/sample/post.php -And print the response text on the console +2. And print the response text on the console. -## 💡Hint +## 💡 Hint: -Use the requests package post method: -https://www.w3schools.com/python/ref_requests_post.asp ++ Use the requests package POST method: https://www.w3schools.com/python/ref_requests_post.asp diff --git a/exercises/12-post-request/app.py b/exercises/12-post-request/app.py index a471294..0ca5c86 100644 --- a/exercises/12-post-request/app.py +++ b/exercises/12-post-request/app.py @@ -1,3 +1,3 @@ import requests -# your code here \ No newline at end of file +# Your code here \ No newline at end of file diff --git a/exercises/12-post-request/solution.hide.py b/exercises/12-post-request/solution.hide.py new file mode 100644 index 0000000..631052e --- /dev/null +++ b/exercises/12-post-request/solution.hide.py @@ -0,0 +1,8 @@ +import requests + +# Your code here +url = "https://assets.breatheco.de/apis/fake/sample/post.php" + +response = requests.post(url) + +print(response.text) \ No newline at end of file diff --git a/exercises/12-post-request/test.py b/exercises/12-post-request/test.py index 7a5c98d..f49031f 100644 --- a/exercises/12-post-request/test.py +++ b/exercises/12-post-request/test.py @@ -1,7 +1,7 @@ import json, pytest from mock import patch -@pytest.mark.it("POST request to the specified endpoint") +@pytest.mark.it("Make a POST request to the specified endpoint") def test_url(app): with patch('requests.post') as mock_request: app() diff --git a/exercises/13-post-request-body/README.es.md b/exercises/13-post-request-body/README.es.md index bc8505b..4360e54 100644 --- a/exercises/13-post-request-body/README.es.md +++ b/exercises/13-post-request-body/README.es.md @@ -1,24 +1,25 @@ # `13` POST request body -# 📝 Instrucciones +## 📝 Instrucciones: -Envía una solitud POST al siguiente URL: +1. Envía una solitud POST al siguiente URL: + +```text https://assets.breatheco.de/apis/fake/sample/save-project-json.php +``` -Con `Content-Type: application/json` +2. Con `Content-Type: application/json` -Con el siguiente request body como texto JSON: +3. Con el siguiente request body como texto JSON: ```json { - "id":2323, + "id": 2323, "title": "Very big project" } - ``` -## 💡Pista +## 💡 Pista: -Usa el paquete de solicitudes del metodo post: -https://www.w3schools.com/python/ref_requests_post.asp ++ Usa el método POST del paquete *requests*: https://www.w3schools.com/python/ref_requests_post.asp diff --git a/exercises/13-post-request-body/README.md b/exercises/13-post-request-body/README.md index 87bd5c3..1cfa911 100644 --- a/exercises/13-post-request-body/README.md +++ b/exercises/13-post-request-body/README.md @@ -1,24 +1,25 @@ # `13` POST request body -# 📝 Instructions +## 📝 Instructions: -Send a POST request to the following URL: +1. Send a POST request to the following URL: + +```text https://assets.breatheco.de/apis/fake/sample/save-project-json.php +``` -With `Content-Type: application/json` +2. With `Content-Type: application/json` -With the following request body as JSON text: +3. With the following request body as JSON text: ```json { - "id":2323, + "id": 2323, "title": "Very big project" } - ``` -## 💡Hint +## 💡 Hint: -Use the requests package post method: -https://www.w3schools.com/python/ref_requests_post.asp ++ Use the requests package post method: https://www.w3schools.com/python/ref_requests_post.asp diff --git a/exercises/13-post-request-body/app.py b/exercises/13-post-request-body/app.py index 0edc6f1..df545c3 100644 --- a/exercises/13-post-request-body/app.py +++ b/exercises/13-post-request-body/app.py @@ -1,4 +1,4 @@ import requests -resp = requests.post("https://assets.breatheco.de/apis/fake/sample/save-project-json.php") -print(resp.text) \ No newline at end of file +response = requests.post("https://assets.breatheco.de/apis/fake/sample/save-project-json.php") +print(response.text) \ No newline at end of file diff --git a/exercises/13-post-request-body/solution.hide.py b/exercises/13-post-request-body/solution.hide.py new file mode 100644 index 0000000..97ca6d4 --- /dev/null +++ b/exercises/13-post-request-body/solution.hide.py @@ -0,0 +1,18 @@ +import requests + +url = "https://assets.breatheco.de/apis/fake/sample/save-project-json.php" + +data = { + "id": 2323, + "title": "Very big project" +} + +# Setting the headers +headers = { + "Content-Type": "application/json" +} + +# Sending POST request with dictionary data +response = requests.post(url, json=data, headers=headers) + +print(response.text) \ No newline at end of file diff --git a/exercises/13-post-request-body/test.py b/exercises/13-post-request-body/test.py index e296165..df557a9 100644 --- a/exercises/13-post-request-body/test.py +++ b/exercises/13-post-request-body/test.py @@ -1,7 +1,7 @@ import json, pytest from mock import patch -@pytest.mark.it("POST request to the specified endpoint") +@pytest.mark.it("Make a POST request to the specified endpoint") def test_url(app): with patch('requests.post') as mock_request: app() @@ -21,7 +21,7 @@ def test_headers(app): if "content-type" in headers: assert headers["content-type"].lower() == "application/json" -@pytest.mark.it("Request body must be a dictionary json with id and title") +@pytest.mark.it("Request body must be a json object with id and title") def test_body(app): with patch('requests.post') as mock_request: app() From 11c50904cbcc732fc518682f79026fbf80998516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charly=20Chac=C3=B3n?= <107764250+Charlytoc@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:23:46 -0500 Subject: [PATCH 17/33] Update devcontainer.json --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d653790..40a3b24 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -21,7 +21,7 @@ "extensions": ["learn-pack.learnpack-vscode"] } }, - "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@2.1.35 -g && learnpack plugins:install @learnpack/python@1.0.0" + "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@2.1.39 -g && learnpack plugins:install @learnpack/python@1.0.3" // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, From c484f396ea2062b74deabef414ea7bb2ca89d6ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charly=20Chac=C3=B3n?= <107764250+Charlytoc@users.noreply.github.com> Date: Mon, 1 Apr 2024 16:32:23 +0000 Subject: [PATCH 18/33] update to the latest learnpack versions on editor, cli and compiler --- .gitignore | 2 ++ exercises/{01-hello-world => 00-hello-world}/README.es.md | 0 exercises/{01-hello-world => 00-hello-world}/README.md | 0 exercises/01-what-is-a-request/README.es.md | 2 +- exercises/01-what-is-a-request/README.md | 2 +- exercises/01-what-is-a-request/app.py | 1 + learn.json | 4 ++-- 7 files changed, 7 insertions(+), 4 deletions(-) rename exercises/{01-hello-world => 00-hello-world}/README.es.md (100%) rename exercises/{01-hello-world => 00-hello-world}/README.md (100%) diff --git a/.gitignore b/.gitignore index 4598f93..09609ff 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ !/.learn/resets/** !/.learn/assets !/.learn/assets/** + +__pycache_ \ No newline at end of file diff --git a/exercises/01-hello-world/README.es.md b/exercises/00-hello-world/README.es.md similarity index 100% rename from exercises/01-hello-world/README.es.md rename to exercises/00-hello-world/README.es.md diff --git a/exercises/01-hello-world/README.md b/exercises/00-hello-world/README.md similarity index 100% rename from exercises/01-hello-world/README.md rename to exercises/00-hello-world/README.md diff --git a/exercises/01-what-is-a-request/README.es.md b/exercises/01-what-is-a-request/README.es.md index 408b1d2..e959289 100644 --- a/exercises/01-what-is-a-request/README.es.md +++ b/exercises/01-what-is-a-request/README.es.md @@ -1,4 +1,4 @@ -# 02 Creando una solicitud (request) +# 01 Creando una solicitud (request) Python tiene un [paquete de solicitud (requests package)](https://requests.readthedocs.io/en/master/) eso permite a los desarrolladores crear solicitudes HTTP con bastante facilidad. diff --git a/exercises/01-what-is-a-request/README.md b/exercises/01-what-is-a-request/README.md index 413bd2e..7b1fb42 100644 --- a/exercises/01-what-is-a-request/README.md +++ b/exercises/01-what-is-a-request/README.md @@ -1,4 +1,4 @@ -# 02 Creating a request +# 01 Creating a request Python has a [requests package](https://requests.readthedocs.io/en/master/) that allows developers to create HTTP request pretty easily. diff --git a/exercises/01-what-is-a-request/app.py b/exercises/01-what-is-a-request/app.py index de2b192..7b78511 100644 --- a/exercises/01-what-is-a-request/app.py +++ b/exercises/01-what-is-a-request/app.py @@ -1,6 +1,7 @@ import requests url = "https://assets.breatheco.de/apis/fake/sample/404-example.php" +# url = "https://assets.breatheco.de/apis/fake/sample/hello.php" response = requests.get(url) print("The response status is: "+str(response.status_code)) \ No newline at end of file diff --git a/learn.json b/learn.json index 671213e..8a811da 100644 --- a/learn.json +++ b/learn.json @@ -6,7 +6,7 @@ }, "slug": "python-http-requests-api-tutorial-exercises", "description": { - "us": "Learn interactively to consume and create HTTP requests to API's using Python", + "us": "Learn interactively to consume and create HTTP requests to APIs using Python", "es": "Aprende interactivamente cómo consumir APIs y hacer requests HTTP con Python" }, "repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", @@ -19,6 +19,6 @@ "autoPlay": true, "bugsLink": "https://github.com/learnpack/learnpack/issues/new", "editor": { - "version": "3.1.6" + "version": "3.1.23" } } From 855aa8283f63aa116f214d9fb6be74d86df0682b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charly=20Chac=C3=B3n?= <107764250+Charlytoc@users.noreply.github.com> Date: Mon, 1 Apr 2024 14:32:06 -0500 Subject: [PATCH 19/33] Update .gitpod.Dockerfile --- .gitpod.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 8040239..559d593 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -25,4 +25,4 @@ RUN echo "unset DATABASE_URL" >> $HOME/.bashrc RUN echo "export DATABASE_URL" >> $HOME/.bashrc RUN pip3 install pytest==6.2.5 pytest-testdox mock requests toml -RUN npm i @learnpack/learnpack@2.1.20 -g && learnpack plugins:install @learnpack/python@1.0.0 +RUN npm i @learnpack/learnpack@2.1.39 -g && learnpack plugins:install @learnpack/python@1.0.3 From 6c2a1372d70ac90812fcd7e312750aade0ab0b24 Mon Sep 17 00:00:00 2001 From: Jose Mora <109150320+josemoracard@users.noreply.github.com> Date: Fri, 5 Apr 2024 21:20:58 +0200 Subject: [PATCH 20/33] Update README.es.md --- exercises/00-welcome/README.es.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/exercises/00-welcome/README.es.md b/exercises/00-welcome/README.es.md index 9c91a02..7f36107 100644 --- a/exercises/00-welcome/README.es.md +++ b/exercises/00-welcome/README.es.md @@ -4,10 +4,10 @@ Python Requests es el paquete más popular para consumir APIs y hacer solicitude Aquí aprenderás: -1. Cómo hacer solicitudes GET. -2. Cómo obtener propiedades de datos e información. -3. Cómo configurar request headers. -4. Cómo configurar request content-type. -5. Cómo hacer solicitudes POST. +1. ¿Cómo hacer solicitudes GET? +2. ¿Cómo obtener propiedades de datos e información? +3. ¿Cómo configurar request headers? +4. ¿Cómo configurar request content-type? +5. ¿Cómo hacer solicitudes POST? -Haga clic en el botón `Next →` en la esquina superior derecha para continuar. \ No newline at end of file +Haga clic en el botón `Next →` en la esquina superior derecha para continuar. From 546e2a8f388cd7eec74ba0489cd07257b43530a1 Mon Sep 17 00:00:00 2001 From: Jose Mora <109150320+josemoracard@users.noreply.github.com> Date: Fri, 5 Apr 2024 21:21:17 +0200 Subject: [PATCH 21/33] Update README.md --- exercises/00-welcome/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/exercises/00-welcome/README.md b/exercises/00-welcome/README.md index 580410c..c7d23c3 100644 --- a/exercises/00-welcome/README.md +++ b/exercises/00-welcome/README.md @@ -4,10 +4,10 @@ Python Requests is the most popular package for consuming APIs and doing HTTP re Here you will learn: -1. How to do GET requests. -2. How to fetch data properties and information. -3. How to set request headers. -4. How to set request content-type. -5. How to do POST requests. +1. How to do GET requests? +2. How to fetch data properties and information? +3. How to set request headers? +4. How to set request content-type? +5. How to do POST requests? -Click the `Next →` button on the top right to continue. \ No newline at end of file +Click the `Next →` button on the top right to continue. From 0bb603d7d56d0e279f7755aaf05c6a6bd37b08d4 Mon Sep 17 00:00:00 2001 From: josemoracard Date: Mon, 8 Apr 2024 15:41:43 +0000 Subject: [PATCH 22/33] more informative intro, deleted some folders --- exercises/00-hello-world/README.es.md | 13 ------------- exercises/00-hello-world/README.md | 13 ------------- exercises/00-welcome/README.es.md | 4 +++- exercises/00-welcome/README.md | 4 +++- exercises/01-what-is-a-request/README.es.md | 20 -------------------- 5 files changed, 6 insertions(+), 48 deletions(-) delete mode 100644 exercises/00-hello-world/README.es.md delete mode 100644 exercises/00-hello-world/README.md delete mode 100644 exercises/01-what-is-a-request/README.es.md diff --git a/exercises/00-hello-world/README.es.md b/exercises/00-hello-world/README.es.md deleted file mode 100644 index 30f83f8..0000000 --- a/exercises/00-hello-world/README.es.md +++ /dev/null @@ -1,13 +0,0 @@ -# Python API Requests - -Python Requests es el paquete más popular para consumir API y hacer solicitudes HTTP. - -Aquí aprenderás: - -1. Cómo hacer solicitudes GET. -2. Cómo obtener propiedades de una data e información. -3. Cómo configurar request headers. -4. Cómo configurar request content-type. -5. Cómo hacer solicitudes POST. - -Haga click en el botón `next →` en la esquina superior derecha para continuar. \ No newline at end of file diff --git a/exercises/00-hello-world/README.md b/exercises/00-hello-world/README.md deleted file mode 100644 index 3cb9e7e..0000000 --- a/exercises/00-hello-world/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Python API Requests - -Python Requests is the most popular package for consuming API's and doing HTTP requests. - -Here you will learn: - -1. How to do GET requests. -2. How to fech data properties and information. -3. How to set request headers. -4. How to set request content-type. -5. How to do POST requests. - -Click the `next →` button on the top right to continue. \ No newline at end of file diff --git a/exercises/00-welcome/README.es.md b/exercises/00-welcome/README.es.md index 7f36107..51c6c3d 100644 --- a/exercises/00-welcome/README.es.md +++ b/exercises/00-welcome/README.es.md @@ -1,6 +1,8 @@ # `00` Welcome to Python API Requests! -Python Requests es el paquete más popular para consumir APIs y hacer solicitudes HTTP. +Python Requests es una herramienta potente y ampliamente utilizada para interactuar con APIs y realizar solicitudes HTTP en aplicaciones Python. Simplifica el proceso de enviar solicitudes HTTP y manejar respuestas, convirtiéndose en una herramienta favorita entre los desarrolladores para integrarse con servicios web y obtener datos de APIs. + +Con Python Requests, puedes hacer fácilmente solicitudes GET, POST, PUT, DELETE para comunicarte con servidores web y obtener datos. Admite el manejo de autenticación, encabezados, cookies y sesiones, permitiendo una integración sin problemas con diversos servicios web. Aquí aprenderás: diff --git a/exercises/00-welcome/README.md b/exercises/00-welcome/README.md index c7d23c3..14b765e 100644 --- a/exercises/00-welcome/README.md +++ b/exercises/00-welcome/README.md @@ -1,6 +1,8 @@ # `00` Welcome to Python API Requests! -Python Requests is the most popular package for consuming APIs and doing HTTP requests. +Python Requests is a powerful and widely-used package for interacting with APIs and performing HTTP requests in Python applications. It simplifies the process of sending HTTP requests and handling responses, making it a favorite tool among developers for integrating with web services and fetching data from APIs. + +With Python Requests, you can easily make GET, POST, PUT, DELETE, to communicate with web servers and retrieve data. It supports handling authentication, headers, cookies, and sessions, allowing for seamless integration with various web services. Here you will learn: diff --git a/exercises/01-what-is-a-request/README.es.md b/exercises/01-what-is-a-request/README.es.md deleted file mode 100644 index e959289..0000000 --- a/exercises/01-what-is-a-request/README.es.md +++ /dev/null @@ -1,20 +0,0 @@ -# 01 Creando una solicitud (request) - -Python tiene un [paquete de solicitud (requests package)](https://requests.readthedocs.io/en/master/) eso permite a los desarrolladores crear solicitudes HTTP con bastante facilidad. - -Así es como en Python hacemos una solicitud HTTP GET: - -```python -response = requests.get('') -print(response.status_code) -``` - -# 📝 Instrucciones - -Cambie la variable URL para que solicite: - -```bash -https://assets.breatheco.de/apis/fake/sample/hello.php -``` - -Nota: La consola debe imprimir un código de estado 200. \ No newline at end of file From 0734258185e6adfc33382bc4bb90bb02be8a7a84 Mon Sep 17 00:00:00 2001 From: Tomas Gonzalez <56565994+tommygonzaleza@users.noreply.github.com> Date: Mon, 22 Apr 2024 17:34:34 -0400 Subject: [PATCH 23/33] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4848bb7..7813c64 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Each exercise is a small react application containing the following files: 2. **README.md:** contains exercise instructions. 3. **test.py:** you don't have to open this file, it contains the testing script for the exercise. -> Note: The exercises have automatic grading, but it's very rigid and strict, my recommendation is to not take the tests too serious and use them only as a suggestion, or you may get frustrated. +> Note: The exercises have automatic grading, but they're very rigid and strict, my recommendation is to not take the tests too serious and use them only as a suggestion, or you may get frustrated. ## Contributors From d25b7ac05934fbb1ce6cb3de782b32b9e6bd7622 Mon Sep 17 00:00:00 2001 From: Charlytoc Date: Tue, 23 Apr 2024 19:23:21 -0500 Subject: [PATCH 24/33] Update with new version of editor and cli --- .devcontainer/devcontainer.json | 3 ++- learn.json | 48 ++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 40a3b24..5893446 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,3 +1,4 @@ + // For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/python { @@ -21,7 +22,7 @@ "extensions": ["learn-pack.learnpack-vscode"] } }, - "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@2.1.39 -g && learnpack plugins:install @learnpack/python@1.0.3" + "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@2.1.50 -g && learnpack plugins:install @learnpack/python@1.0.3" // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, diff --git a/learn.json b/learn.json index 8a811da..f8332ce 100644 --- a/learn.json +++ b/learn.json @@ -1,24 +1,28 @@ + { - "language": "python", - "title": { - "us": "Learn how to build HTTP requests with Python", - "es": "Aprende a hacer requests HTTP con Python" - }, - "slug": "python-http-requests-api-tutorial-exercises", - "description": { - "us": "Learn interactively to consume and create HTTP requests to APIs using Python", - "es": "Aprende interactivamente cómo consumir APIs y hacer requests HTTP con Python" - }, - "repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", - "duration": 4, - "videoSolutions": false, - "difficulty": "easy", - "preview": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises/blob/master/preview.png?raw=true", - "repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", - "projectType": "tutorial", - "autoPlay": true, - "bugsLink": "https://github.com/learnpack/learnpack/issues/new", - "editor": { - "version": "3.1.23" - } +"language": "python", +"title": { + "us": "Learn how to build HTTP requests with Python", + "es": "Aprende a hacer requests HTTP con Python" +}, +"slug": "python-http-requests-api-tutorial-exercises", +"description": { + "us": "Learn interactively to consume and create HTTP requests to APIs using Python", + "es": "Aprende interactivamente cómo consumir APIs y hacer requests HTTP con Python" +}, +"repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", +"duration": 4, +"videoSolutions": false, +"difficulty": "easy", +"preview": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises/blob/master/preview.png?raw=true", +"repository": "https://github.com/4GeeksAcademy/python-http-requests-api-tutorial-exercises", +"projectType": "tutorial", +"autoPlay": true, +"bugsLink": "https://github.com/learnpack/learnpack/issues/new", +"editor": { + "version": "3.1.36" +}, +"telemetry": { + "batch": "https://breathecode.herokuapp.com/v1/assignment/me/telemetry" +} } From 29ece1c63e589ac40be082b00c3c33ac249ab523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charly=20Chac=C3=B3n?= <107764250+Charlytoc@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:36:18 -0500 Subject: [PATCH 25/33] Update learn.json --- learn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/learn.json b/learn.json index f8332ce..69b7008 100644 --- a/learn.json +++ b/learn.json @@ -20,7 +20,7 @@ "autoPlay": true, "bugsLink": "https://github.com/learnpack/learnpack/issues/new", "editor": { - "version": "3.1.36" + "version": "3.1.40" }, "telemetry": { "batch": "https://breathecode.herokuapp.com/v1/assignment/me/telemetry" From fbb17237f1fc1e4e3dd63e57205612dc353541a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charly=20Chac=C3=B3n?= <107764250+Charlytoc@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:36:30 -0500 Subject: [PATCH 26/33] Update devcontainer.json --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 5893446..b45da3d 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -22,7 +22,7 @@ "extensions": ["learn-pack.learnpack-vscode"] } }, - "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@2.1.50 -g && learnpack plugins:install @learnpack/python@1.0.3" + "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@2.1.56 -g && learnpack plugins:install @learnpack/python@1.0.3" // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, From e9b65012fbb2598c1007ac724958b5b8f0bacbdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charly=20Chac=C3=B3n?= <107764250+Charlytoc@users.noreply.github.com> Date: Thu, 26 Sep 2024 19:28:09 +0000 Subject: [PATCH 27/33] Add spanish videos and update pacakges --- .devcontainer/devcontainer.json | 2 +- exercises/00-welcome/README.es.md | 4 ++++ exercises/01-creating-a-request/README.es.md | 4 ++++ exercises/02-random-status/README.es.md | 4 ++++ exercises/03-response-body/README.es.md | 4 ++++ exercises/04-response-body-json/README.es.md | 4 ++++ exercises/05-project-name/README.es.md | 5 +++++ exercises/06-project-list/README.es.md | 4 ++++ exercises/07-project-list-image/README.es.md | 4 ++++ exercises/08-blog-post-author/README.es.md | 4 ++++ exercises/09-list-of-blog-titles/README.es.md | 4 ++++ exercises/10-get-post-tags/README.es.md | 4 ++++ exercises/11-get-attachment-by-id/README.es.md | 4 ++++ exercises/12-post-request/README.es.md | 4 ++++ exercises/13-post-request-body/README.es.md | 4 ++++ learn.json | 2 +- 16 files changed, 59 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b45da3d..15aec97 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -22,7 +22,7 @@ "extensions": ["learn-pack.learnpack-vscode"] } }, - "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@2.1.56 -g && learnpack plugins:install @learnpack/python@1.0.3" + "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@4.0.8 -g && learnpack plugins:install @learnpack/python@1.0.3" // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, diff --git a/exercises/00-welcome/README.es.md b/exercises/00-welcome/README.es.md index 51c6c3d..2f7fe62 100644 --- a/exercises/00-welcome/README.es.md +++ b/exercises/00-welcome/README.es.md @@ -1,3 +1,7 @@ +--- +intro: "https://www.youtube.com/watch?v=6H4Gn6-lpLI" +--- + # `00` Welcome to Python API Requests! Python Requests es una herramienta potente y ampliamente utilizada para interactuar con APIs y realizar solicitudes HTTP en aplicaciones Python. Simplifica el proceso de enviar solicitudes HTTP y manejar respuestas, convirtiéndose en una herramienta favorita entre los desarrolladores para integrarse con servicios web y obtener datos de APIs. diff --git a/exercises/01-creating-a-request/README.es.md b/exercises/01-creating-a-request/README.es.md index 652d819..45431b5 100644 --- a/exercises/01-creating-a-request/README.es.md +++ b/exercises/01-creating-a-request/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=eZ_5p3vyYFY" +--- + # `01` Creating a Request Python tiene integrado un [paquete de solicitudes (*requests package*)](https://requests.readthedocs.io/en/master/) eso permite a los desarrolladores crear solicitudes HTTP con bastante facilidad. diff --git a/exercises/02-random-status/README.es.md b/exercises/02-random-status/README.es.md index e670821..0e9cbac 100644 --- a/exercises/02-random-status/README.es.md +++ b/exercises/02-random-status/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=La95dYo4xOs" +--- + # `02` Handle Response Status La siguiente solicitud GET siempre devuelve un código de status diferente, nunca se sabe qué respuesta está recibiendo del servidor. diff --git a/exercises/03-response-body/README.es.md b/exercises/03-response-body/README.es.md index 348bb72..325cd31 100644 --- a/exercises/03-response-body/README.es.md +++ b/exercises/03-response-body/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=kQGUUW4ycDQ" +--- + # `03` Response Body Haga clic en este enlace para ver la respuesta que esta solicitud GET está dando en el body: diff --git a/exercises/04-response-body-json/README.es.md b/exercises/04-response-body-json/README.es.md index 600a412..9e17bda 100644 --- a/exercises/04-response-body-json/README.es.md +++ b/exercises/04-response-body-json/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=si3N6peHdjM" +--- + # `04` Response JSON Pero tener una respuesta basada en texto no es muy útil, es por eso que las API normalmente responden en formato CSV, JSON, YAML o XML. diff --git a/exercises/05-project-name/README.es.md b/exercises/05-project-name/README.es.md index 002f6e1..8d98378 100644 --- a/exercises/05-project-name/README.es.md +++ b/exercises/05-project-name/README.es.md @@ -1,3 +1,8 @@ +--- +tutorial: "https://www.youtube.com/watch?v=sMA0NjIiVNs" +--- + + # `05` Project name El siguiente endpoint es ideal para recuperar proyectos de estudiantes: diff --git a/exercises/06-project-list/README.es.md b/exercises/06-project-list/README.es.md index d54db13..78b786c 100644 --- a/exercises/06-project-list/README.es.md +++ b/exercises/06-project-list/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=S2qXbTLRyGA" +--- + # `06` Project List El siguiente endpoint devuelve una respuesta en formato JSON con varios proyectos en una lista: diff --git a/exercises/07-project-list-image/README.es.md b/exercises/07-project-list-image/README.es.md index d155f02..31e2c31 100644 --- a/exercises/07-project-list-image/README.es.md +++ b/exercises/07-project-list-image/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=U7vhqOETpqk" +--- + # `07` Project List Image ## 📝 Instrucciones: diff --git a/exercises/08-blog-post-author/README.es.md b/exercises/08-blog-post-author/README.es.md index 46037b0..223fa48 100644 --- a/exercises/08-blog-post-author/README.es.md +++ b/exercises/08-blog-post-author/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=NZMkq0cIIlU" +--- + # `08` Post blog author Tómate un momento para comprender el response body al hacer una solicitud GET a este endpoint: diff --git a/exercises/09-list-of-blog-titles/README.es.md b/exercises/09-list-of-blog-titles/README.es.md index 496528f..bb62401 100644 --- a/exercises/09-list-of-blog-titles/README.es.md +++ b/exercises/09-list-of-blog-titles/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=SWgyGk3d3yk" +--- + # `09` List of blog titles ## 📝 Instrucciones: diff --git a/exercises/10-get-post-tags/README.es.md b/exercises/10-get-post-tags/README.es.md index cff0c68..aa00ec5 100644 --- a/exercises/10-get-post-tags/README.es.md +++ b/exercises/10-get-post-tags/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=l9e-lSsYNOI" +--- + # `10` Get post tags ## 📝 Instrucciones: diff --git a/exercises/11-get-attachment-by-id/README.es.md b/exercises/11-get-attachment-by-id/README.es.md index 3b3ce59..b3cb472 100644 --- a/exercises/11-get-attachment-by-id/README.es.md +++ b/exercises/11-get-attachment-by-id/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=TR0PYXJUEPY" +--- + # `11` Get attachment by id ## 📝 Instrucciones: diff --git a/exercises/12-post-request/README.es.md b/exercises/12-post-request/README.es.md index 13db050..5710393 100644 --- a/exercises/12-post-request/README.es.md +++ b/exercises/12-post-request/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=1WsxHQ-_E1w" +--- + # `12` POST request Las solicitudes POST están destinadas a la creación, por ejemplo, si tu negocio es un e-commerce de camisetas, es probable que desees tener una forma de agregar nuevos clientes. diff --git a/exercises/13-post-request-body/README.es.md b/exercises/13-post-request-body/README.es.md index 4360e54..87157b7 100644 --- a/exercises/13-post-request-body/README.es.md +++ b/exercises/13-post-request-body/README.es.md @@ -1,3 +1,7 @@ +--- +tutorial: "https://www.youtube.com/watch?v=x5k6pOmxmWc" +--- + # `13` POST request body ## 📝 Instrucciones: diff --git a/learn.json b/learn.json index 69b7008..6d2243d 100644 --- a/learn.json +++ b/learn.json @@ -20,7 +20,7 @@ "autoPlay": true, "bugsLink": "https://github.com/learnpack/learnpack/issues/new", "editor": { - "version": "3.1.40" + "version": "4.0.10" }, "telemetry": { "batch": "https://breathecode.herokuapp.com/v1/assignment/me/telemetry" From 5792b06cdae7f7ceb8f6810194e33a27f213273c Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Fri, 15 Nov 2024 14:32:23 -0500 Subject: [PATCH 28/33] Update learn.json --- learn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/learn.json b/learn.json index 6d2243d..216c050 100644 --- a/learn.json +++ b/learn.json @@ -20,7 +20,7 @@ "autoPlay": true, "bugsLink": "https://github.com/learnpack/learnpack/issues/new", "editor": { - "version": "4.0.10" + "version": "4.0" }, "telemetry": { "batch": "https://breathecode.herokuapp.com/v1/assignment/me/telemetry" From 1674dbf32a81ac06ea7235da21c672ce67afec20 Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Wed, 15 Jan 2025 14:44:22 -0500 Subject: [PATCH 29/33] Update learn.json --- learn.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/learn.json b/learn.json index 216c050..031c69c 100644 --- a/learn.json +++ b/learn.json @@ -20,9 +20,9 @@ "autoPlay": true, "bugsLink": "https://github.com/learnpack/learnpack/issues/new", "editor": { - "version": "4.0" + "version": "5.0" }, "telemetry": { - "batch": "https://breathecode.herokuapp.com/v1/assignment/me/telemetry" + "batch": "https://breathecode.herokuapp.com/v1/assignment/me/telemetry?asset_id=1111" } } From cb39361d6afcd186a4a16bd38375070250662ac8 Mon Sep 17 00:00:00 2001 From: Alejandro Sanchez Date: Wed, 15 Jan 2025 14:44:38 -0500 Subject: [PATCH 30/33] Update devcontainer.json --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 15aec97..57fc02d 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -22,7 +22,7 @@ "extensions": ["learn-pack.learnpack-vscode"] } }, - "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@4.0.8 -g && learnpack plugins:install @learnpack/python@1.0.3" + "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@5.0.7 -g && learnpack plugins:install @learnpack/python@1.0.3" // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, From 0bab0608b6885a935bfa598326747490ee8e9617 Mon Sep 17 00:00:00 2001 From: lorenagubaira <102861577+Lorenagubaira@users.noreply.github.com> Date: Mon, 27 Jan 2025 20:29:40 -0400 Subject: [PATCH 31/33] Update devcontainer.json --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 57fc02d..633d5f8 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -22,7 +22,7 @@ "extensions": ["learn-pack.learnpack-vscode"] } }, - "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@5.0.7 -g && learnpack plugins:install @learnpack/python@1.0.3" + "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@5.0.13 -g && learnpack plugins:install @learnpack/python@1.0.6" // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, From 9ea60a262333984a012682c1045fd71b3d2344c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charly=20Chac=C3=B3n?= <107764250+Charlytoc@users.noreply.github.com> Date: Sat, 1 Feb 2025 07:32:43 -0500 Subject: [PATCH 32/33] Update devcontainer.json --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 633d5f8..be8e469 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -22,7 +22,7 @@ "extensions": ["learn-pack.learnpack-vscode"] } }, - "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@5.0.13 -g && learnpack plugins:install @learnpack/python@1.0.6" + "onCreateCommand": "pip3 install pytest==6.2.5 pytest-testdox mock toml requests && npm i @learnpack/learnpack@5.0.19 -g && learnpack plugins:install @learnpack/python@1.0.6" // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, From f90a785f2d248c29bf0fe9b35c392c53be8d805b Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Fri, 28 Feb 2025 21:46:32 +0000 Subject: [PATCH 33/33] Update workflow files --- .github/workflows/learnpack-audit.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/learnpack-audit.yml b/.github/workflows/learnpack-audit.yml index 52644d8..95814c2 100644 --- a/.github/workflows/learnpack-audit.yml +++ b/.github/workflows/learnpack-audit.yml @@ -5,9 +5,9 @@ name: Learnpack audit on: push: - branches: [ master ] + branches: [ main ] pull_request: - branches: [ master ] + branches: [ main ] jobs: build: @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [14.x] + node-version: [20.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: