Implement a command base tcp server
This commit is contained in:
parent
f98b0f6fb1
commit
c2fe5e226c
|
@ -19,12 +19,14 @@ This module contains all the CLI subcommands and interfaces that Meissa
|
|||
provides for user interaction
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
import yaml
|
||||
import asyncio
|
||||
from pathlib import Path
|
||||
|
||||
import click
|
||||
|
||||
from meissa import utils
|
||||
from meissa import utils, server
|
||||
|
||||
|
||||
DEFAULT_MODEL = (
|
||||
|
@ -58,10 +60,7 @@ def setup(ctx):
|
|||
@cli.command(help="Starts the Meissa server")
|
||||
@click.pass_context
|
||||
def start(ctx):
|
||||
try:
|
||||
asyncio.run(start(config, synth(conf)))
|
||||
except KeyboardInterrupt:
|
||||
sys.exit()
|
||||
asyncio.run(server.start(ctx))
|
||||
|
||||
|
||||
def main():
|
||||
|
|
106
meissa/server.py
106
meissa/server.py
|
@ -14,14 +14,16 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import sys
|
||||
import asyncio
|
||||
|
||||
# pylint: disable=redefined-outer-name, unused-argument
|
||||
from pathlib import Path
|
||||
|
||||
import msgpack
|
||||
|
||||
# pylint: disable=redefined-outer-name, unused-argument
|
||||
|
||||
|
||||
import numpy as np
|
||||
|
||||
|
||||
import simpleaudio as sa
|
||||
|
||||
from TTS.utils.manage import ModelManager
|
||||
|
@ -46,7 +48,7 @@ def play(wav):
|
|||
|
||||
|
||||
def synth(ctx):
|
||||
path = Path(__file__).parent / ".models.json"
|
||||
path = Path(__file__).parent / "speaker.models.json"
|
||||
manager = ModelManager(path)
|
||||
|
||||
language_ids_file_path = None
|
||||
|
@ -101,7 +103,89 @@ def synth(ctx):
|
|||
return tcp_handler
|
||||
|
||||
|
||||
async def start(ctx, fn):
|
||||
class Server:
|
||||
"""
|
||||
A TTS async server.
|
||||
"""
|
||||
|
||||
def __init__(self, ctx):
|
||||
self.queue = asyncio.Queue()
|
||||
self.current_job = None
|
||||
self.running = True
|
||||
self.ctx = ctx
|
||||
|
||||
async def command_stop(self):
|
||||
self.running = False
|
||||
utils.info("Stopping all jobs")
|
||||
return self.ok()
|
||||
|
||||
async def command_stop_and_play(self, job):
|
||||
self.running = False
|
||||
utils.info(f"Stopping all jobs and starting: {job}")
|
||||
self.current_job = job
|
||||
return self.ok()
|
||||
|
||||
async def command_enqueue(self, job):
|
||||
self.queue.put_nowait(job)
|
||||
utils.info(f"Enqueued job: {job}")
|
||||
return self.ok()
|
||||
|
||||
async def command_status(self, payload):
|
||||
return self.ok({"queue": self.queue.qsize()})
|
||||
|
||||
def err(self, msg):
|
||||
return {"status": "error", "error": msg}
|
||||
|
||||
def ok(self, payload={}):
|
||||
return {"status": "ok", "payload": payload}
|
||||
|
||||
async def handle_command(self, command_pack):
|
||||
utils.log("DEBUG", f"{str(command_pack)}")
|
||||
command = command_pack.get("command")
|
||||
|
||||
if not command:
|
||||
return self.err("Not command field")
|
||||
|
||||
payload = command_pack.get("payload")
|
||||
|
||||
if payload is None:
|
||||
return self.err("Not payload field")
|
||||
|
||||
if hasattr(self, f"command_{command}"):
|
||||
command_handler = getattr(self, f"command_{command}")
|
||||
return await command_handler(payload)
|
||||
|
||||
return self.err(f"No command '{command}'!")
|
||||
|
||||
async def handle_client(self, reader, writer):
|
||||
while True:
|
||||
data = await reader.read(1024)
|
||||
if not data:
|
||||
break
|
||||
|
||||
command = msgpack.unpackb(data)
|
||||
response = await self.handle_command(command)
|
||||
writer.write(msgpack.packb(response))
|
||||
await writer.drain()
|
||||
|
||||
utils.info("Disconnecting.")
|
||||
writer.close()
|
||||
|
||||
async def run_server(self, host, port):
|
||||
server = await asyncio.start_server(self.handle_client, host, port)
|
||||
|
||||
addr = server.sockets[0].getsockname()
|
||||
utils.info(f"Server listening on {addr}")
|
||||
|
||||
async with server:
|
||||
try:
|
||||
await server.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
utils.info("Shutting Down")
|
||||
sys.exit()
|
||||
|
||||
|
||||
async def start(ctx):
|
||||
"""
|
||||
Start a TCP socket and pass the given connection handler function `fn`
|
||||
to it. It uses the `host` and `port` in the config file for the server.
|
||||
|
@ -109,11 +193,5 @@ async def start(ctx, fn):
|
|||
host = utils.config(ctx).get("host", "127.0.0.1")
|
||||
port = utils.config(ctx).get("port", 6666)
|
||||
|
||||
server = await asyncio.start_server(fn, host, port)
|
||||
|
||||
addrs = ", ".join(str(sock.getsockname()) for sock in server.sockets)
|
||||
|
||||
utils.info(f"Serving on {addrs}")
|
||||
|
||||
async with server:
|
||||
await server.serve_forever()
|
||||
server = Server(ctx)
|
||||
await server.run_server(host, port)
|
||||
|
|
|
@ -0,0 +1,377 @@
|
|||
{
|
||||
"tts_models": {
|
||||
"multilingual":{
|
||||
"multi-dataset":{
|
||||
"your_tts":{
|
||||
"description": "Your TTS model accompanying the paper https://arxiv.org/abs/2112.02418",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--multilingual--multi-dataset--your_tts.zip",
|
||||
"default_vocoder": null,
|
||||
"commit": "e9a1953e",
|
||||
"license": "CC BY-NC-ND 4.0",
|
||||
"contact": "egolge@coqui.ai"
|
||||
}
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"ek1": {
|
||||
"tacotron2": {
|
||||
"description": "EK1 en-rp tacotron2 by NMStoker",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.1.0/tts_models--en--ek1--tacotron2.zip",
|
||||
"default_vocoder": "vocoder_models/en/ek1/wavegrad",
|
||||
"commit": "c802255"
|
||||
}
|
||||
},
|
||||
"ljspeech": {
|
||||
"tacotron2-DDC": {
|
||||
"description": "Tacotron2 with Double Decoder Consistency.",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.12/tts_models--en--ljspeech--tacotron2-DDC.zip",
|
||||
"default_vocoder": "vocoder_models/en/ljspeech/hifigan_v2",
|
||||
"commit": "bae2ad0f",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "",
|
||||
"contact": "egolge@coqui.com"
|
||||
},
|
||||
"tacotron2-DDC_ph": {
|
||||
"description": "Tacotron2 with Double Decoder Consistency with phonemes.",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--en--ljspeech--tacotron2-DDC_ph.zip",
|
||||
"default_vocoder": "vocoder_models/en/ljspeech/univnet",
|
||||
"commit": "3900448",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "",
|
||||
"contact": "egolge@coqui.com"
|
||||
},
|
||||
"glow-tts": {
|
||||
"description": "",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.9/tts_models--en--ljspeech--glow-tts.zip",
|
||||
"stats_file": null,
|
||||
"default_vocoder": "vocoder_models/en/ljspeech/multiband-melgan",
|
||||
"commit": "",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "MPL",
|
||||
"contact": "egolge@coqui.com"
|
||||
},
|
||||
"speedy-speech": {
|
||||
"description": "Speedy Speech model trained on LJSpeech dataset using the Alignment Network for learning the durations.",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.3.0/tts_models--en--ljspeech--speedy_speech.zip",
|
||||
"stats_file": null,
|
||||
"default_vocoder": "vocoder_models/en/ljspeech/hifigan_v2",
|
||||
"commit": "4581e3d",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "TBD",
|
||||
"contact": "egolge@coqui.com"
|
||||
},
|
||||
"tacotron2-DCA": {
|
||||
"description": "",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.9/tts_models--en--ljspeech--tacotron2-DCA.zip",
|
||||
"default_vocoder": "vocoder_models/en/ljspeech/multiband-melgan",
|
||||
"commit": "",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "MPL",
|
||||
"contact": "egolge@coqui.com"
|
||||
},
|
||||
"vits": {
|
||||
"description": "VITS is an End2End TTS model trained on LJSpeech dataset with phonemes.",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--en--ljspeech--vits.zip",
|
||||
"default_vocoder": null,
|
||||
"commit": "3900448",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "TBD",
|
||||
"contact": "egolge@coqui.com"
|
||||
},
|
||||
"fast_pitch": {
|
||||
"description": "FastPitch model trained on LJSpeech using the Aligner Network",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.2.2/tts_models--en--ljspeech--fast_pitch.zip",
|
||||
"default_vocoder": "vocoder_models/en/ljspeech/hifigan_v2",
|
||||
"commit": "b27b3ba",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "TBD",
|
||||
"contact": "egolge@coqui.com"
|
||||
}
|
||||
},
|
||||
"vctk": {
|
||||
"vits": {
|
||||
"description": "VITS End2End TTS model trained on VCTK dataset with 109 different speakers with EN accent.",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--en--vctk--vits.zip",
|
||||
"default_vocoder": null,
|
||||
"commit": "3900448",
|
||||
"author": "Eren @erogol",
|
||||
"license": "",
|
||||
"contact": "egolge@coqui.ai"
|
||||
},
|
||||
"fast_pitch":{
|
||||
"description": "FastPitch model trained on VCTK dataseset.",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--en--vctk--fast_pitch.zip",
|
||||
"default_vocoder": null,
|
||||
"commit": "bdab788d",
|
||||
"author": "Eren @erogol",
|
||||
"license": "CC BY-NC-ND 4.0",
|
||||
"contact": "egolge@coqui.ai"
|
||||
}
|
||||
},
|
||||
"sam": {
|
||||
"tacotron-DDC": {
|
||||
"description": "Tacotron2 with Double Decoder Consistency trained with Aceenture's Sam dataset.",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.13/tts_models--en--sam--tacotron_DDC.zip",
|
||||
"default_vocoder": "vocoder_models/en/sam/hifigan_v2",
|
||||
"commit": "bae2ad0f",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "",
|
||||
"contact": "egolge@coqui.com"
|
||||
}
|
||||
}
|
||||
},
|
||||
"es": {
|
||||
"mai": {
|
||||
"tacotron2-DDC": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.9/tts_models--es--mai--tacotron2-DDC.zip",
|
||||
"default_vocoder": "vocoder_models/universal/libri-tts/fullband-melgan",
|
||||
"commit": "",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "MPL",
|
||||
"contact": "egolge@coqui.com"
|
||||
}
|
||||
}
|
||||
},
|
||||
"fr": {
|
||||
"mai": {
|
||||
"tacotron2-DDC": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.9/tts_models--fr--mai--tacotron2-DDC.zip",
|
||||
"default_vocoder": "vocoder_models/universal/libri-tts/fullband-melgan",
|
||||
"commit": "",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "MPL",
|
||||
"contact": "egolge@coqui.com"
|
||||
}
|
||||
}
|
||||
},
|
||||
"uk":{
|
||||
"mai": {
|
||||
"glow-tts": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--uk--mai--glow-tts.zip",
|
||||
"author":"@robinhad",
|
||||
"commit": "bdab788d",
|
||||
"license": "MIT",
|
||||
"contact": "",
|
||||
"default_vocoder": "vocoder_models/uk/mai/multiband-melgan"
|
||||
}
|
||||
}
|
||||
},
|
||||
"zh-CN": {
|
||||
"baker": {
|
||||
"tacotron2-DDC-GST": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--zh-CN--baker--tacotron2-DDC-GST.zip",
|
||||
"commit": "unknown",
|
||||
"author": "@kirianguiller",
|
||||
"default_vocoder": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"nl": {
|
||||
"mai": {
|
||||
"tacotron2-DDC": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.10/tts_models--nl--mai--tacotron2-DDC.zip",
|
||||
"author": "@r-dh",
|
||||
"default_vocoder": "vocoder_models/nl/mai/parallel-wavegan",
|
||||
"stats_file": null,
|
||||
"commit": "540d811"
|
||||
}
|
||||
}
|
||||
},
|
||||
"de": {
|
||||
"thorsten": {
|
||||
"tacotron2-DCA": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.11/tts_models--de--thorsten--tacotron2-DCA.zip",
|
||||
"default_vocoder": "vocoder_models/de/thorsten/fullband-melgan",
|
||||
"author": "@thorstenMueller",
|
||||
"commit": "unknown"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ja": {
|
||||
"kokoro": {
|
||||
"tacotron2-DDC": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.15/tts_models--jp--kokoro--tacotron2-DDC.zip",
|
||||
"default_vocoder": "vocoder_models/ja/kokoro/hifigan_v1",
|
||||
"description": "Tacotron2 with Double Decoder Consistency trained with Kokoro Speech Dataset.",
|
||||
"author": "@kaiidams",
|
||||
"commit": "401fbd89"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tr":{
|
||||
"common-voice": {
|
||||
"glow-tts":{
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--tr--common-voice--glow-tts.zip",
|
||||
"default_vocoder": "vocoder_models/tr/common-voice/hifigan",
|
||||
"license": "MIT",
|
||||
"description": "Turkish GlowTTS model using an unknown speaker from the Common-Voice dataset.",
|
||||
"author": "Fatih Akademi",
|
||||
"commit": null
|
||||
}
|
||||
}
|
||||
},
|
||||
"it": {
|
||||
"mai_female": {
|
||||
"glow-tts":{
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--it--mai_female--glow-tts.zip",
|
||||
"default_vocoder": null,
|
||||
"description": "GlowTTS model as explained on https://github.com/coqui-ai/TTS/issues/1148.",
|
||||
"author": "@nicolalandro",
|
||||
"commit": null
|
||||
},
|
||||
"vits":{
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--it--mai_female--vits.zip",
|
||||
"default_vocoder": null,
|
||||
"description": "GlowTTS model as explained on https://github.com/coqui-ai/TTS/issues/1148.",
|
||||
"author": "@nicolalandro",
|
||||
"commit": null
|
||||
}
|
||||
},
|
||||
"mai_male": {
|
||||
"glow-tts":{
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--it--mai_male--glow-tts.zip",
|
||||
"default_vocoder": null,
|
||||
"description": "GlowTTS model as explained on https://github.com/coqui-ai/TTS/issues/1148.",
|
||||
"author": "@nicolalandro",
|
||||
"commit": null
|
||||
},
|
||||
"vits":{
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/tts_models--it--mai_male--vits.zip",
|
||||
"default_vocoder": null,
|
||||
"description": "GlowTTS model as explained on https://github.com/coqui-ai/TTS/issues/1148.",
|
||||
"author": "@nicolalandro",
|
||||
"commit": null
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"vocoder_models": {
|
||||
"universal": {
|
||||
"libri-tts": {
|
||||
"wavegrad": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.9/vocoder_models--universal--libri-tts--wavegrad.zip",
|
||||
"commit": "ea976b0",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "MPL",
|
||||
"contact": "egolge@coqui.com"
|
||||
},
|
||||
"fullband-melgan": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.9/vocoder_models--universal--libri-tts--fullband-melgan.zip",
|
||||
"commit": "4132240",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "MPL",
|
||||
"contact": "egolge@coqui.com"
|
||||
}
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"ek1": {
|
||||
"wavegrad": {
|
||||
"description": "EK1 en-rp wavegrad by NMStoker",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.10/vocoder_models--en--ek1--wavegrad.zip",
|
||||
"commit": "c802255"
|
||||
}
|
||||
},
|
||||
"ljspeech": {
|
||||
"multiband-melgan": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.9/vocoder_models--en--ljspeech--mulitband-melgan.zip",
|
||||
"commit": "ea976b0",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "MPL",
|
||||
"contact": "egolge@coqui.com"
|
||||
},
|
||||
"hifigan_v2": {
|
||||
"description": "HiFiGAN_v2 LJSpeech vocoder from https://arxiv.org/abs/2010.05646.",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.12/vocoder_model--en--ljspeech-hifigan_v2.zip",
|
||||
"commit": "bae2ad0f",
|
||||
"author": "@erogol",
|
||||
"license": "",
|
||||
"contact": "egolge@coqui.ai"
|
||||
},
|
||||
"univnet": {
|
||||
"description": "UnivNet model finetuned on TacotronDDC_ph spectrograms for better compatibility.",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.3.0/vocoder_models--en--ljspeech--univnet_v2.zip",
|
||||
"commit": "4581e3d",
|
||||
"author": "Eren @erogol",
|
||||
"license": "TBD",
|
||||
"contact": "egolge@coqui.ai"
|
||||
}
|
||||
},
|
||||
"vctk": {
|
||||
"hifigan_v2": {
|
||||
"description": "Finetuned and intended to be used with tts_models/en/vctk/sc-glow-tts",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.12/vocoder_model--en--vctk--hifigan_v2.zip",
|
||||
"commit": "2f07160",
|
||||
"author": "Edresson Casanova",
|
||||
"license": "",
|
||||
"contact": ""
|
||||
}
|
||||
},
|
||||
"sam": {
|
||||
"hifigan_v2": {
|
||||
"description": "Finetuned and intended to be used with tts_models/en/sam/tacotron_DDC",
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.13/vocoder_models--en--sam--hifigan_v2.zip",
|
||||
"commit": "2f07160",
|
||||
"author": "Eren Gölge @erogol",
|
||||
"license": "",
|
||||
"contact": "egolge@coqui.ai"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nl": {
|
||||
"mai": {
|
||||
"parallel-wavegan": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.10/vocoder_models--nl--mai--parallel-wavegan.zip",
|
||||
"author": "@r-dh",
|
||||
"commit": "unknown"
|
||||
}
|
||||
}
|
||||
},
|
||||
"de": {
|
||||
"thorsten": {
|
||||
"wavegrad": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.0.11/vocoder_models--de--thorsten--wavegrad.zip",
|
||||
"author": "@thorstenMueller",
|
||||
"commit": "unknown"
|
||||
},
|
||||
"fullband-melgan": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.1.3/vocoder_models--de--thorsten--fullband-melgan.zip",
|
||||
"author": "@thorstenMueller",
|
||||
"commit": "unknown"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ja": {
|
||||
"kokoro": {
|
||||
"hifigan_v1": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.2.0/vocoder_models--ja--kokoro--hifigan_v1.zip",
|
||||
"description": "HifiGAN model trained for kokoro dataset by @kaiidams",
|
||||
"author": "@kaiidams",
|
||||
"commit": "3900448"
|
||||
}
|
||||
}
|
||||
},
|
||||
"uk": {
|
||||
"mai": {
|
||||
"multiband-melgan": {
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.5.0_models/vocoder_models--uk--mai--multiband-melgan.zip",
|
||||
"author":"@robinhad",
|
||||
"commit": "bdab788d",
|
||||
"license": "MIT",
|
||||
"contact": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"tr":{
|
||||
"common-voice": {
|
||||
"hifigan":{
|
||||
"github_rls_url": "https://coqui.gateway.scarf.sh/v0.6.0_models/vocoder_models--tr--common-voice--hifigan.zip",
|
||||
"description": "HifiGAN model using an unknown speaker from the Common-Voice dataset.",
|
||||
"author": "Fatih Akademi",
|
||||
"license": "MIT",
|
||||
"commit": null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -33,5 +33,6 @@ disable = """
|
|||
fixme,
|
||||
missing-function-docstring,
|
||||
missing-module-docstring,
|
||||
missing-class-docstring
|
||||
missing-class-docstring,
|
||||
W0102,
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue