Skip to content

Commit

Permalink
Mise à jour serveur v2.0.6
Browse files Browse the repository at this point in the history
  • Loading branch information
julienmalard committed Jun 26, 2024
1 parent 76ef3d7 commit f7b3183
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 129 deletions.
4 changes: 1 addition & 3 deletions constellationPy/const.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
# La version minimale de @constl/serveur (paquet npm) compatible avec le client Python
V_SERVEUR_NÉCESSAIRE = "^2.0.0"
V_IPA_NÉCESSAIRE = "^1.0.24"
V_SERVEUR_NÉCESSAIRE = "^2.0.6"

# La commande pour lancer Constellation de la ligne de commande
EXE_CONSTL = "constl"

# Les paquets npm Constellation
PAQUET_SERVEUR = "@constl/serveur"
PAQUET_IPA = "@constl/ipa"

# Le lien pour signaler des problèmes avec le logiciel Constellation
LIEN_SIGNALEMENT_ERREURS = "https://github.com/reseau-constellation/serveur-ws/issues"
125 changes: 17 additions & 108 deletions constellationPy/serveur.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@
import urllib3
from semantic_version import SimpleSpec, Version

from .const import V_SERVEUR_NÉCESSAIRE, V_IPA_NÉCESSAIRE, PAQUET_SERVEUR, PAQUET_IPA, EXE_CONSTL
from .const import V_SERVEUR_NÉCESSAIRE, PAQUET_SERVEUR, EXE_CONSTL

TypeExe = Union[str, List[str]]
versions_serveur_compatibles = SimpleSpec(V_SERVEUR_NÉCESSAIRE)
versions_ipa_compatibles = SimpleSpec(V_IPA_NÉCESSAIRE)


class ErreurInstallationConstellation(ChildProcessError):
Expand Down Expand Up @@ -87,9 +86,11 @@ def effacer_contexte():
def obtenir_contexte() -> type_contexte:
return context


def obtenir_port_contexte() -> Optional[str]:
return obtenir_contexte()["port_serveur"]


def obtenir_code_secret_contexte() -> Optional[str]:
return obtenir_contexte()["code_secret"]

Expand All @@ -99,7 +100,6 @@ def mettre_constellation_à_jour(exe: TypeExe = EXE_CONSTL):
assurer_npm_pnpm_installés()

mettre_serveur_à_jour(exe)
mettre_ipa_à_jour(exe)


def mettre_serveur_à_jour(exe: TypeExe = EXE_CONSTL):
Expand All @@ -114,14 +114,8 @@ def mettre_serveur_à_jour(exe: TypeExe = EXE_CONSTL):


def obt_version_serveur(exe: TypeExe = EXE_CONSTL) -> Optional[Version]:
try:
if v := _obt_version(exe, "version"):
return Version(v)
except ChildProcessError as é:
if f"Error: Cannot find module '{PAQUET_IPA}'" in str(é):
return
else:
raise é
if v := _obt_version(exe, "version"):
return Version(v)


def serveur_compatible(version: Version) -> bool:
Expand Down Expand Up @@ -168,57 +162,24 @@ def _obt_version(commande: TypeExe, arg="-v") -> Optional[str]:


def installer_serveur(version: Version):
installer_de_pnpm(PAQUET_SERVEUR, version)


def mettre_ipa_à_jour(exe: TypeExe = EXE_CONSTL):
# Si @constl/ipa n'est pas installée, installer @constl/ipa et obtenir versions compatibles avec serveur
ipa_installée = ipa_est_installée(exe)
if not ipa_installée:
logging.debug("Installation de l'IPA de Constellation")
installer_ipa()
logging.debug("Constellation installée")
assurer_npm_pnpm_installés()

# Obtenir versions ipa compatibles avec serveur
version_ipa = obt_version_ipa(exe)
code_installation = subprocess.Popen(
["curl", "https://raw.githubusercontent.com/reseau-constellation/serveur-ws/principale/installer.cjs"],
stdout=subprocess.PIPE,
)
résultat = subprocess.Popen(["node", "-"], stdin=code_installation.stdout)
code_installation.stdout.close()
résultat.communicate()

