1
0
mirror of synced 2024-12-12 06:51:05 +01:00

Remove MultiDict everywhere

Add a test for --merge
This commit is contained in:
Stepland 2021-12-28 12:07:32 +01:00
parent 4002282c12
commit efaa52d10b
12 changed files with 189 additions and 147 deletions

View File

@ -2,9 +2,17 @@
## Added ## Added
- Jubeatools can now handle HAKUs, in the following formats : - Jubeatools can now handle HAKUs, in the following formats :
- [memon:v1.0.0] - [memon:v1.0.0]
- [memon] 🎉 inital support for v1.0.0 ! - [memon]
- 🎉 inital support for v1.0.0 !
- `--merge` option allows for several memon files to be merged when
jubeatools is called on a folder
## Changed ## Changed
- Improved the merging procedure for song objects - Improved the merging procedure for song objects
- Re-enable calling the CLI on a folder, this was disabled for some reason ?
- The song class now uses a regular dict to map difficuty names to chart
objects, dissalowing files with duplicate difficulties (`memon:legacy` was the
only format that *technically* supported this anyway, I conscider it an edge
case not really worth handling)
# v1.3.0 # v1.3.0
## Added ## Added

View File

@ -5,21 +5,23 @@ from typing import Any, Dict, Optional
import click import click
from jubeatools.formats import DUMPERS, LOADERS from jubeatools.formats import DUMPERS, LOADERS, Format
from jubeatools.formats.enum import Format
from jubeatools.formats.guess import guess_format from jubeatools.formats.guess import guess_format
from .helpers import dumper_option, loader_option from .helpers import dumper_option, loader_option
@click.command() @click.command()
@click.argument("src", type=click.Path(exists=True, dir_okay=False)) @click.argument("src", type=click.Path(exists=True, dir_okay=True))
@click.argument("dst", type=click.Path()) @click.argument("dst", type=click.Path())
@click.option( @click.option(
"--input-format", "--input-format",
"input_format", "input_format",
type=click.Choice(list(f._value_ for f in LOADERS.keys())), type=click.Choice(list(f._value_ for f in LOADERS.keys())),
help="Input file format", help=(
"Force jubeatools to read the input file/folder as the given format."
"If this option is not used jubeatools will try to guess the format"
),
) )
@click.option( @click.option(
"-f", "-f",
@ -45,6 +47,11 @@ from .helpers import dumper_option, loader_option
"the nearest 1/beat_snap beat" "the nearest 1/beat_snap beat"
), ),
) )
@loader_option(
"--merge",
is_flag=True,
help="For memon, if called on a folder, merge all the .memon files found",
)
def convert( def convert(
src: str, src: str,
dst: str, dst: str,

View File

@ -0,0 +1,25 @@
{
"data": {
"ADV": {
"level": 5,
"notes": [
{
"l": 0,
"n": 1,
"p": 0,
"t": 1680
}
],
"resolution": 240
}
},
"metadata": {
"BPM": 180.28199768066406,
"album cover path": "2a03puritans.png",
"artist": "commandycan",
"music path": "Sky Bus For Hire.ogg",
"offset": -0.028,
"song title": "Sky Bus For Hire"
},
"version": "0.1.0"
}

View File

@ -0,0 +1,25 @@
{
"data": {
"BSC": {
"level": 1,
"notes": [
{
"l": 0,
"n": 2,
"p": 0,
"t": 1680
}
],
"resolution": 240
}
},
"metadata": {
"BPM": 180.28199768066406,
"album cover path": "2a03puritans.png",
"artist": "commandycan",
"music path": "Sky Bus For Hire.ogg",
"offset": -0.028,
"song title": "Sky Bus For Hire"
},
"version": "0.1.0"
}

View File

@ -0,0 +1,25 @@
{
"data": {
"EXT": {
"level": 10,
"notes": [
{
"l": 0,
"n": 15,
"p": 0,
"t": 1680
}
],
"resolution": 240
}
},
"metadata": {
"BPM": 180.28199768066406,
"album cover path": "2a03puritans.png",
"artist": "commandycan",
"music path": "Sky Bus For Hire.ogg",
"offset": -0.028,
"song title": "Sky Bus For Hire"
},
"version": "0.1.0"
}

View File

@ -0,0 +1,2 @@
"""This file is here so the test code can use importlib as a portable way to
open test data in this folder"""

View File

@ -1,15 +1,17 @@
from importlib import resources from importlib import resources
from pathlib import Path
from click.testing import CliRunner from click.testing import CliRunner
from jubeatools import song as jbt
from jubeatools.formats import LOADERS, Format
from ..cli import convert from ..cli import convert
from . import data from . import data
def test_that_ommiting_beat_snap_works() -> None: def test_that_ommiting_beat_snap_works() -> None:
""" """As pointed out by https://github.com/Stepland/jubeatools/issues/17"""
As pointed out by https://github.com/Stepland/jubeatools/issues/17
"""
runner = CliRunner() runner = CliRunner()
with runner.isolated_filesystem(), resources.path( with runner.isolated_filesystem(), resources.path(
data, "Life Without You.eve" data, "Life Without You.eve"
@ -20,3 +22,50 @@ def test_that_ommiting_beat_snap_works() -> None:
if result.exception: if result.exception:
raise result.exception raise result.exception
assert result.exit_code == 0 assert result.exit_code == 0
def test_that_is_flag_works_the_way_intended() -> None:
"""It's unclear to me what the default value is for an option with
is_flag=True"""
with resources.path(data, "Life Without You.eve") as p:
called_with_the_flag = convert.make_context(
"convert",
[str(p.resolve(strict=True)), "out.txt", "-f", "memo2", "--circlefree"],
)
assert called_with_the_flag.params["dumper_options"]["circle_free"] is True
called_without_the_flag = convert.make_context(
"convert", [str(p.resolve(strict=True)), "out.txt", "-f", "memo2"]
)
dumper_options = called_without_the_flag.params.get("dumper_options")
if dumper_options is not None:
circle_free = dumper_options.get("circle_free")
assert not circle_free
def test_that_the_merge_option_works_for_memon_files() -> None:
runner = CliRunner()
with runner.isolated_filesystem(), resources.path(data, "memon_merge") as p:
result = runner.invoke(
convert,
[
"--input-format",
"memon:v0.1.0",
str(p.resolve(strict=True)),
"--merge",
"out.memon",
"-f",
"memon:v0.1.0",
],
)
if result.exception:
raise result.exception
assert result.exit_code == 0
memon_loader = LOADERS[Format.MEMON_0_1_0]
bsc = memon_loader(p / "Sky Bus For Hire BSC.memon")
adv = memon_loader(p / "Sky Bus For Hire ADV.memon")
ext = memon_loader(p / "Sky Bus For Hire EXT.memon")
merged_by_cli = LOADERS[Format.MEMON_0_1_0](Path("out.memon"))
merged_with_python = jbt.Song.from_monochart_instances(bsc, adv, ext)
assert merged_by_cli == merged_with_python

View File

@ -1,7 +1,5 @@
from pathlib import Path from pathlib import Path
from typing import Any, Union from typing import Any, Dict, Union
from multidict import MultiDict
from jubeatools import song as jbt from jubeatools import song as jbt
from jubeatools.utils import none_or from jubeatools.utils import none_or
@ -38,18 +36,17 @@ def _load_memon_legacy(raw_memon: Any) -> jbt.Song:
events=[jbt.BPMEvent(time=jbt.BeatsTime(0), BPM=file["metadata"]["BPM"])], events=[jbt.BPMEvent(time=jbt.BeatsTime(0), BPM=file["metadata"]["BPM"])],
beat_zero_offset=jbt.SecondsTime(-file["metadata"]["offset"]), beat_zero_offset=jbt.SecondsTime(-file["metadata"]["offset"]),
) )
charts: MultiDict[jbt.Chart] = MultiDict() charts: Dict[str, jbt.Chart] = {}
for memon_chart in file["data"]: for memon_chart in file["data"]:
charts.add( difficulty = memon_chart["dif_name"]
memon_chart["dif_name"], chart = jbt.Chart(
jbt.Chart( level=memon_chart["level"],
level=memon_chart["level"], notes=[
notes=[ _load_memon_note_v0(note, memon_chart["resolution"])
_load_memon_note_v0(note, memon_chart["resolution"]) for note in memon_chart["notes"]
for note in memon_chart["notes"] ],
],
),
) )
charts[difficulty] = chart
return jbt.Song(metadata=metadata, charts=charts, common_timing=common_timing) return jbt.Song(metadata=metadata, charts=charts, common_timing=common_timing)
@ -70,18 +67,16 @@ def _load_memon_0_1_0(raw_memon: Any) -> jbt.Song:
events=[jbt.BPMEvent(time=jbt.BeatsTime(0), BPM=file["metadata"]["BPM"])], events=[jbt.BPMEvent(time=jbt.BeatsTime(0), BPM=file["metadata"]["BPM"])],
beat_zero_offset=jbt.SecondsTime(-file["metadata"]["offset"]), beat_zero_offset=jbt.SecondsTime(-file["metadata"]["offset"]),
) )
charts: MultiDict[jbt.Chart] = MultiDict() charts: Dict[str, jbt.Chart] = {}
for difficulty, memon_chart in file["data"].items(): for difficulty, memon_chart in file["data"].items():
charts.add( chart = jbt.Chart(
difficulty, level=memon_chart["level"],
jbt.Chart( notes=[
level=memon_chart["level"], _load_memon_note_v0(note, memon_chart["resolution"])
notes=[ for note in memon_chart["notes"]
_load_memon_note_v0(note, memon_chart["resolution"]) ],
for note in memon_chart["notes"]
],
),
) )
charts[difficulty] = chart
return jbt.Song(metadata=metadata, charts=charts, common_timing=common_timing) return jbt.Song(metadata=metadata, charts=charts, common_timing=common_timing)
@ -109,18 +104,16 @@ def _load_memon_0_2_0(raw_memon: Any) -> jbt.Song:
events=[jbt.BPMEvent(time=jbt.BeatsTime(0), BPM=file["metadata"]["BPM"])], events=[jbt.BPMEvent(time=jbt.BeatsTime(0), BPM=file["metadata"]["BPM"])],
beat_zero_offset=jbt.SecondsTime(-file["metadata"]["offset"]), beat_zero_offset=jbt.SecondsTime(-file["metadata"]["offset"]),
) )
charts: MultiDict[jbt.Chart] = MultiDict() charts: Dict[str, jbt.Chart] = {}
for difficulty, memon_chart in file["data"].items(): for difficulty, memon_chart in file["data"].items():
charts.add( chart = jbt.Chart(
difficulty, level=memon_chart["level"],
jbt.Chart( notes=[
level=memon_chart["level"], _load_memon_note_v0(note, memon_chart["resolution"])
notes=[ for note in memon_chart["notes"]
_load_memon_note_v0(note, memon_chart["resolution"]) ],
for note in memon_chart["notes"]
],
),
) )
charts[difficulty] = chart
return jbt.Song(metadata=metadata, charts=charts, common_timing=common_timing) return jbt.Song(metadata=metadata, charts=charts, common_timing=common_timing)
@ -149,18 +142,16 @@ def _load_memon_0_3_0(raw_memon: Any) -> jbt.Song:
events=[jbt.BPMEvent(time=jbt.BeatsTime(0), BPM=file["metadata"]["BPM"])], events=[jbt.BPMEvent(time=jbt.BeatsTime(0), BPM=file["metadata"]["BPM"])],
beat_zero_offset=jbt.SecondsTime(-file["metadata"]["offset"]), beat_zero_offset=jbt.SecondsTime(-file["metadata"]["offset"]),
) )
charts: MultiDict[jbt.Chart] = MultiDict() charts: Dict[str, jbt.Chart] = {}
for difficulty, memon_chart in file["data"].items(): for difficulty, memon_chart in file["data"].items():
charts.add( chart = jbt.Chart(
difficulty, level=memon_chart["level"],
jbt.Chart( notes=[
level=memon_chart["level"], _load_memon_note_v0(note, memon_chart["resolution"])
notes=[ for note in memon_chart["notes"]
_load_memon_note_v0(note, memon_chart["resolution"]) ],
for note in memon_chart["notes"]
],
),
) )
charts[difficulty] = chart
return jbt.Song(metadata=metadata, charts=charts, common_timing=common_timing) return jbt.Song(metadata=metadata, charts=charts, common_timing=common_timing)

View File

@ -17,6 +17,7 @@ from pathlib import Path
from typing import ( from typing import (
Any, Any,
Callable, Callable,
Dict,
Iterable, Iterable,
Iterator, Iterator,
List, List,
@ -28,8 +29,6 @@ from typing import (
Union, Union,
) )
from multidict import MultiDict
from jubeatools.utils import none_or from jubeatools.utils import none_or
BeatsTime = Fraction BeatsTime = Fraction
@ -279,18 +278,18 @@ class Song:
A Song is a set of charts with associated metadata""" A Song is a set of charts with associated metadata"""
metadata: Metadata metadata: Metadata
charts: Mapping[str, Chart] = field(default_factory=MultiDict) charts: Mapping[str, Chart] = field(default_factory=dict)
common_timing: Optional[Timing] = None common_timing: Optional[Timing] = None
common_hakus: Optional[Set[BeatsTime]] = None common_hakus: Optional[Set[BeatsTime]] = None
@classmethod @classmethod
def from_monochart_instances(cls, *songs: "Song") -> "Song": def from_monochart_instances(cls, *songs: "Song") -> "Song":
metadata = Metadata.permissive_merge(*(song.metadata for song in songs)) metadata = Metadata.permissive_merge(*(song.metadata for song in songs))
charts: MultiDict[Chart] = MultiDict() charts: Dict[str, Chart] = {}
for song in songs: for song in songs:
song.remove_common_timing() song.remove_common_timing()
song.remove_common_hakus() song.remove_common_hakus()
charts.extend(song.charts) charts.update(song.charts)
merged = cls( merged = cls(
metadata=metadata, metadata=metadata,

View File

@ -10,7 +10,6 @@ from pathlib import Path
from typing import Dict, Iterable, Optional, Set, Union from typing import Dict, Iterable, Optional, Set, Union
import hypothesis.strategies as st import hypothesis.strategies as st
from multidict import MultiDict
from jubeatools.song import ( from jubeatools.song import (
BeatsTime, BeatsTime,
@ -286,14 +285,9 @@ def song(
chart_strat: st.SearchStrategy[Chart] = chart(), chart_strat: st.SearchStrategy[Chart] = chart(),
metadata_strat: st.SearchStrategy[Metadata] = metadata(), metadata_strat: st.SearchStrategy[Metadata] = metadata(),
) -> Song: ) -> Song:
diffs = draw(diffs_strat)
charts: MultiDict[Chart] = MultiDict()
for diff_name in diffs:
charts.add(diff_name, draw(chart_strat))
return Song( return Song(
metadata=draw(metadata_strat), metadata=draw(metadata_strat),
charts=charts, charts={difficulty: draw(chart_strat) for difficulty in draw(diffs_strat)},
common_timing=draw(common_timing_strat), common_timing=draw(common_timing_strat),
common_hakus=draw(common_hakus_strat), common_hakus=draw(common_hakus_strat),
) )

84
poetry.lock generated
View File

@ -238,14 +238,6 @@ category = "main"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
[[package]]
name = "multidict"
version = "5.2.0"
description = "multidict implementation"
category = "main"
optional = false
python-versions = ">=3.6"
[[package]] [[package]]
name = "mypy" name = "mypy"
version = "0.910" version = "0.910"
@ -523,7 +515,7 @@ typing-extensions = ">=3.7.4"
[metadata] [metadata]
lock-version = "1.1" lock-version = "1.1"
python-versions = "^3.8" python-versions = "^3.8"
content-hash = "41155bca4070edc9eb6e6369890af55397251caeab4e5c2db62ef7785410853e" content-hash = "971f32ab1478240f072615b119a1df87aebccfb26e6ee4cf013d938ff15db690"
[metadata.files] [metadata.files]
atomicwrites = [ atomicwrites = [
@ -596,80 +588,6 @@ more-itertools = [
{file = "more-itertools-8.12.0.tar.gz", hash = "sha256:7dc6ad46f05f545f900dd59e8dfb4e84a4827b97b3cfecb175ea0c7d247f6064"}, {file = "more-itertools-8.12.0.tar.gz", hash = "sha256:7dc6ad46f05f545f900dd59e8dfb4e84a4827b97b3cfecb175ea0c7d247f6064"},
{file = "more_itertools-8.12.0-py3-none-any.whl", hash = "sha256:43e6dd9942dffd72661a2c4ef383ad7da1e6a3e968a927ad7a6083ab410a688b"}, {file = "more_itertools-8.12.0-py3-none-any.whl", hash = "sha256:43e6dd9942dffd72661a2c4ef383ad7da1e6a3e968a927ad7a6083ab410a688b"},
] ]
multidict = [
{file = "multidict-5.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3822c5894c72e3b35aae9909bef66ec83e44522faf767c0ad39e0e2de11d3b55"},
{file = "multidict-5.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:28e6d883acd8674887d7edc896b91751dc2d8e87fbdca8359591a13872799e4e"},
{file = "multidict-5.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b61f85101ef08cbbc37846ac0e43f027f7844f3fade9b7f6dd087178caedeee7"},
{file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9b668c065968c5979fe6b6fa6760bb6ab9aeb94b75b73c0a9c1acf6393ac3bf"},
{file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:517d75522b7b18a3385726b54a081afd425d4f41144a5399e5abd97ccafdf36b"},
{file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b4ac3ba7a97b35a5ccf34f41b5a8642a01d1e55454b699e5e8e7a99b5a3acf5"},
{file = "multidict-5.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:df23c83398715b26ab09574217ca21e14694917a0c857e356fd39e1c64f8283f"},
{file = "multidict-5.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e58a9b5cc96e014ddf93c2227cbdeca94b56a7eb77300205d6e4001805391747"},
{file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f76440e480c3b2ca7f843ff8a48dc82446b86ed4930552d736c0bac507498a52"},
{file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cfde464ca4af42a629648c0b0d79b8f295cf5b695412451716531d6916461628"},
{file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0fed465af2e0eb6357ba95795d003ac0bdb546305cc2366b1fc8f0ad67cc3fda"},
{file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:b70913cbf2e14275013be98a06ef4b412329fe7b4f83d64eb70dce8269ed1e1a"},
{file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5635bcf1b75f0f6ef3c8a1ad07b500104a971e38d3683167b9454cb6465ac86"},
{file = "multidict-5.2.0-cp310-cp310-win32.whl", hash = "sha256:77f0fb7200cc7dedda7a60912f2059086e29ff67cefbc58d2506638c1a9132d7"},
{file = "multidict-5.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:9416cf11bcd73c861267e88aea71e9fcc35302b3943e45e1dbb4317f91a4b34f"},
{file = "multidict-5.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fd77c8f3cba815aa69cb97ee2b2ef385c7c12ada9c734b0f3b32e26bb88bbf1d"},
{file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ec9aea6223adf46999f22e2c0ab6cf33f5914be604a404f658386a8f1fba37"},
{file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5283c0a00f48e8cafcecadebfa0ed1dac8b39e295c7248c44c665c16dc1138b"},
{file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f79c19c6420962eb17c7e48878a03053b7ccd7b69f389d5831c0a4a7f1ac0a1"},
{file = "multidict-5.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4a67f1080123de76e4e97a18d10350df6a7182e243312426d508712e99988d4"},
{file = "multidict-5.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:94b117e27efd8e08b4046c57461d5a114d26b40824995a2eb58372b94f9fca02"},
{file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2e77282fd1d677c313ffcaddfec236bf23f273c4fba7cdf198108f5940ae10f5"},
{file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:116347c63ba049c1ea56e157fa8aa6edaf5e92925c9b64f3da7769bdfa012858"},
{file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:dc3a866cf6c13d59a01878cd806f219340f3e82eed514485e094321f24900677"},
{file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac42181292099d91217a82e3fa3ce0e0ddf3a74fd891b7c2b347a7f5aa0edded"},
{file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:f0bb0973f42ffcb5e3537548e0767079420aefd94ba990b61cf7bb8d47f4916d"},
{file = "multidict-5.2.0-cp36-cp36m-win32.whl", hash = "sha256:ea21d4d5104b4f840b91d9dc8cbc832aba9612121eaba503e54eaab1ad140eb9"},
{file = "multidict-5.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:e6453f3cbeb78440747096f239d282cc57a2997a16b5197c9bc839099e1633d0"},
{file = "multidict-5.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3def943bfd5f1c47d51fd324df1e806d8da1f8e105cc7f1c76a1daf0f7e17b0"},
{file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35591729668a303a02b06e8dba0eb8140c4a1bfd4c4b3209a436a02a5ac1de11"},
{file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8cacda0b679ebc25624d5de66c705bc53dcc7c6f02a7fb0f3ca5e227d80422"},
{file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:baf1856fab8212bf35230c019cde7c641887e3fc08cadd39d32a421a30151ea3"},
{file = "multidict-5.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a43616aec0f0d53c411582c451f5d3e1123a68cc7b3475d6f7d97a626f8ff90d"},
{file = "multidict-5.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25cbd39a9029b409167aa0a20d8a17f502d43f2efebfe9e3ac019fe6796c59ac"},
{file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a2cbcfbea6dc776782a444db819c8b78afe4db597211298dd8b2222f73e9cd0"},
{file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d2d7d1fff8e09d99354c04c3fd5b560fb04639fd45926b34e27cfdec678a704"},
{file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a37e9a68349f6abe24130846e2f1d2e38f7ddab30b81b754e5a1fde32f782b23"},
{file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:637c1896497ff19e1ee27c1c2c2ddaa9f2d134bbb5e0c52254361ea20486418d"},
{file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9815765f9dcda04921ba467957be543423e5ec6a1136135d84f2ae092c50d87b"},
{file = "multidict-5.2.0-cp37-cp37m-win32.whl", hash = "sha256:8b911d74acdc1fe2941e59b4f1a278a330e9c34c6c8ca1ee21264c51ec9b67ef"},
{file = "multidict-5.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:380b868f55f63d048a25931a1632818f90e4be71d2081c2338fcf656d299949a"},
{file = "multidict-5.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e7d81ce5744757d2f05fc41896e3b2ae0458464b14b5a2c1e87a6a9d69aefaa8"},
{file = "multidict-5.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d1d55cdf706ddc62822d394d1df53573d32a7a07d4f099470d3cb9323b721b6"},
{file = "multidict-5.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4771d0d0ac9d9fe9e24e33bed482a13dfc1256d008d101485fe460359476065"},
{file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da7d57ea65744d249427793c042094c4016789eb2562576fb831870f9c878d9e"},
{file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdd68778f96216596218b4e8882944d24a634d984ee1a5a049b300377878fa7c"},
{file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecc99bce8ee42dcad15848c7885197d26841cb24fa2ee6e89d23b8993c871c64"},
{file = "multidict-5.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:067150fad08e6f2dd91a650c7a49ba65085303fcc3decbd64a57dc13a2733031"},
{file = "multidict-5.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:78c106b2b506b4d895ddc801ff509f941119394b89c9115580014127414e6c2d"},
{file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6c4fa1ec16e01e292315ba76eb1d012c025b99d22896bd14a66628b245e3e01"},
{file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b227345e4186809d31f22087d0265655114af7cda442ecaf72246275865bebe4"},
{file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:06560fbdcf22c9387100979e65b26fba0816c162b888cb65b845d3def7a54c9b"},
{file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7878b61c867fb2df7a95e44b316f88d5a3742390c99dfba6c557a21b30180cac"},
{file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:246145bff76cc4b19310f0ad28bd0769b940c2a49fc601b86bfd150cbd72bb22"},
{file = "multidict-5.2.0-cp38-cp38-win32.whl", hash = "sha256:c30ac9f562106cd9e8071c23949a067b10211917fdcb75b4718cf5775356a940"},
{file = "multidict-5.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:f19001e790013ed580abfde2a4465388950728861b52f0da73e8e8a9418533c0"},
{file = "multidict-5.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c1ff762e2ee126e6f1258650ac641e2b8e1f3d927a925aafcfde943b77a36d24"},
{file = "multidict-5.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bd6c9c50bf2ad3f0448edaa1a3b55b2e6866ef8feca5d8dbec10ec7c94371d21"},
{file = "multidict-5.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc66d4016f6e50ed36fb39cd287a3878ffcebfa90008535c62e0e90a7ab713ae"},
{file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9acb76d5f3dd9421874923da2ed1e76041cb51b9337fd7f507edde1d86535d6"},
{file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfc924a7e946dd3c6360e50e8f750d51e3ef5395c95dc054bc9eab0f70df4f9c"},
{file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32fdba7333eb2351fee2596b756d730d62b5827d5e1ab2f84e6cbb287cc67fe0"},
{file = "multidict-5.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b9aad49466b8d828b96b9e3630006234879c8d3e2b0a9d99219b3121bc5cdb17"},
{file = "multidict-5.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:93de39267c4c676c9ebb2057e98a8138bade0d806aad4d864322eee0803140a0"},
{file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f9bef5cff994ca3026fcc90680e326d1a19df9841c5e3d224076407cc21471a1"},
{file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5f841c4f14331fd1e36cbf3336ed7be2cb2a8f110ce40ea253e5573387db7621"},
{file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:38ba256ee9b310da6a1a0f013ef4e422fca30a685bcbec86a969bd520504e341"},
{file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3bc3b1621b979621cee9f7b09f024ec76ec03cc365e638126a056317470bde1b"},
{file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ee908c070020d682e9b42c8f621e8bb10c767d04416e2ebe44e37d0f44d9ad5"},
{file = "multidict-5.2.0-cp39-cp39-win32.whl", hash = "sha256:1c7976cd1c157fa7ba5456ae5d31ccdf1479680dc9b8d8aa28afabc370df42b8"},
{file = "multidict-5.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:c9631c642e08b9fff1c6255487e62971d8b8e821808ddd013d8ac058087591ac"},
{file = "multidict-5.2.0.tar.gz", hash = "sha256:0dd1c93edb444b33ba2274b66f63def8a327d607c6c790772f448a53b6ea59ce"},
]
mypy = [ mypy = [
{file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"},
{file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"},

View File

@ -8,7 +8,6 @@ repository = "https://github.com/Stepland/jubeatools"
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.8" python = "^3.8"
multidict = "^5.1.0"
click = "^8.0.3" click = "^8.0.3"
path = "^15.1.2" path = "^15.1.2"
simplejson = "^3.17.0" simplejson = "^3.17.0"