init
This commit is contained in:
commit
b56019c694
25 changed files with 456 additions and 0 deletions
0
.gitignore
vendored
Normal file
0
.gitignore
vendored
Normal file
10
.idea/TP1_R410.iml
Normal file
10
.idea/TP1_R410.iml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
6
.idea/inspectionProfiles/Project_Default.xml
Normal file
6
.idea/inspectionProfiles/Project_Default.xml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||||
|
</profile>
|
||||||
|
</component>
|
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
4
.idea/misc.xml
Normal file
4
.idea/misc.xml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (TP1_R410)" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/TP1_R410.iml" filepath="$PROJECT_DIR$/.idea/TP1_R410.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
49
.idea/workspace.xml
Normal file
49
.idea/workspace.xml
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="1cc00508-2e42-4ce9-abae-08155c1c5500" name="Changes" comment="" />
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectColorInfo"><![CDATA[{
|
||||||
|
"associatedIndex": 3
|
||||||
|
}]]></component>
|
||||||
|
<component name="ProjectId" id="2dwWhX1OxNoO33O0CVQTMaL4hje" />
|
||||||
|
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
|
"keyToString": {
|
||||||
|
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||||
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
|
"git-widget-placeholder": "main",
|
||||||
|
"nodejs_package_manager_path": "npm",
|
||||||
|
"vue.rearranger.settings.migration": "true"
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="SharedIndexes">
|
||||||
|
<attachedChunks>
|
||||||
|
<set>
|
||||||
|
<option value="bundled-python-sdk-5a2391486177-2887949eec09-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-233.13763.11" />
|
||||||
|
</set>
|
||||||
|
</attachedChunks>
|
||||||
|
</component>
|
||||||
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="Default task">
|
||||||
|
<changelist id="1cc00508-2e42-4ce9-abae-08155c1c5500" name="Changes" comment="" />
|
||||||
|
<created>1710919740613</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1710919740613</updated>
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
</project>
|
0
PROJET.md
Normal file
0
PROJET.md
Normal file
11
athlete/Dockerfile
Normal file
11
athlete/Dockerfile
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
FROM python:alpine3.19
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY /requirements.txt requirements.txt
|
||||||
|
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
CMD ["python", "app.py"]
|
25
athlete/app.py
Normal file
25
athlete/app.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
from flask import Flask, jsonify
|
||||||
|
import athlete
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route('/ping', methods=["GET"])
|
||||||
|
def ping():
|
||||||
|
return jsonify({"message": "pong"}), 200
|
||||||
|
@app.route('/', methods=["GET"])
|
||||||
|
def hello_world():
|
||||||
|
return jsonify(athlete.Athlete(
|
||||||
|
id=1,
|
||||||
|
prenom="john",
|
||||||
|
nom="doe",
|
||||||
|
pays="France",
|
||||||
|
sexe="Homme",
|
||||||
|
image="localhost",
|
||||||
|
disciplines=[123],
|
||||||
|
).model_dump())
|
||||||
|
|
||||||
|
def create_app():
|
||||||
|
return app
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run()
|
15
athlete/athlete.py
Normal file
15
athlete/athlete.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from pydantic import BaseModel
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
class Athlete(BaseModel):
|
||||||
|
"""
|
||||||
|
Modèle Athlète
|
||||||
|
"""
|
||||||
|
id: Optional[int]
|
||||||
|
prenom: str
|
||||||
|
nom: str
|
||||||
|
pays: str
|
||||||
|
sexe: str = "N/A"
|
||||||
|
image: str = "https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_640.png"
|
||||||
|
disciplines: Optional[list[int]] = None
|
||||||
|
records: Optional[list[int]] = None
|
24
athlete/conftest.py
Normal file
24
athlete/conftest.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import pytest
|
||||||
|
from ..app.app import create_app
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def app():
|
||||||
|
app = create_app()
|
||||||
|
app.config.update({
|
||||||
|
"TESTING": True,
|
||||||
|
})
|
||||||
|
|
||||||
|
# other setup can go here
|
||||||
|
|
||||||
|
yield app
|
||||||
|
|
||||||
|
# clean up / reset resources here
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def client(app):
|
||||||
|
return app.test_client()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def runner(app):
|
||||||
|
return app.test_cli_runner()
|
0
athlete/genData.py
Normal file
0
athlete/genData.py
Normal file
161
athlete/static/swagger.yaml
Normal file
161
athlete/static/swagger.yaml
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
openapi: 3.0.1
|
||||||
|
info:
|
||||||
|
title: API Joueurs des J.O. 2024
|
||||||
|
description: |-
|
||||||
|
Cette API uService sert à afficher les informations sur les joueurs des JO 2024.
|
||||||
|
version: 0.0.1
|
||||||
|
servers:
|
||||||
|
- url: /joueurs/
|
||||||
|
tags:
|
||||||
|
- name: athlete
|
||||||
|
description: Joueur des J.O.
|
||||||
|
paths:
|
||||||
|
/:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- athlete
|
||||||
|
parameters:
|
||||||
|
- in: query
|
||||||
|
name: offset
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: Le nombre d'éléments à ignorer avant de commencer à collecter l'ensemble de résultats
|
||||||
|
- in: query
|
||||||
|
name: limit
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: Le nombre d'éléments à ignorer
|
||||||
|
summary: Liste l'ensemble des athlètes
|
||||||
|
description: Affiche la liste des athlètes enregistrés sur les J.O. 2024.
|
||||||
|
operationId: listeAthletes
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Athlète
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/Athlete'
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- athlete
|
||||||
|
summary: Créer un athlète
|
||||||
|
operationId: createAthelte
|
||||||
|
requestBody:
|
||||||
|
description: Objet athlète a créer
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Athlete'
|
||||||
|
responses:
|
||||||
|
default:
|
||||||
|
description: Opération avec succès
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Athlete'
|
||||||
|
/{id}:
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
description: ID de l'Athlète à récupérer
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- athlete
|
||||||
|
summary: Récupération d'un athlète selon son id
|
||||||
|
operationId: getAthlete
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Opération avec succès
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Athlete'
|
||||||
|
'400':
|
||||||
|
description: ID donné invalide
|
||||||
|
'404':
|
||||||
|
description: Athlète introuvable
|
||||||
|
patch:
|
||||||
|
tags:
|
||||||
|
- athlete
|
||||||
|
summary: Mettre à jour un athlète
|
||||||
|
operationId: updateAthlete
|
||||||
|
requestBody:
|
||||||
|
description: Mettre à jour un athlète existant
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Athlete'
|
||||||
|
responses:
|
||||||
|
default:
|
||||||
|
description: Opération avec succès
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- athlete
|
||||||
|
summary: Supprimer un athlète
|
||||||
|
operationId: deleteAthlete
|
||||||
|
responses:
|
||||||
|
'400':
|
||||||
|
description: ID donné invalide
|
||||||
|
'404':
|
||||||
|
description: Athlète introuvable
|
||||||
|
/ping:
|
||||||
|
get:
|
||||||
|
summary: Vérifier la disponibilité du service
|
||||||
|
operationId: ping
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Service disponible
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
example: pong
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
Athlete:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: uuid
|
||||||
|
example: 123456789
|
||||||
|
prenom:
|
||||||
|
type: string
|
||||||
|
example: Teddy
|
||||||
|
nom:
|
||||||
|
type: string
|
||||||
|
example: Rinner
|
||||||
|
pays:
|
||||||
|
type: string
|
||||||
|
example: France
|
||||||
|
sexe:
|
||||||
|
type: string
|
||||||
|
example: Homme
|
||||||
|
image:
|
||||||
|
type: string
|
||||||
|
example: http://www.humanite.fr/wp-content/uploads/2023/05/311202.hr_.jpg?w=1024
|
||||||
|
disciplines:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: integer
|
||||||
|
example: 1235
|
||||||
|
records:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: integer
|
||||||
|
example: 1235
|
||||||
|
requestBodies:
|
||||||
|
User:
|
||||||
|
description: Objet athlète à ajouter
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Athlete'
|
38
athlete/tests/athletes.json
Normal file
38
athlete/tests/athletes.json
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"prenom": "Riner",
|
||||||
|
"nom": "Teddy",
|
||||||
|
"pays": "France",
|
||||||
|
"sexe": "H",
|
||||||
|
"image": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Teddy_Riner_2012.jpg",
|
||||||
|
"disciplines": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"records": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"prenom": "Flessel",
|
||||||
|
"nom": "Laura",
|
||||||
|
"pays": "France",
|
||||||
|
"sexe": "H",
|
||||||
|
"image": "https://plusquedusport.files.wordpress.com/2012/04/124936207sl015_laura_flesse.jpg",
|
||||||
|
"disciplines": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"records": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"prenom": "Monfils",
|
||||||
|
"nom": "Ga\u00ebl",
|
||||||
|
"pays": "France",
|
||||||
|
"sexe": "H",
|
||||||
|
"image": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Monfils_RG19_%2813%29_%2848199149362%29.jpg/1200px-Monfils_RG19_%2813%29_%2848199149362%29.jpg",
|
||||||
|
"disciplines": [
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"records": []
|
||||||
|
}
|
||||||
|
]
|
8
athlete/tests/test_getAthlete.py
Normal file
8
athlete/tests/test_getAthlete.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class MyTestCase(unittest.TestCase):
|
||||||
|
def test_something(self):
|
||||||
|
self.assertEqual(True, False) # add assertion here
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
0
athlete/tests/test_listeAthlete.py
Normal file
0
athlete/tests/test_listeAthlete.py
Normal file
5
athlete/tests/test_ping.py
Normal file
5
athlete/tests/test_ping.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
def test_ping(client):
|
||||||
|
response = client.get("/ping")
|
||||||
|
assert b"{\"message\":\"pong\"}\n" in response.data
|
38
data/athletes.json
Normal file
38
data/athletes.json
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"prenom": "Riner",
|
||||||
|
"nom": "Teddy",
|
||||||
|
"pays": "France",
|
||||||
|
"sexe": "H",
|
||||||
|
"image": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Teddy_Riner_2012.jpg",
|
||||||
|
"disciplines": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"records": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"prenom": "Flessel",
|
||||||
|
"nom": "Laura",
|
||||||
|
"pays": "France",
|
||||||
|
"sexe": "H",
|
||||||
|
"image": "https://plusquedusport.files.wordpress.com/2012/04/124936207sl015_laura_flesse.jpg",
|
||||||
|
"disciplines": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"records": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"prenom": "Monfils",
|
||||||
|
"nom": "Ga\u00ebl",
|
||||||
|
"pays": "France",
|
||||||
|
"sexe": "H",
|
||||||
|
"image": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Monfils_RG19_%2813%29_%2848199149362%29.jpg/1200px-Monfils_RG19_%2813%29_%2848199149362%29.jpg",
|
||||||
|
"disciplines": [
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"records": []
|
||||||
|
}
|
||||||
|
]
|
0
discipline/swagger.yaml
Normal file
0
discipline/swagger.yaml
Normal file
0
docker-compose.yaml
Normal file
0
docker-compose.yaml
Normal file
0
medaille/swagger.yaml
Normal file
0
medaille/swagger.yaml
Normal file
4
requirements.txt
Normal file
4
requirements.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
flask==3.0.2
|
||||||
|
pydantic==2.6.4
|
||||||
|
pytest
|
||||||
|
flask_swagger_ui
|
38
sample/athletes.json
Normal file
38
sample/athletes.json
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"prenom": "Riner",
|
||||||
|
"nom": "Teddy",
|
||||||
|
"pays": "France",
|
||||||
|
"sexe": "H",
|
||||||
|
"image": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Teddy_Riner_2012.jpg",
|
||||||
|
"disciplines": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"records": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"prenom": "Flessel",
|
||||||
|
"nom": "Laura",
|
||||||
|
"pays": "France",
|
||||||
|
"sexe": "H",
|
||||||
|
"image": "https://plusquedusport.files.wordpress.com/2012/04/124936207sl015_laura_flesse.jpg",
|
||||||
|
"disciplines": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"records": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"prenom": "Monfils",
|
||||||
|
"nom": "Ga\u00ebl",
|
||||||
|
"pays": "France",
|
||||||
|
"sexe": "H",
|
||||||
|
"image": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Monfils_RG19_%2813%29_%2848199149362%29.jpg/1200px-Monfils_RG19_%2813%29_%2848199149362%29.jpg",
|
||||||
|
"disciplines": [
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"records": []
|
||||||
|
}
|
||||||
|
]
|
Loading…
Reference in a new issue