try:
version_ipa_désirée = obt_version_ipa_plus_récente_compatible(exe, version_ipa)
except StopIteration:
raise ErreurInstallationConstellation(
"Aucune version de @constl/ipa compatible n'a pu être détectée. "
"Essayez de réinstaller manuellement avec :\n "
"`pnpm add -g @constl/ipa@latest @constl/serveur@latest`"
if résultat.returncode != 0:
raise ConnectionError(
f"Erreur d'installation Constellation :\n\t{résultat.stderr.decode()}"
f"\n\t{résultat.stdout.decode()}"
)

# Installer @constl/ipa à la version la plus récente compatible avec le serveur
if version_ipa != version_ipa_désirée:
logging.debug(f"Mise à jour de l'IPA de Constellation (courante: {version_ipa}, désirée: {version_ipa_désirée})")
installer_ipa(version_ipa_désirée)


def ipa_est_installée(exe: TypeExe = EXE_CONSTL) -> bool:
try:
return _obt_version(exe, "version") is not None
except ChildProcessError as é:
if "ERR_MODULE_NOT_FOUND" in str(é) and PAQUET_IPA in str(é):
return False
else:
raise é


def installer_ipa(version: Union[Version, SimpleSpec, str] = "latest"):
installer_de_pnpm(PAQUET_IPA, version)


def désinstaller_constellation():
try:
désinstaller_ipa()
except ConnectionError as é:
if "This module isn't specified in a package.json file." in str(é):
pass
else:
raise é
try:
désinstaller_serveur()
except ConnectionError as é:
Expand All @@ -228,30 +189,10 @@ def désinstaller_constellation():
raise é


def désinstaller_ipa():
désinstaller_de_pnpm(PAQUET_IPA)


def désinstaller_serveur():
désinstaller_de_pnpm(PAQUET_SERVEUR)


def obt_version_ipa_plus_récente_compatible(exe: TypeExe = EXE_CONSTL, présente: Optional[Version] = None) -> Version:
versions_disponibles = obt_versions_dispo_npm(PAQUET_IPA)
if présente:
versions_disponibles.append(présente)
versions_disponibles.sort(reverse=True)

spécifications_compatibles_serveur = SimpleSpec(_obt_version(exe, "v-constl-obli"))
return next(
v for v in versions_disponibles if v in spécifications_compatibles_serveur and v in versions_ipa_compatibles
)


def obt_version_ipa(exe: TypeExe = EXE_CONSTL) -> Optional[Version]:
return Version(_obt_version(exe, "v-constl"))


@lru_cache
def _vérifier_installation(exe_: Union[str, Tuple[str]]) -> True:
message_erreur = "Constellation doit être installée et à jour sur votre appareil. " \
Expand All @@ -262,11 +203,6 @@ def _vérifier_installation(exe_: Union[str, Tuple[str]]) -> True:
if isinstance(exe_, tuple):
exe_ = list(exe_)

# Si @constl/ipa non installée, erreur
ipa_installée = ipa_est_installée(exe_)
if not ipa_installée:
raise ErreurInstallationConstellation(message_erreur)

# Obtenir version serveur
version_serveur = obt_version_serveur(exe_)
logging.debug("version_serveur: " + str(version_serveur))
Expand All @@ -281,15 +217,6 @@ def _vérifier_installation(exe_: Union[str, Tuple[str]]) -> True:
message_erreur + f"\nVersion présente de {PAQUET_SERVEUR} : {version_serveur}"
)

# Vérifier version @constl/ipa compatible avec @constl/serveur
version_ipa = obt_version_ipa(exe_)
spécifications_compatibles = SimpleSpec(_obt_version(exe_, "v-constl-obli"))
logging.debug(f"version ipa {version_ipa}")
if version_ipa not in spécifications_compatibles or version_ipa not in versions_ipa_compatibles:
raise ErreurInstallationConstellation(
message_erreur + f"\nVersion présente de {PAQUET_IPA} : {version_ipa}\n Version requise : {spécifications_compatibles} et {versions_ipa_compatibles}"
)


def vérifier_installation_constellation(exe: TypeExe = EXE_CONSTL):
return _vérifier_installation(exe if isinstance(exe, str) else tuple(exe))
Expand Down Expand Up @@ -340,24 +267,6 @@ def _installer_nodejs():
raise OSError(système_opératoire)


def installer_de_pnpm(paquet: str, version: Union[Version, SimpleSpec, str] = "latest"):
assurer_npm_pnpm_installés()

résultat_pnpm = subprocess.run(
["pnpm", "add", "-g", paquet + "@" + str(version)],
capture_output=True,
shell=platform.system() == "Windows"
)

logging.debug(f"Paquet {paquet}, version {version} installé.")

if résultat_pnpm.returncode != 0:
raise ConnectionError(
f"Erreur d'installation du paquet {paquet} :\n\t{résultat_pnpm.stderr.decode()}"
f"\n\t{résultat_pnpm.stdout.decode()}"
)


def désinstaller_de_pnpm(paquet):
assurer_npm_pnpm_installés()
résultat_pnpm = subprocess.run(
Expand Down
20 changes: 2 additions & 18 deletions tests/ressources/_serveur.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@
from trio_websocket import serve_websocket, ConnectionClosed, WebSocketConnection

try:
from constellationPy.const import V_SERVEUR_NÉCESSAIRE, V_IPA_NÉCESSAIRE
from constellationPy.const import V_SERVEUR_NÉCESSAIRE
except ModuleNotFoundError:
# Pour tests sur Ubuntu... je ne suis pas sûr pourquoi ça ne fonctionne pas...
V_SERVEUR_NÉCESSAIRE = "^0.3.7"
V_IPA_NÉCESSAIRE = "^1.0.4"

V_SERVEUR_NÉCESSAIRE = "^2.0.6"
_données = {}

# Nécessaire pour Windows
Expand Down Expand Up @@ -184,17 +182,6 @@ def écrire_à_stdout(*message: str):
def cli():
pass


@click.command()
def v_constl():
écrire_à_stdout(V_IPA_NÉCESSAIRE.strip("^"))


@click.command()
def v_constl_obli():
écrire_à_stdout(V_IPA_NÉCESSAIRE)


@click.command()
def version():
écrire_à_stdout(V_SERVEUR_NÉCESSAIRE.strip("^"))
Expand Down Expand Up @@ -240,9 +227,6 @@ async def _lancer_port_ws(p):

trio.run(main)


cli.add_command(v_constl)
cli.add_command(v_constl_obli)
cli.add_command(version)
cli.add_command(lancer)

Expand Down

0 comments on commit f7b3183

Please sign in to comment.