1
Fork 0
mirror of https://github.com/Steffo99/lihzahrd.git synced 2024-10-16 06:27:29 +00:00

🧹 Run Black on all files

This commit is contained in:
Steffo 2022-02-11 18:05:29 +01:00
parent be05058df4
commit 21e2983072
Signed by: steffo
GPG key ID: 6965406171929D01
49 changed files with 845 additions and 586 deletions

View file

@ -17,9 +17,9 @@
# -- Project information ----------------------------------------------------- # -- Project information -----------------------------------------------------
project = 'lihzahrd' project = "lihzahrd"
copyright = '2020, Stefano Pigozzi' copyright = "2020, Stefano Pigozzi"
author = 'Stefano Pigozzi' author = "Stefano Pigozzi"
# -- General configuration --------------------------------------------------- # -- General configuration ---------------------------------------------------
@ -39,16 +39,16 @@ def skip(app, what, name: str, obj, would_skip, options):
def setup(app): def setup(app):
app.add_stylesheet('lihzahrd.css') app.add_stylesheet("lihzahrd.css")
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates'] templates_path = ["_templates"]
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path. # This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
# -- Options for HTML output ------------------------------------------------- # -- Options for HTML output -------------------------------------------------
@ -56,9 +56,9 @@ exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The theme to use for HTML and HTML Help pages. See the documentation for # The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes. # a list of builtin themes.
# #
html_theme = 'sphinx_rtd_theme' html_theme = "sphinx_rtd_theme"
# Add any paths that contain custom static files (such as style sheets) here, # Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files, # relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css". # so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static'] html_static_path = ["_static"]

View file

@ -7,10 +7,7 @@ class Bestiary:
__slots__ = "chats", "kills", "sightings" __slots__ = "chats", "kills", "sightings"
def __init__(self, def __init__(self, chats: List[EntityType], kills: Dict[EntityType, int], sightings: List[EntityType]):
chats: List[EntityType],
kills: Dict[EntityType, int],
sightings: List[EntityType]):
self.chats: List[EntityType] = chats self.chats: List[EntityType] = chats
self.kills: Dict[EntityType, int] = kills self.kills: Dict[EntityType, int] = kills
self.sightings: List[EntityType] = sightings self.sightings: List[EntityType] = sightings

View file

@ -14,5 +14,7 @@ class Chest:
self.contents: typing.List[ItemStack] = contents self.contents: typing.List[ItemStack] = contents
def __repr__(self): def __repr__(self):
return f'<Chest "{self.name}" at {self.position} ' \ return (
f'with {len(list(filter(lambda x: x is not None, self.contents)))} items>' f'<Chest "{self.name}" at {self.position} '
f"with {len(list(filter(lambda x: x is not None, self.contents)))} items>"
)

View file

@ -5,6 +5,7 @@ class BlockType(enum.IntEnum):
"""All possible block types. """All possible block types.
Data from https://github.com/tModLoader/tModLoader/wiki/Vanilla-Tile-IDs.""" Data from https://github.com/tModLoader/tModLoader/wiki/Vanilla-Tile-IDs."""
DIRT = 0 DIRT = 0
STONE = 1 STONE = 1
GRASS = 2 GRASS = 2

View file

@ -3,6 +3,7 @@ import enum
class EntityType(enum.IntEnum): class EntityType(enum.IntEnum):
"""An enumeration of all Terraria entities.""" """An enumeration of all Terraria entities."""
# https://terraria.gamepedia.com/NPC_IDs # https://terraria.gamepedia.com/NPC_IDs
# Obtained from this wiki page with the following regex and adding BestiaryGirl = 633 manually # Obtained from this wiki page with the following regex and adding BestiaryGirl = 633 manually
# ^([0-9-]+)\s+[A-Za-z0-9()\s.,\-']+?\.(?:png|gif)\s+([A-Za-z0-9]+)$ # ^([0-9-]+)\s+[A-Za-z0-9()\s.,\-']+?\.(?:png|gif)\s+([A-Za-z0-9]+)$

View file

@ -5,6 +5,7 @@ class ItemType(enum.IntEnum):
"""List of all available Terraria item types. """List of all available Terraria item types.
From https://github.com/tModLoader/tModLoader/wiki/Vanilla-Item-IDs .""" From https://github.com/tModLoader/tModLoader/wiki/Vanilla-Item-IDs ."""
YELLOW_PHASESABER_OLD = -24 YELLOW_PHASESABER_OLD = -24
WHITE_PHASESABER_OLD = -23 WHITE_PHASESABER_OLD = -23
PURPLE_PHASESABER_OLD = -22 PURPLE_PHASESABER_OLD = -22

View file

@ -4,6 +4,7 @@ import functools
class LiquidType(enum.IntEnum): class LiquidType(enum.IntEnum):
"""All possible types of liquids.""" """All possible types of liquids."""
NO_LIQUID = 0 NO_LIQUID = 0
WATER = 1 WATER = 1
LAVA = 2 LAVA = 2

View file

@ -5,6 +5,7 @@ class WallType(enum.IntEnum):
"""All possible wall types. """All possible wall types.
Data from https://github.com/tModLoader/tModLoader/wiki/Vanilla-Wall-IDs.""" Data from https://github.com/tModLoader/tModLoader/wiki/Vanilla-Wall-IDs."""
STONE = 1 STONE = 1
DIRT_UNSAFE = 2 DIRT_UNSAFE = 2
EBONSTONE_UNSAFE = 3 EBONSTONE_UNSAFE = 3

View file

@ -2,6 +2,7 @@ class Coordinates:
__slots__ = "x", "y" __slots__ = "x", "y"
"""A pair of coordinates.""" """A pair of coordinates."""
def __init__(self, x, y): def __init__(self, x, y):
self.x = x self.x = x
self.y = y self.y = y

View file

@ -7,7 +7,7 @@ from .rect import Rect
class FileReader: class FileReader:
__slots__ = "file", __slots__ = ("file",)
def __init__(self, file: typing.IO): def __init__(self, file: typing.IO):
self.file: typing.IO = file self.file: typing.IO = file
@ -48,14 +48,16 @@ class FileReader:
@staticmethod @staticmethod
@functools.lru_cache(256) @functools.lru_cache(256)
def _bitify(data) -> typing.Tuple[bool, bool, bool, bool, bool, bool, bool, bool]: def _bitify(data) -> typing.Tuple[bool, bool, bool, bool, bool, bool, bool, bool]:
return (bool(data & 0b0000_0001), return (
bool(data & 0b0000_0001),
bool(data & 0b0000_0010), bool(data & 0b0000_0010),
bool(data & 0b0000_0100), bool(data & 0b0000_0100),
bool(data & 0b0000_1000), bool(data & 0b0000_1000),
bool(data & 0b0001_0000), bool(data & 0b0001_0000),
bool(data & 0b0010_0000), bool(data & 0b0010_0000),
bool(data & 0b0100_0000), bool(data & 0b0100_0000),
bool(data & 0b1000_0000)) bool(data & 0b1000_0000),
)
def bits(self) -> typing.Tuple[bool, bool, bool, bool, bool, bool, bool, bool]: def bits(self) -> typing.Tuple[bool, bool, bool, bool, bool, bool, bool, bool]:
data = struct.unpack("B", self.file.read(1))[0] data = struct.unpack("B", self.file.read(1))[0]

View file

@ -18,7 +18,8 @@ class Pointers:
"unknown", "unknown",
) )
def __init__(self, def __init__(
self,
world_header: int, world_header: int,
world_tiles: int, world_tiles: int,
chests: int, chests: int,
@ -30,7 +31,8 @@ class Pointers:
bestiary: int, bestiary: int,
journey_powers: int, journey_powers: int,
footer: int, footer: int,
*unknown): *unknown,
):
self.file_format: int = 0 self.file_format: int = 0
self.world_header: int = world_header self.world_header: int = world_header
self.world_tiles: int = world_tiles self.world_tiles: int = world_tiles

View file

@ -1,6 +1,8 @@
class Backgrounds: class Backgrounds:
"""The backgrounds of various world biomes.""" """The backgrounds of various world biomes."""
def __init__(self,
def __init__(
self,
bg_underground_snow: int, bg_underground_snow: int,
bg_underground_jungle: int, bg_underground_jungle: int,
bg_hell: int, bg_hell: int,
@ -16,7 +18,8 @@ class Backgrounds:
new_bg_2: int, new_bg_2: int,
new_bg_3: int, new_bg_3: int,
new_bg_4: int, new_bg_4: int,
new_bg_5: int,): new_bg_5: int,
):
self.bg_underground_snow: int = bg_underground_snow self.bg_underground_snow: int = bg_underground_snow
self.bg_underground_jungle: int = bg_underground_jungle self.bg_underground_jungle: int = bg_underground_jungle
self.bg_hell: int = bg_hell self.bg_hell: int = bg_hell
@ -35,7 +38,9 @@ class Backgrounds:
self.new_bg_5: int = new_bg_5 self.new_bg_5: int = new_bg_5
def __repr__(self): def __repr__(self):
return f"WorldBackgrounds({self.bg_underground_snow}, {self.bg_underground_jungle}, {self.bg_hell}," \ return (
f" {self.bg_forest}, {self.bg_corruption}, {self.bg_jungle}, {self.bg_snow}, {self.bg_hallow}," \ f"WorldBackgrounds({self.bg_underground_snow}, {self.bg_underground_jungle}, {self.bg_hell},"
f" {self.bg_crimson}, {self.bg_desert}, {self.bg_ocean}," \ f" {self.bg_forest}, {self.bg_corruption}, {self.bg_jungle}, {self.bg_snow}, {self.bg_hallow},"
f" {self.bg_crimson}, {self.bg_desert}, {self.bg_ocean},"
f" {self.new_bg_1}, {self.new_bg_2}, {self.new_bg_3}, {self.new_bg_4}, {self.new_bg_5})" f" {self.new_bg_1}, {self.new_bg_2}, {self.new_bg_3}, {self.new_bg_4}, {self.new_bg_5})"
)

View file

@ -3,7 +3,8 @@ from .oldonesarmytiers import OldOnesArmyTiers
class BossesDefeated: class BossesDefeated:
def __init__(self, def __init__(
self,
eye_of_cthulhu: bool, eye_of_cthulhu: bool,
eater_of_worlds: bool, eater_of_worlds: bool,
skeletron: bool, skeletron: bool,
@ -31,7 +32,8 @@ class BossesDefeated:
lunar_pillars: PillarsInfo, lunar_pillars: PillarsInfo,
old_ones_army: OldOnesArmyTiers, old_ones_army: OldOnesArmyTiers,
empress_of_light: bool, empress_of_light: bool,
queen_slime: bool): queen_slime: bool,
):
self.eye_of_cthulhu: bool = eye_of_cthulhu self.eye_of_cthulhu: bool = eye_of_cthulhu
self.eater_of_worlds: bool = eater_of_worlds self.eater_of_worlds: bool = eater_of_worlds
self.skeletron: bool = skeletron self.skeletron: bool = skeletron

View file

@ -1,5 +1,6 @@
class Clouds: class Clouds:
"""Information about... the clouds in the world?""" """Information about... the clouds in the world?"""
def __init__(self, bg_cloud: int, cloud_number: int, wind_speed: float): def __init__(self, bg_cloud: int, cloud_number: int, wind_speed: float):
self.bg_cloud: int = bg_cloud self.bg_cloud: int = bg_cloud
self.cloud_number: int = cloud_number self.cloud_number: int = cloud_number

View file

@ -5,9 +5,12 @@ from .sandstorm import Sandstorm
from .lunarevents import LunarEvents from .lunarevents import LunarEvents
from .lanternnight import LanternNight from .lanternnight import LanternNight
class Events: class Events:
"""Information about the ongoing world events.""" """Information about the ongoing world events."""
def __init__(self,
def __init__(
self,
blood_moon: bool, blood_moon: bool,
solar_eclipse: bool, solar_eclipse: bool,
invasion: Invasion, invasion: Invasion,
@ -16,7 +19,8 @@ class Events:
party: Party, party: Party,
sandstorm: Sandstorm, sandstorm: Sandstorm,
lunar_events: LunarEvents, lunar_events: LunarEvents,
lantern_night: LanternNight): lantern_night: LanternNight,
):
self.blood_moon: bool = blood_moon self.blood_moon: bool = blood_moon
"""If the current moon is a Blood Moon.""" """If the current moon is a Blood Moon."""

View file

@ -4,11 +4,7 @@ from .invasiontype import InvasionType
class Invasion: class Invasion:
"""Invasions (goblin army, pirates, martian madness...) related information.""" """Invasions (goblin army, pirates, martian madness...) related information."""
def __init__(self, delay: int, def __init__(self, delay: int, size: int, type_: InvasionType, position: float, size_start: int):
size: int,
type_: InvasionType,
position: float,
size_start: int):
self.delay: int = delay self.delay: int = delay
self.size: int = size self.size: int = size
@ -21,5 +17,7 @@ class Invasion:
self.size_start: int = size_start self.size_start: int = size_start
def __repr__(self): def __repr__(self):
return f"WorldInvasion(delay={self.delay}, size={self.size}, type_={self.type}, position={self.position}," \ return (
f"WorldInvasion(delay={self.delay}, size={self.size}, type_={self.type}, position={self.position},"
f" size_start={self.size_start})" f" size_start={self.size_start})"
)

View file

@ -3,11 +3,8 @@ import typing
class LanternNight: class LanternNight:
"""Lantern Night event related information.""" """Lantern Night event related information."""
def __init__(self,
nights_on_cooldown: int, def __init__(self, nights_on_cooldown: int, genuine: bool, manual: bool, next_night_is_lantern_night: bool):
genuine: bool,
manual: bool,
next_night_is_lantern_night: bool):
self.nights_on_cooldown: int = nights_on_cooldown self.nights_on_cooldown: int = nights_on_cooldown
"""How many nights before the next lantern night can happen.""" """How many nights before the next lantern night can happen."""
@ -21,8 +18,10 @@ class LanternNight:
"""Was a boss just defeated, making the next night a Lantern Night?""" """Was a boss just defeated, making the next night a Lantern Night?"""
def __repr__(self): def __repr__(self):
return f"WorldLanternNight(nights_on_cooldown={self.nights_on_cooldown}," \ return (
f"WorldLanternNight(nights_on_cooldown={self.nights_on_cooldown},"
f" genuine={self.genuine}, manual={self.manual}, nights_on_cooldown={self.nights_on_cooldown})" f" genuine={self.genuine}, manual={self.manual}, nights_on_cooldown={self.nights_on_cooldown})"
)
@property @property
def is_active(self): def is_active(self):

View file

@ -3,9 +3,8 @@ from .pillarsinfo import PillarsInfo
class LunarEvents: class LunarEvents:
"""Lunar Events (Lunar Pillars) related information.""" """Lunar Events (Lunar Pillars) related information."""
def __init__(self,
are_active: bool, def __init__(self, are_active: bool, pillars_present: PillarsInfo):
pillars_present: PillarsInfo):
self.are_active: bool = are_active self.are_active: bool = are_active
"""If the Lunar Events are active or not.""" """If the Lunar Events are active or not."""

View file

@ -3,6 +3,7 @@ import enum
class MoonStyle(enum.IntEnum): class MoonStyle(enum.IntEnum):
"""All possible moon styles.""" """All possible moon styles."""
WHITE = 0 WHITE = 0
ORANGE = 1 ORANGE = 1
RINGED_GREEN = 2 RINGED_GREEN = 2
@ -13,6 +14,5 @@ class MoonStyle(enum.IntEnum):
PINK_ORANGE = 7 PINK_ORANGE = 7
TRIPLE_PURPLE = 8 TRIPLE_PURPLE = 8
def __repr__(self): def __repr__(self):
return f"{self.__class__.__name__}.{self.name}" return f"{self.__class__.__name__}.{self.name}"

View file

@ -3,11 +3,10 @@ import typing
class Party: class Party:
"""NPC Party related information.""" """NPC Party related information."""
def __init__(self,
thrown_by_party_center: bool, def __init__(
thrown_by_npcs: bool, self, thrown_by_party_center: bool, thrown_by_npcs: bool, cooldown: int, partying_npcs: typing.List[int]
cooldown: int, ):
partying_npcs: typing.List[int]):
self.thrown_by_party_center: bool = thrown_by_party_center self.thrown_by_party_center: bool = thrown_by_party_center
"""If the party was started by right-clicking a Party Center.""" """If the party was started by right-clicking a Party Center."""
@ -21,8 +20,10 @@ class Party:
"""The list of NPC IDs that threw the party.""" """The list of NPC IDs that threw the party."""
def __repr__(self): def __repr__(self):
return f"WorldParty(thrown_by_party_center={self.thrown_by_party_center}," \ return (
f"WorldParty(thrown_by_party_center={self.thrown_by_party_center},"
f" thrown_by_npcs={self.thrown_by_npcs}, cooldown={self.cooldown}, partying_npcs={self.partying_npcs})" f" thrown_by_npcs={self.thrown_by_npcs}, cooldown={self.cooldown}, partying_npcs={self.partying_npcs})"
)
@property @property
def is_active(self): def is_active(self):

View file

@ -4,10 +4,7 @@ import typing
class Pets: class Pets:
"""Information about the Pet Licenses that were activated in the world.""" """Information about the Pet Licenses that were activated in the world."""
def __init__(self, def __init__(self, cat: bool, dog: bool, bunny: bool):
cat: bool,
dog: bool,
bunny: bool):
self.cat: bool = cat self.cat: bool = cat
"""Was the Cat License (https://terraria.gamepedia.com/Cat_License) ever activated?""" """Was the Cat License (https://terraria.gamepedia.com/Cat_License) ever activated?"""

View file

@ -1,5 +1,6 @@
class PillarsInfo: class PillarsInfo:
"""A container for information associated with the Lunar Pillars.""" """A container for information associated with the Lunar Pillars."""
def __init__(self, solar, vortex, nebula, stardust): def __init__(self, solar, vortex, nebula, stardust):
self.solar = solar self.solar = solar
self.vortex = vortex self.vortex = vortex

View file

@ -1,5 +1,6 @@
class Rain: class Rain:
"""Rain related information.""" """Rain related information."""
def __init__(self, is_active: bool, time_left: int, max_rain: float): def __init__(self, is_active: bool, time_left: int, max_rain: float):
self.is_active: bool = is_active self.is_active: bool = is_active
"""If it is currently raining in the world.""" """If it is currently raining in the world."""

View file

@ -1,10 +1,7 @@
class Sandstorm: class Sandstorm:
"""Sandstorm related information.""" """Sandstorm related information."""
def __init__(self,
is_active: bool, def __init__(self, is_active: bool, time_left: int, severity: float, intended_severity: float):
time_left: int,
severity: float,
intended_severity: float):
self.is_active: bool = is_active self.is_active: bool = is_active
"""If a sandstorm is currently ongoing in the desert.""" """If a sandstorm is currently ongoing in the desert."""
@ -15,5 +12,7 @@ class Sandstorm:
self.intended_severity: float = intended_severity self.intended_severity: float = intended_severity
def __repr__(self): def __repr__(self):
return f"WorldSandstorm(is_active={self.is_active}, time_left={self.time_left}," \ return (
f"WorldSandstorm(is_active={self.is_active}, time_left={self.time_left},"
f" severity={self.severity}, intended_severity={self.intended_severity})" f" severity={self.severity}, intended_severity={self.intended_severity})"
)

View file

@ -1,5 +1,6 @@
class SavedNPCs: class SavedNPCs:
def __init__(self, def __init__(
self,
goblin_tinkerer: bool, goblin_tinkerer: bool,
wizard: bool, wizard: bool,
mechanic: bool, mechanic: bool,
@ -8,7 +9,8 @@ class SavedNPCs:
tax_collector: bool, tax_collector: bool,
bartender: bool, bartender: bool,
golfer: bool, golfer: bool,
advanced_combat: bool): advanced_combat: bool,
):
self.goblin_tinkerer: bool = goblin_tinkerer self.goblin_tinkerer: bool = goblin_tinkerer
self.wizard: bool = wizard self.wizard: bool = wizard
self.mechanic: bool = mechanic self.mechanic: bool = mechanic
@ -21,6 +23,8 @@ class SavedNPCs:
"""Was the Advanced Combat Technique Book used.""" """Was the Advanced Combat Technique Book used."""
def __repr__(self): def __repr__(self):
return f"SavedNPCs(goblin_tinkerer={self.goblin_tinkerer}, wizard={self.wizard}, mechanic={self.mechanic}," \ return (
f" angler={self.angler}, stylist={self.stylist}, tax_collector={self.tax_collector}," \ f"SavedNPCs(goblin_tinkerer={self.goblin_tinkerer}, wizard={self.wizard}, mechanic={self.mechanic},"
f" angler={self.angler}, stylist={self.stylist}, tax_collector={self.tax_collector},"
f" bartender={self.bartender}, golfer={self.golfer}, advanced_combat={self.advanced_combat}" f" bartender={self.bartender}, golfer={self.golfer}, advanced_combat={self.advanced_combat}"
)

View file

@ -5,14 +5,16 @@ from ..enums import BlockType
class SavedOreTiers: class SavedOreTiers:
"""The types of ores that generated in the world.""" """The types of ores that generated in the world."""
def __init__(self, def __init__(
self,
tier_1: BlockType, tier_1: BlockType,
tier_2: BlockType, tier_2: BlockType,
tier_3: BlockType, tier_3: BlockType,
tier_4: BlockType, tier_4: BlockType,
hardmode_tier_1: Optional[BlockType], hardmode_tier_1: Optional[BlockType],
hardmode_tier_2: Optional[BlockType], hardmode_tier_2: Optional[BlockType],
hardmode_tier_3: Optional[BlockType]): hardmode_tier_3: Optional[BlockType],
):
self.tier_1: BlockType = tier_1 self.tier_1: BlockType = tier_1
"""Copper or Tin?""" """Copper or Tin?"""
@ -32,21 +34,27 @@ class SavedOreTiers:
self.hardmode_tier_1: Optional[BlockType] = hardmode_tier_1 self.hardmode_tier_1: Optional[BlockType] = hardmode_tier_1
"""Cobalt or Palladium? None if it hasn't been determined yet.""" """Cobalt or Palladium? None if it hasn't been determined yet."""
assert self.hardmode_tier_1 is None \ assert (
or self.hardmode_tier_1 == BlockType.COBALT \ self.hardmode_tier_1 is None
or self.hardmode_tier_1 == BlockType.COBALT
or self.hardmode_tier_1 == BlockType.PALLADIUM or self.hardmode_tier_1 == BlockType.PALLADIUM
)
self.hardmode_tier_2: Optional[BlockType] = hardmode_tier_2 self.hardmode_tier_2: Optional[BlockType] = hardmode_tier_2
"""Mythril or Orichalcum? None if it hasn't been determined yet.""" """Mythril or Orichalcum? None if it hasn't been determined yet."""
assert self.hardmode_tier_2 is None \ assert (
or self.hardmode_tier_2 == BlockType.MYTHRIL \ self.hardmode_tier_2 is None
or self.hardmode_tier_2 == BlockType.MYTHRIL
or self.hardmode_tier_2 == BlockType.ORICHALCUM or self.hardmode_tier_2 == BlockType.ORICHALCUM
)
self.hardmode_tier_3: Optional[BlockType] = hardmode_tier_3 self.hardmode_tier_3: Optional[BlockType] = hardmode_tier_3
"""Adamantite or Titanium? None if it hasn't been determined yet.""" """Adamantite or Titanium? None if it hasn't been determined yet."""
assert self.hardmode_tier_3 is None \ assert (
or self.hardmode_tier_3 == BlockType.ADAMANTITE \ self.hardmode_tier_3 is None
or self.hardmode_tier_3 == BlockType.ADAMANTITE
or self.hardmode_tier_3 == BlockType.TITANIUM or self.hardmode_tier_3 == BlockType.TITANIUM
)
def __repr__(self): def __repr__(self):
return f"<SavedOreTiers>" return f"<SavedOreTiers>"

View file

@ -1,10 +1,7 @@
class ShadowOrbs: class ShadowOrbs:
"""Information related to the Shadow Orbs (or the Crimson Hearts) smashed in the world.""" """Information related to the Shadow Orbs (or the Crimson Hearts) smashed in the world."""
def __init__(self, def __init__(self, smashed_at_least_once: bool, spawn_meteorite: bool, evil_boss_counter: int):
smashed_at_least_once: bool,
spawn_meteorite: bool,
evil_boss_counter: int):
self.smashed_at_least_once: bool = smashed_at_least_once self.smashed_at_least_once: bool = smashed_at_least_once
"""If a Shadow Orb has ever been smashed in this world.""" """If a Shadow Orb has ever been smashed in this world."""
@ -19,5 +16,7 @@ class ShadowOrbs:
It is the number of Shadow Orbs broken, modulo 3.""" It is the number of Shadow Orbs broken, modulo 3."""
def __repr__(self): def __repr__(self):
return f"WorldShadowOrbs(smashed_at_least_once={self.smashed_at_least_once}," \ return (
f"WorldShadowOrbs(smashed_at_least_once={self.smashed_at_least_once},"
f" spawn_meteorite={self.spawn_meteorite}, evil_boss_counter={self.evil_boss_counter})" f" spawn_meteorite={self.spawn_meteorite}, evil_boss_counter={self.evil_boss_counter})"
)

View file

@ -4,10 +4,13 @@ from .fourpartsplit import FourPartSplit
class Styles: class Styles:
"""The styles of various world elements.""" """The styles of various world elements."""
def __init__(self,
def __init__(
self,
moon: MoonStyle, moon: MoonStyle,
trees: FourPartSplit, trees: FourPartSplit,
moss: FourPartSplit, ): moss: FourPartSplit,
):
self.moon: MoonStyle = moon self.moon: MoonStyle = moon
self.trees: FourPartSplit = trees self.trees: FourPartSplit = trees
self.moss: FourPartSplit = moss self.moss: FourPartSplit = moss

View file

@ -1,10 +1,9 @@
class Time: class Time:
"""Game time related information.""" """Game time related information."""
def __init__(self, current: float,
is_daytime: bool, def __init__(
moon_phase: int, self, current: float, is_daytime: bool, moon_phase: int, sundial_cooldown: int, fast_forward_time: bool
sundial_cooldown: int, ):
fast_forward_time: bool):
self.current: float = current self.current: float = current
"""The current game time.""" """The current game time."""
@ -20,5 +19,7 @@ class Time:
self.fast_forward_time: bool = fast_forward_time self.fast_forward_time: bool = fast_forward_time
def __repr__(self): def __repr__(self):
return f"WorldTime(current={self.current}, is_daytime={self.is_daytime}, moon_phase={self.moon_phase}," \ return (
f"WorldTime(current={self.current}, is_daytime={self.is_daytime}, moon_phase={self.moon_phase},"
f" sundial_cooldown={self.sundial_cooldown}, fast_forward_time={self.fast_forward_time})" f" sundial_cooldown={self.sundial_cooldown}, fast_forward_time={self.fast_forward_time})"
)

View file

@ -52,7 +52,7 @@ class Version:
227: "1.4.0.3", 227: "1.4.0.3",
228: "1.4.0.4", 228: "1.4.0.4",
230: "1.4.0.5", 230: "1.4.0.5",
238: "1.4.2.3" 238: "1.4.2.3",
} }
def __init__(self, data: typing.Union[int, str]): def __init__(self, data: typing.Union[int, str]):

View file

@ -4,12 +4,10 @@ from ..enums import ItemType, PrefixType
class ItemStack: class ItemStack:
"""A stack of a certain item.""" """A stack of a certain item."""
__slots__ = "type", "quantity", "prefix" __slots__ = "type", "quantity", "prefix"
def __init__(self, def __init__(self, type_: ItemType, quantity: int = 1, prefix: Optional[PrefixType] = None):
type_: ItemType,
quantity: int = 1,
prefix: Optional[PrefixType] = None):
self.type: ItemType = type_ self.type: ItemType = type_
"""The type of item represented in this stack.""" """The type of item represented in this stack."""

View file

@ -15,13 +15,15 @@ class JourneyPowers:
"freeze_biome_spread", "freeze_biome_spread",
) )
def __init__(self, def __init__(
self,
freeze_time: typing.Optional[bool] = None, freeze_time: typing.Optional[bool] = None,
time_rate: typing.Optional[float] = None, time_rate: typing.Optional[float] = None,
freeze_rain: typing.Optional[bool] = None, freeze_rain: typing.Optional[bool] = None,
freeze_wind: typing.Optional[bool] = None, freeze_wind: typing.Optional[bool] = None,
difficulty: typing.Optional[float] = None, difficulty: typing.Optional[float] = None,
freeze_biome_spread: typing.Optional[bool] = None): freeze_biome_spread: typing.Optional[bool] = None,
):
self.freeze_time: bool = freeze_time self.freeze_time: bool = freeze_time
"""Is time frozen?""" """Is time frozen?"""
@ -42,11 +44,13 @@ class JourneyPowers:
"""Can evil biomes & the hallow spread.""" """Can evil biomes & the hallow spread."""
def __repr__(self): def __repr__(self):
return f"JourneyPowers(" \ return (
f"freeze_time={self.freeze_time}," \ f"JourneyPowers("
f" freeze_rain={self.freeze_rain}," \ f"freeze_time={self.freeze_time},"
f" freeze_wind={self.freeze_wind}," \ f" freeze_rain={self.freeze_rain},"
f" freeze_biome_spread={self.freeze_biome_spread}," \ f" freeze_wind={self.freeze_wind},"
f" time_rate={self.time_rate}," \ f" freeze_biome_spread={self.freeze_biome_spread},"
f" difficulty={self.difficulty}" \ f" time_rate={self.time_rate},"
f" difficulty={self.difficulty}"
f")" f")"
)

View file

@ -8,9 +8,11 @@ class Mob:
__slots__ = "type", "position" __slots__ = "type", "position"
def __init__(self, def __init__(
self,
type_: EntityType, type_: EntityType,
position: Coordinates, ): position: Coordinates,
):
self.type: EntityType = type_ self.type: EntityType = type_
"""The type of entity this object represents.""" """The type of entity this object represents."""

View file

@ -9,12 +9,14 @@ class NPC(Mob):
__slots__ = "type", "name", "position", "home", "variation_index" __slots__ = "type", "name", "position", "home", "variation_index"
def __init__(self, def __init__(
self,
type_: EntityType, type_: EntityType,
position: Coordinates, position: Coordinates,
name: str, name: str,
variation_index: int, variation_index: int,
home: Optional[Coordinates] = None): home: Optional[Coordinates] = None,
):
super().__init__(type_, position) super().__init__(type_, position)

View file

@ -7,9 +7,7 @@ class ClothingDisplay:
__slots__ = "items", "dyes" __slots__ = "items", "dyes"
def __init__(self, def __init__(self, items: List[ItemStack], dyes: List[ItemStack]):
items: List[ItemStack],
dyes: List[ItemStack]):
self.items: List[ItemStack] = items self.items: List[ItemStack] = items
"""What items is the display wearing.""" """What items is the display wearing."""

View file

@ -5,6 +5,7 @@ from .clothingdisplay import ClothingDisplay
class HatRack(ClothingDisplay): class HatRack(ClothingDisplay):
"""A `Hat Rack <https://terraria.gamepedia.com/Hat_Rack>`_ containing up to 2 dyed helmets.""" """A `Hat Rack <https://terraria.gamepedia.com/Hat_Rack>`_ containing up to 2 dyed helmets."""
def __init__(self, items: List[ItemStack], dyes: List[ItemStack]): def __init__(self, items: List[ItemStack], dyes: List[ItemStack]):
super().__init__(items, dyes) super().__init__(items, dyes)
assert len(items) == 2 assert len(items) == 2

View file

@ -7,6 +7,7 @@ class Mannequin(ClothingDisplay):
"""A `Mannequin <https://terraria.gamepedia.com/Mannequin>`_ """A `Mannequin <https://terraria.gamepedia.com/Mannequin>`_
/ `Womannequin <https://terraria.gamepedia.com/Womannequin>`_ containing up to 3 dyed armor pieces and up / `Womannequin <https://terraria.gamepedia.com/Womannequin>`_ containing up to 3 dyed armor pieces and up
to 5 dyed accessories.""" to 5 dyed accessories."""
def __init__(self, items: List[ItemStack], dyes: List[ItemStack]): def __init__(self, items: List[ItemStack], dyes: List[ItemStack]):
super().__init__(items, dyes) super().__init__(items, dyes)
assert len(items) == 8 assert len(items) == 8

View file

@ -10,10 +10,7 @@ class TileEntity:
__slots__ = "id", "position", "data" __slots__ = "id", "position", "data"
def __init__(self, def __init__(self, id_: int, position: Coordinates, extra: typing.Union[TargetDummy, ItemFrame, LogicSensor]):
id_: int,
position: Coordinates,
extra: typing.Union[TargetDummy, ItemFrame, LogicSensor]):
self.id: int = id_ self.id: int = id_
self.position: Coordinates = position self.position: Coordinates = position
self.data: typing.Union[TargetDummy, ItemFrame, LogicSensor] = extra self.data: typing.Union[TargetDummy, ItemFrame, LogicSensor] = extra

View file

@ -7,5 +7,4 @@ from .liquid import Liquid
from .tile import Tile from .tile import Tile
from .tilematrix import TileMatrix from .tilematrix import TileMatrix
__all__ = ["Shape", "Wiring", "FrameImportantData", "Block", __all__ = ["Shape", "Wiring", "FrameImportantData", "Block", "Wall", "Liquid", "Tile", "TileMatrix"]
"Wall", "Liquid", "Tile", "TileMatrix"]

View file

@ -9,12 +9,14 @@ class Block:
__slots__ = "type", "frame", "shape", "paint", "is_active" __slots__ = "type", "frame", "shape", "paint", "is_active"
def __init__(self, def __init__(
self,
type_: BlockType, type_: BlockType,
shape: Shape = Shape.NORMAL, shape: Shape = Shape.NORMAL,
frame: typing.Optional[FrameImportantData] = None, frame: typing.Optional[FrameImportantData] = None,
paint: typing.Optional[int] = None, paint: typing.Optional[int] = None,
is_active: bool = True): is_active: bool = True,
):
self.type: BlockType = type_ self.type: BlockType = type_
"""The type of the block (dirt, stone, ...).""" """The type of the block (dirt, stone, ...)."""

View file

@ -14,12 +14,14 @@ class Tile:
__slots__ = "block", "wall", "liquid", "wiring", "extra" __slots__ = "block", "wall", "liquid", "wiring", "extra"
def __init__(self, def __init__(
self,
block: typing.Optional[Block] = None, block: typing.Optional[Block] = None,
wall: typing.Optional[Wall] = None, wall: typing.Optional[Wall] = None,
liquid: typing.Optional[Liquid] = None, liquid: typing.Optional[Liquid] = None,
wiring: typing.Optional[Wiring] = None, wiring: typing.Optional[Wiring] = None,
extra: typing.Optional[typing.Union[Chest, Sign, WeighedPressurePlate, TileEntity]] = None): extra: typing.Optional[typing.Union[Chest, Sign, WeighedPressurePlate, TileEntity]] = None,
):
if wiring is None: if wiring is None:
wiring = Wiring() wiring = Wiring()
@ -32,9 +34,11 @@ class Tile:
"""A reference to the extra data of this tile, such as Chest or Sign data.""" """A reference to the extra data of this tile, such as Chest or Sign data."""
def __repr__(self): def __repr__(self):
tile_status = f"{'B' if self.block else ''}" \ tile_status = (
f"{'W' if self.wall else ''}" \ f"{'B' if self.block else ''}"
f"{'L' if self.liquid else ''}" \ f"{'W' if self.wall else ''}"
f"{'W' if self.wiring else ''}" \ f"{'L' if self.liquid else ''}"
f"{'W' if self.wiring else ''}"
f"{'E' if self.extra else ''}" f"{'E' if self.extra else ''}"
)
return f"<Tile{' ' if tile_status else ''}{tile_status}>" return f"<Tile{' ' if tile_status else ''}{tile_status}>"

View file

@ -6,12 +6,9 @@ class Wiring:
__slots__ = "red", "green", "blue", "yellow", "actuator" __slots__ = "red", "green", "blue", "yellow", "actuator"
def __init__(self, def __init__(
red: bool = False, self, red: bool = False, green: bool = False, blue: bool = False, yellow: bool = False, actuator: bool = False
green: bool = False, ):
blue: bool = False,
yellow: bool = False,
actuator: bool = False):
self.red: bool = red self.red: bool = red
"""If there's a red Wire in the tile.""" """If there's a red Wire in the tile."""
@ -28,8 +25,10 @@ class Wiring:
"""If there's an Actuator in the tile.""" """If there's an Actuator in the tile."""
def __repr__(self): def __repr__(self):
return f"Wires(red={self.red}, green={self.green}, blue={self.blue}, yellow={self.yellow}," \ return (
f"Wires(red={self.red}, green={self.green}, blue={self.blue}, yellow={self.yellow},"
f" actuator={self.actuator})" f" actuator={self.actuator})"
)
def __bool__(self): def __bool__(self):
return self.red or self.green or self.blue or self.yellow or self.actuator return self.red or self.green or self.blue or self.yellow or self.actuator

View file

@ -4,6 +4,7 @@ import typing
class Timer: class Timer:
"""An object to track and print the time required to perform a section of code.""" """An object to track and print the time required to perform a section of code."""
def __init__(self, name: str, display: bool = True): def __init__(self, name: str, display: bool = True):
self.name: str = name self.name: str = name
self.display: bool = display self.display: bool = display

View file

@ -20,7 +20,8 @@ from .errors import InvalidFooterError
class World: class World:
"""The Python representation of a Terraria world.""" """The Python representation of a Terraria world."""
def __init__(self, def __init__(
self,
version: Version, version: Version,
savefile_type: int, savefile_type: int,
revision: int, revision: int,
@ -78,7 +79,8 @@ class World:
unknown_pressure_plates_data: bytes = b"", unknown_pressure_plates_data: bytes = b"",
unknown_town_manager_data: bytes = b"", unknown_town_manager_data: bytes = b"",
unknown_bestiary_data: bytes = b"", unknown_bestiary_data: bytes = b"",
unknown_journey_powers_data: bytes = b""): unknown_journey_powers_data: bytes = b"",
):
self.version: Version = version self.version: Version = version
"""The game version when this savefile was last saved.""" """The game version when this savefile was last saved."""
@ -291,11 +293,9 @@ class World:
block_paint = fr.uint1() block_paint = fr.uint1()
else: else:
block_paint = None block_paint = None
block = Block(type_=block_type, block = Block(
frame=frame, type_=block_type, frame=frame, paint=block_paint, is_active=is_block_active, shape=block_shape
paint=block_paint, )
is_active=is_block_active,
shape=block_shape)
else: else:
block = None block = None
# Parse wall # Parse wall
@ -411,17 +411,15 @@ class World:
is_tenth_anniversary = f.bool() is_tenth_anniversary = f.bool()
created_on = f.datetime() created_on = f.datetime()
world_styles = Styles(moon=MoonStyle(f.uint1()), world_styles = Styles(
trees=FourPartSplit(separators=[f.int4(), f.int4(), f.int4()], moon=MoonStyle(f.uint1()),
properties=[f.int4(), trees=FourPartSplit(
f.int4(), separators=[f.int4(), f.int4(), f.int4()], properties=[f.int4(), f.int4(), f.int4(), f.int4()]
f.int4(), ),
f.int4()]), moss=FourPartSplit(
moss=FourPartSplit(separators=[f.int4(), f.int4(), f.int4()], separators=[f.int4(), f.int4(), f.int4()], properties=[f.int4(), f.int4(), f.int4(), f.int4()]
properties=[f.int4(), ),
f.int4(), )
f.int4(),
f.int4()]))
bg_underground_snow = f.int4() bg_underground_snow = f.int4()
bg_underground_jungle = f.int4() bg_underground_jungle = f.int4()
@ -462,9 +460,9 @@ class World:
defeated_frost_moon = f.bool() defeated_frost_moon = f.bool()
defeated_pirates = f.bool() defeated_pirates = f.bool()
shadow_orbs = ShadowOrbs(smashed_at_least_once=f.bool(), shadow_orbs = ShadowOrbs(
spawn_meteorite=f.bool(), smashed_at_least_once=f.bool(), spawn_meteorite=f.bool(), evil_boss_counter=f.uint1()
evil_boss_counter=f.uint1()) # was int4() ) # was int4()
altars_smashed = f.int4() altars_smashed = f.int4()
@ -513,19 +511,22 @@ class World:
saved_angler = f.bool() saved_angler = f.bool()
angler_today_quest_target = AnglerQuestFish(f.int4()) angler_today_quest_target = AnglerQuestFish(f.int4())
anglers_quest = AnglerQuest(current_goal=angler_today_quest_target, anglers_quest = AnglerQuest(
completed_by=angler_today_quest_completed_by) current_goal=angler_today_quest_target, completed_by=angler_today_quest_completed_by
)
saved_stylist = f.bool() saved_stylist = f.bool()
saved_tax_collector = f.bool() saved_tax_collector = f.bool()
saved_golfer = f.bool() saved_golfer = f.bool()
invasion_size_start = f.int4() # ??? invasion_size_start = f.int4() # ???
invasion = Invasion(delay=invasion_delay, invasion = Invasion(
delay=invasion_delay,
size=invasion_size, size=invasion_size,
type_=invasion_type, type_=invasion_type,
position=invasion_position, position=invasion_position,
size_start=invasion_size_start) size_start=invasion_size_start,
)
cultist_delay = f.int4() # ??? cultist_delay = f.int4() # ???
mob_types_count = f.int2() mob_types_count = f.int2()
@ -534,11 +535,13 @@ class World:
mob_kills[mob_id] = f.int4() mob_kills[mob_id] = f.int4()
fast_forward_time = f.bool() fast_forward_time = f.bool()
time = Time(current=current_time, time = Time(
current=current_time,
is_daytime=is_daytime, is_daytime=is_daytime,
moon_phase=moon_phase, moon_phase=moon_phase,
sundial_cooldown=sundial_cooldown, sundial_cooldown=sundial_cooldown,
fast_forward_time=fast_forward_time) fast_forward_time=fast_forward_time,
)
defeated_duke_fishron = f.bool() defeated_duke_fishron = f.bool()
defeated_martian_madness = f.bool() defeated_martian_madness = f.bool()
@ -551,11 +554,10 @@ class World:
defeated_everscream = f.bool() defeated_everscream = f.bool()
defeated_pillars = PillarsInfo(solar=f.bool(), vortex=f.bool(), nebula=f.bool(), stardust=f.bool()) defeated_pillars = PillarsInfo(solar=f.bool(), vortex=f.bool(), nebula=f.bool(), stardust=f.bool())
lunar_events = LunarEvents(pillars_present=PillarsInfo(solar=f.bool(), lunar_events = LunarEvents(
vortex=f.bool(), pillars_present=PillarsInfo(solar=f.bool(), vortex=f.bool(), nebula=f.bool(), stardust=f.bool()),
nebula=f.bool(), are_active=f.bool(),
stardust=f.bool()), )
are_active=f.bool())
party_center_active = f.bool() party_center_active = f.bool()
party_natural_active = f.bool() party_natural_active = f.bool()
@ -564,15 +566,14 @@ class World:
partying_npcs = [] partying_npcs = []
for _ in range(partying_npcs_count): for _ in range(partying_npcs_count):
partying_npcs.append(f.int4()) partying_npcs.append(f.int4())
party = Party(thrown_by_party_center=party_center_active, party = Party(
thrown_by_party_center=party_center_active,
thrown_by_npcs=party_natural_active, thrown_by_npcs=party_natural_active,
cooldown=party_cooldown, cooldown=party_cooldown,
partying_npcs=partying_npcs) partying_npcs=partying_npcs,
)
sandstorm = Sandstorm(is_active=f.bool(), sandstorm = Sandstorm(is_active=f.bool(), time_left=f.int4(), severity=f.single(), intended_severity=f.single())
time_left=f.int4(),
severity=f.single(),
intended_severity=f.single())
saved_bartender = f.bool() saved_bartender = f.bool()
@ -616,12 +617,13 @@ class World:
tax_collector=saved_tax_collector, tax_collector=saved_tax_collector,
bartender=saved_bartender, bartender=saved_bartender,
golfer=saved_golfer, golfer=saved_golfer,
advanced_combat=combat_book_used advanced_combat=combat_book_used,
) )
lantern_night = LanternNight(f.int4(), f.bool(), f.bool(), f.bool()) lantern_night = LanternNight(f.int4(), f.bool(), f.bool(), f.bool())
events = Events(blood_moon=blood_moon, events = Events(
blood_moon=blood_moon,
solar_eclipse=eclipse, solar_eclipse=eclipse,
invasion=invasion, invasion=invasion,
slime_rain=time_left_slime_rain, slime_rain=time_left_slime_rain,
@ -629,7 +631,8 @@ class World:
party=party, party=party,
sandstorm=sandstorm, sandstorm=sandstorm,
lunar_events=lunar_events, lunar_events=lunar_events,
lantern_night=lantern_night) lantern_night=lantern_night,
)
treetop_variant_count = f.int4() treetop_variant_count = f.int4()
treetop_variants = TreetopVariants([f.int4() for _ in range(treetop_variant_count)]) treetop_variants = TreetopVariants([f.int4() for _ in range(treetop_variant_count)])
@ -648,7 +651,8 @@ class World:
defeated_empress_of_light = f.bool() defeated_empress_of_light = f.bool()
defeated_queen_slime = f.bool() defeated_queen_slime = f.bool()
bosses_defeated = BossesDefeated(eye_of_cthulhu=defeated_eye_of_cthulhu, bosses_defeated = BossesDefeated(
eye_of_cthulhu=defeated_eye_of_cthulhu,
eater_of_worlds=defeated_eater_of_worlds, eater_of_worlds=defeated_eater_of_worlds,
skeletron=defeated_skeletron, skeletron=defeated_skeletron,
queen_bee=defeated_queen_bee, queen_bee=defeated_queen_bee,
@ -675,7 +679,8 @@ class World:
martian_madness=defeated_martian_madness, martian_madness=defeated_martian_madness,
lunatic_cultist=defeated_lunatic_cultist, lunatic_cultist=defeated_lunatic_cultist,
empress_of_light=defeated_empress_of_light, empress_of_light=defeated_empress_of_light,
queen_slime=defeated_queen_slime) queen_slime=defeated_queen_slime,
)
unknown_world_header_data = f.read_until(pointers.world_tiles) unknown_world_header_data = f.read_until(pointers.world_tiles)
@ -700,15 +705,11 @@ class World:
if item_quantity > 0: if item_quantity > 0:
item_type = ItemType(f.int4()) item_type = ItemType(f.int4())
item_modifier = PrefixType.get(f.uint1()) item_modifier = PrefixType.get(f.uint1())
item = ItemStack(quantity=item_quantity, item = ItemStack(quantity=item_quantity, type_=item_type, prefix=item_modifier)
type_=item_type,
prefix=item_modifier)
else: else:
item = None item = None
chest_contents.append(item) chest_contents.append(item)
chest = Chest(position=chest_position, chest = Chest(position=chest_position, name=chest_name, contents=chest_contents)
name=chest_name,
contents=chest_contents)
chests.append(chest) chests.append(chest)
tm[chest.position].extra = chest tm[chest.position].extra = chest
@ -720,8 +721,7 @@ class World:
signs_count = f.int2() signs_count = f.int2()
for _ in range(signs_count): for _ in range(signs_count):
sign = Sign(text=f.string(), sign = Sign(text=f.string(), position=Coordinates(f.int4(), f.int4()))
position=Coordinates(f.int4(), f.int4()))
signs.append(sign) signs.append(sign)
tm[sign.position].extra = sign tm[sign.position].extra = sign
@ -743,19 +743,16 @@ class World:
npc_flags = f.bits() npc_flags = f.bits()
npc_variation_index = f.int4() if npc_flags[0] else 0 npc_variation_index = f.int4() if npc_flags[0] else 0
npc = NPC(type_=npc_type, npc = NPC(
name=npc_name, type_=npc_type, name=npc_name, position=npc_position, home=npc_home, variation_index=npc_variation_index
position=npc_position, )
home=npc_home,
variation_index=npc_variation_index)
npcs.append(npc) npcs.append(npc)
while f.bool(): while f.bool():
mob_type = EntityType(f.int4()) mob_type = EntityType(f.int4())
mob_position = Coordinates(f.single(), f.single()) mob_position = Coordinates(f.single(), f.single())
mob = Mob(type_=mob_type, mob = Mob(type_=mob_type, position=mob_position)
position=mob_position)
mobs.append(mob) mobs.append(mob)
unknown_npcs_data = f.read_until(pointers.tile_entities) unknown_npcs_data = f.read_until(pointers.tile_entities)
@ -773,9 +770,9 @@ class World:
te_extra = TargetDummy(npc=f.int2()) te_extra = TargetDummy(npc=f.int2())
# Item Frame # Item Frame
elif te_type == 1: elif te_type == 1:
te_extra = ItemFrame(item=ItemStack(type_=ItemType(f.int2()), te_extra = ItemFrame(
prefix=PrefixType.get(f.uint1()), item=ItemStack(type_=ItemType(f.int2()), prefix=PrefixType.get(f.uint1()), quantity=f.int2())
quantity=f.int2())) )
# Logic Sensor # Logic Sensor
elif te_type == 2: elif te_type == 2:
te_extra = LogicSensor(logic_check=f.uint1(), enabled=f.bool()) te_extra = LogicSensor(logic_check=f.uint1(), enabled=f.bool())
@ -788,21 +785,19 @@ class World:
for index, flag in enumerate(item_flags): for index, flag in enumerate(item_flags):
if not flag: if not flag:
continue continue
mannequin_items[index] = ItemStack(type_=ItemType(f.int2()), mannequin_items[index] = ItemStack(
prefix=PrefixType.get(f.int1()), type_=ItemType(f.int2()), prefix=PrefixType.get(f.int1()), quantity=f.int2()
quantity=f.int2()) )
for index, flag in enumerate(dye_flags): for index, flag in enumerate(dye_flags):
if not flag: if not flag:
continue continue
mannequin_dyes[index] = ItemStack(type_=ItemType(f.int2()), mannequin_dyes[index] = ItemStack(
prefix=PrefixType.get(f.int1()), type_=ItemType(f.int2()), prefix=PrefixType.get(f.int1()), quantity=f.int2()
quantity=f.int2()) )
te_extra = Mannequin(mannequin_items, mannequin_dyes) te_extra = Mannequin(mannequin_items, mannequin_dyes)
# Weapon Rack # Weapon Rack
elif te_type == 4: elif te_type == 4:
rack_item = ItemStack(type_=ItemType(f.int2()), rack_item = ItemStack(type_=ItemType(f.int2()), prefix=PrefixType.get(f.int1()), quantity=f.int2())
prefix=PrefixType.get(f.int1()),
quantity=f.int2())
te_extra = WeaponRack(rack_item) te_extra = WeaponRack(rack_item)
# Hat Rack # Hat Rack
elif te_type == 5: elif te_type == 5:
@ -814,21 +809,19 @@ class World:
for index, flag in enumerate(item_flags[0:2]): for index, flag in enumerate(item_flags[0:2]):
if not flag: if not flag:
continue continue
rack_items[index] = ItemStack(type_=ItemType(f.int2()), rack_items[index] = ItemStack(
prefix=PrefixType.get(f.int1()), type_=ItemType(f.int2()), prefix=PrefixType.get(f.int1()), quantity=f.int2()
quantity=f.int2()) )
for index, flag in enumerate(item_flags[2:4]): for index, flag in enumerate(item_flags[2:4]):
if not flag: if not flag:
continue continue
rack_dyes[index] = ItemStack(type_=ItemType(f.int2()), rack_dyes[index] = ItemStack(
prefix=PrefixType.get(f.int1()), type_=ItemType(f.int2()), prefix=PrefixType.get(f.int1()), quantity=f.int2()
quantity=f.int2()) )
te_extra = HatRack(rack_items, rack_dyes) te_extra = HatRack(rack_items, rack_dyes)
# Food Plate # Food Plate
elif te_type == 6: elif te_type == 6:
plate_item = ItemStack(type_=ItemType(f.int2()), plate_item = ItemStack(type_=ItemType(f.int2()), prefix=PrefixType.get(f.int1()), quantity=f.int2())
prefix=PrefixType.get(f.int1()),
quantity=f.int2())
te_extra = Plate(plate_item) te_extra = Plate(plate_item)
# Teleport Pylon # Teleport Pylon
elif te_type == 7: elif te_type == 7:
@ -896,20 +889,54 @@ class World:
unknown_journey_powers_data = f.read_until(pointers.footer) unknown_journey_powers_data = f.read_until(pointers.footer)
# Object creation # Object creation
world = cls(version=version, savefile_type=savefile_type, revision=revision, is_favorite=is_favorite, world = cls(
name=name, generator=generator, uuid_=uuid_, id_=id_, bounds=bounds, size=world_size, version=version,
difficulty=difficulty, is_drunk_world=is_drunk_world, is_for_the_worthy=is_for_the_worthy, savefile_type=savefile_type,
is_tenth_anniversary=is_tenth_anniversary, created_on=created_on, styles=world_styles, backgrounds=backgrounds, revision=revision,
spawn_point=spawn_point, underground_level=underground_level, cavern_level=cavern_level, is_favorite=is_favorite,
time=time, events=events, dungeon_point=dungeon_point, world_evil=world_evil, name=name,
saved_npcs=saved_npcs, altars_smashed=altars_smashed, is_hardmode=is_hardmode, generator=generator,
shadow_orbs=shadow_orbs, bosses_defeated=bosses_defeated, anglers_quest=anglers_quest, uuid_=uuid_,
clouds=clouds, cultist_delay=cultist_delay, tiles=tm, chests=chests, signs=signs, id_=id_,
npcs=npcs, mobs=mobs, tile_entities=tile_entities, bounds=bounds,
weighed_pressure_plates=weighed_pressure_plates, rooms=rooms, size=world_size,
halloween_today=halloween_today, xmas_today=xmas_today, difficulty=difficulty,
treetop_variants=treetop_variants, saved_ore_tiers=saved_ore_tiers, pets=pets, is_drunk_world=is_drunk_world,
bestiary=bestiary, journey_powers=journey_powers, is_for_the_worthy=is_for_the_worthy,
is_tenth_anniversary=is_tenth_anniversary,
created_on=created_on,
styles=world_styles,
backgrounds=backgrounds,
spawn_point=spawn_point,
underground_level=underground_level,
cavern_level=cavern_level,
time=time,
events=events,
dungeon_point=dungeon_point,
world_evil=world_evil,
saved_npcs=saved_npcs,
altars_smashed=altars_smashed,
is_hardmode=is_hardmode,
shadow_orbs=shadow_orbs,
bosses_defeated=bosses_defeated,
anglers_quest=anglers_quest,
clouds=clouds,
cultist_delay=cultist_delay,
tiles=tm,
chests=chests,
signs=signs,
npcs=npcs,
mobs=mobs,
tile_entities=tile_entities,
weighed_pressure_plates=weighed_pressure_plates,
rooms=rooms,
halloween_today=halloween_today,
xmas_today=xmas_today,
treetop_variants=treetop_variants,
saved_ore_tiers=saved_ore_tiers,
pets=pets,
bestiary=bestiary,
journey_powers=journey_powers,
unknown_file_format_data=unknown_file_format_data, unknown_file_format_data=unknown_file_format_data,
unknown_world_header_data=unknown_world_header_data, unknown_world_header_data=unknown_world_header_data,
unknown_world_tiles_data=unknown_world_tiles_data, unknown_world_tiles_data=unknown_world_tiles_data,
@ -920,7 +947,8 @@ class World:
unknown_pressure_plates_data=unknown_pressure_plates_data, unknown_pressure_plates_data=unknown_pressure_plates_data,
unknown_town_manager_data=unknown_town_manager_data, unknown_town_manager_data=unknown_town_manager_data,
unknown_bestiary_data=unknown_bestiary_data, unknown_bestiary_data=unknown_bestiary_data,
unknown_journey_powers_data=unknown_journey_powers_data) unknown_journey_powers_data=unknown_journey_powers_data,
)
# Footer # Footer
if not f.bool(): if not f.bool():

456
poetry.lock generated
View file

@ -1,27 +1,26 @@
[[package]] [[package]]
category = "dev"
description = "A configurable sidebar-enabled Sphinx theme"
name = "alabaster" name = "alabaster"
version = "0.7.12"
description = "A configurable sidebar-enabled Sphinx theme"
category = "dev"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "0.7.12"
[[package]] [[package]]
category = "dev"
description = "Atomic file writes."
marker = "sys_platform == \"win32\""
name = "atomicwrites" name = "atomicwrites"
version = "1.4.0"
description = "Atomic file writes."
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "1.4.0"
[[package]] [[package]]
category = "dev"
description = "Classes Without Boilerplate"
name = "attrs" name = "attrs"
version = "19.3.0"
description = "Classes Without Boilerplate"
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "19.3.0"
[package.extras] [package.extras]
azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"]
@ -30,73 +29,115 @@ docs = ["sphinx", "zope.interface"]
tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
[[package]] [[package]]
category = "dev"
description = "Internationalization utilities"
name = "babel" name = "babel"
version = "2.8.0"
description = "Internationalization utilities"
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.8.0"
[package.dependencies] [package.dependencies]
pytz = ">=2015.7" pytz = ">=2015.7"
[[package]] [[package]]
name = "black"
version = "22.1.0"
description = "The uncompromising code formatter."
category = "dev" category = "dev"
description = "Python package for providing Mozilla's CA Bundle." optional = false
python-versions = ">=3.6.2"
[package.dependencies]
click = ">=8.0.0"
dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""}
mypy-extensions = ">=0.4.3"
pathspec = ">=0.9.0"
platformdirs = ">=2"
tomli = ">=1.1.0"
typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""}
typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
[package.extras]
colorama = ["colorama (>=0.4.3)"]
d = ["aiohttp (>=3.7.4)"]
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
uvloop = ["uvloop (>=0.15.2)"]
[[package]]
name = "certifi" name = "certifi"
optional = false
python-versions = "*"
version = "2020.4.5.2" version = "2020.4.5.2"
description = "Python package for providing Mozilla's CA Bundle."
[[package]]
category = "dev" category = "dev"
description = "Universal encoding detector for Python 2 and 3"
name = "chardet"
optional = false optional = false
python-versions = "*" python-versions = "*"
[[package]]
name = "chardet"
version = "3.0.4" version = "3.0.4"
description = "Universal encoding detector for Python 2 and 3"
category = "dev"
optional = false
python-versions = "*"
[[package]] [[package]]
name = "click"
version = "8.0.3"
description = "Composable command line interface toolkit"
category = "dev" category = "dev"
description = "Cross-platform colored terminal text." optional = false
marker = "sys_platform == \"win32\"" python-versions = ">=3.6"
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
[[package]]
name = "colorama" name = "colorama"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "0.4.3" version = "0.4.3"
description = "Cross-platform colored terminal text."
[[package]]
category = "dev" category = "dev"
description = "Docutils -- Python Documentation Utilities"
name = "docutils"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
name = "dataclasses"
version = "0.8"
description = "A backport of the dataclasses module for Python 3.6"
category = "dev"
optional = false
python-versions = ">=3.6, <3.7"
[[package]]
name = "docutils"
version = "0.16" version = "0.16"
description = "Docutils -- Python Documentation Utilities"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]] [[package]]
category = "dev"
description = "Internationalized Domain Names in Applications (IDNA)"
name = "idna" name = "idna"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.9" version = "2.9"
description = "Internationalized Domain Names in Applications (IDNA)"
[[package]]
category = "dev" category = "dev"
description = "Getting image size from png/jpeg/jpeg2000/gif file"
name = "imagesize"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "1.2.0"
[[package]] [[package]]
name = "imagesize"
version = "1.2.0"
description = "Getting image size from png/jpeg/jpeg2000/gif file"
category = "dev" category = "dev"
description = "Read metadata from Python packages" optional = false
marker = "python_version < \"3.8\"" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "importlib-metadata" name = "importlib-metadata"
version = "1.6.1"
description = "Read metadata from Python packages"
category = "dev"
optional = false optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
version = "1.6.1"
[package.dependencies] [package.dependencies]
zipp = ">=0.5" zipp = ">=0.5"
@ -106,12 +147,12 @@ docs = ["sphinx", "rst.linker"]
testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] testing = ["packaging", "pep517", "importlib-resources (>=1.3)"]
[[package]] [[package]]
category = "dev"
description = "A very fast and expressive template engine."
name = "jinja2" name = "jinja2"
version = "2.11.2"
description = "A very fast and expressive template engine."
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "2.11.2"
[package.dependencies] [package.dependencies]
MarkupSafe = ">=0.23" MarkupSafe = ">=0.23"
@ -120,114 +161,137 @@ MarkupSafe = ">=0.23"
i18n = ["Babel (>=0.8)"] i18n = ["Babel (>=0.8)"]
[[package]] [[package]]
category = "dev"
description = "Safely add untrusted strings to HTML/XML markup."
name = "markupsafe" name = "markupsafe"
version = "1.1.1"
description = "Safely add untrusted strings to HTML/XML markup."
category = "dev"
optional = false optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
version = "1.1.1"
[[package]] [[package]]
category = "dev"
description = "More routines for operating on iterables, beyond itertools"
name = "more-itertools" name = "more-itertools"
version = "8.3.0"
description = "More routines for operating on iterables, beyond itertools"
category = "dev"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "8.3.0"
[[package]] [[package]]
name = "mypy-extensions"
version = "0.4.3"
description = "Experimental type system extensions for programs checked with the mypy typechecker."
category = "dev" category = "dev"
description = "Core utilities for Python packages" optional = false
python-versions = "*"
[[package]]
name = "packaging" name = "packaging"
version = "20.4"
description = "Core utilities for Python packages"
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "20.4"
[package.dependencies] [package.dependencies]
pyparsing = ">=2.0.2" pyparsing = ">=2.0.2"
six = "*" six = "*"
[[package]] [[package]]
name = "pathspec"
version = "0.9.0"
description = "Utility library for gitignore style pattern matching of file paths."
category = "dev" category = "dev"
description = "plugin and hook calling mechanisms for python" optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
[[package]]
name = "platformdirs"
version = "2.4.0"
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
category = "dev"
optional = false
python-versions = ">=3.6"
[package.extras]
docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"]
test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"]
[[package]]
name = "pluggy" name = "pluggy"
version = "0.13.1"
description = "plugin and hook calling mechanisms for python"
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "0.13.1"
[package.dependencies] [package.dependencies]
[package.dependencies.importlib-metadata] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
python = "<3.8"
version = ">=0.12"
[package.extras] [package.extras]
dev = ["pre-commit", "tox"] dev = ["pre-commit", "tox"]
[[package]] [[package]]
category = "dev"
description = "library with cross-python path, ini-parsing, io, code, log facilities"
name = "py" name = "py"
version = "1.8.1"
description = "library with cross-python path, ini-parsing, io, code, log facilities"
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "1.8.1"
[[package]] [[package]]
category = "dev"
description = "Pygments is a syntax highlighting package written in Python."
name = "pygments" name = "pygments"
version = "2.6.1"
description = "Pygments is a syntax highlighting package written in Python."
category = "dev"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "2.6.1"
[[package]] [[package]]
category = "dev"
description = "Python parsing module"
name = "pyparsing" name = "pyparsing"
version = "2.4.7"
description = "Python parsing module"
category = "dev"
optional = false optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
version = "2.4.7"
[[package]] [[package]]
category = "dev"
description = "pytest: simple powerful testing with Python"
name = "pytest" name = "pytest"
version = "5.4.3"
description = "pytest: simple powerful testing with Python"
category = "dev"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "5.4.3"
[package.dependencies] [package.dependencies]
atomicwrites = ">=1.0" atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
attrs = ">=17.4.0" attrs = ">=17.4.0"
colorama = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""}
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
more-itertools = ">=4.0.0" more-itertools = ">=4.0.0"
packaging = "*" packaging = "*"
pluggy = ">=0.12,<1.0" pluggy = ">=0.12,<1.0"
py = ">=1.5.0" py = ">=1.5.0"
wcwidth = "*" wcwidth = "*"
[package.dependencies.importlib-metadata]
python = "<3.8"
version = ">=0.12"
[package.extras] [package.extras]
checkqa-mypy = ["mypy (v0.761)"] checkqa-mypy = ["mypy (==v0.761)"]
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
[[package]] [[package]]
category = "dev"
description = "World timezone definitions, modern and historical"
name = "pytz" name = "pytz"
version = "2020.1"
description = "World timezone definitions, modern and historical"
category = "dev"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "2020.1"
[[package]] [[package]]
category = "dev"
description = "Python HTTP for Humans."
name = "requests" name = "requests"
version = "2.23.0"
description = "Python HTTP for Humans."
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "2.23.0"
[package.dependencies] [package.dependencies]
certifi = ">=2017.4.17" certifi = ">=2017.4.17"
@ -237,43 +301,42 @@ urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"
[package.extras] [package.extras]
security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
[[package]] [[package]]
category = "dev"
description = "Python 2 and 3 compatibility utilities"
name = "six" name = "six"
version = "1.15.0"
description = "Python 2 and 3 compatibility utilities"
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
version = "1.15.0"
[[package]] [[package]]
category = "dev"
description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms."
name = "snowballstemmer" name = "snowballstemmer"
version = "2.0.0"
description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms."
category = "dev"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "2.0.0"
[[package]] [[package]]
category = "dev"
description = "Python documentation generator"
name = "sphinx" name = "sphinx"
version = "2.4.4"
description = "Python documentation generator"
category = "dev"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "2.4.4"
[package.dependencies] [package.dependencies]
Jinja2 = ">=2.3"
Pygments = ">=2.0"
alabaster = ">=0.7,<0.8" alabaster = ">=0.7,<0.8"
babel = ">=1.3,<2.0 || >2.0" babel = ">=1.3,<2.0 || >2.0"
colorama = ">=0.3.5" colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
docutils = ">=0.12" docutils = ">=0.12"
imagesize = "*" imagesize = "*"
Jinja2 = ">=2.3"
packaging = "*" packaging = "*"
Pygments = ">=2.0"
requests = ">=2.5.0" requests = ">=2.5.0"
setuptools = "*"
snowballstemmer = ">=1.1" snowballstemmer = ">=1.1"
sphinxcontrib-applehelp = "*" sphinxcontrib-applehelp = "*"
sphinxcontrib-devhelp = "*" sphinxcontrib-devhelp = "*"
@ -287,124 +350,148 @@ docs = ["sphinxcontrib-websupport"]
test = ["pytest (<5.3.3)", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.761)", "docutils-stubs"] test = ["pytest (<5.3.3)", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.761)", "docutils-stubs"]
[[package]] [[package]]
category = "dev"
description = "Read the Docs theme for Sphinx"
name = "sphinx-rtd-theme" name = "sphinx-rtd-theme"
version = "0.4.3"
description = "Read the Docs theme for Sphinx"
category = "dev"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "0.4.3"
[package.dependencies] [package.dependencies]
sphinx = "*" sphinx = "*"
[[package]] [[package]]
category = "dev"
description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books"
name = "sphinxcontrib-applehelp" name = "sphinxcontrib-applehelp"
version = "1.0.2"
description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books"
category = "dev"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "1.0.2"
[package.extras] [package.extras]
lint = ["flake8", "mypy", "docutils-stubs"] lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest"] test = ["pytest"]
[[package]] [[package]]
category = "dev"
description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
name = "sphinxcontrib-devhelp" name = "sphinxcontrib-devhelp"
version = "1.0.2"
description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
category = "dev"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "1.0.2"
[package.extras] [package.extras]
lint = ["flake8", "mypy", "docutils-stubs"] lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest"] test = ["pytest"]
[[package]] [[package]]
category = "dev"
description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
name = "sphinxcontrib-htmlhelp" name = "sphinxcontrib-htmlhelp"
version = "1.0.3"
description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
category = "dev"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "1.0.3"
[package.extras] [package.extras]
lint = ["flake8", "mypy", "docutils-stubs"] lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest", "html5lib"] test = ["pytest", "html5lib"]
[[package]] [[package]]
category = "dev"
description = "A sphinx extension which renders display math in HTML via JavaScript"
name = "sphinxcontrib-jsmath" name = "sphinxcontrib-jsmath"
version = "1.0.1"
description = "A sphinx extension which renders display math in HTML via JavaScript"
category = "dev"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "1.0.1"
[package.extras] [package.extras]
test = ["pytest", "flake8", "mypy"] test = ["pytest", "flake8", "mypy"]
[[package]] [[package]]
category = "dev"
description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
name = "sphinxcontrib-qthelp" name = "sphinxcontrib-qthelp"
optional = false
python-versions = ">=3.5"
version = "1.0.3" version = "1.0.3"
description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest"]
[[package]]
category = "dev" category = "dev"
description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
name = "sphinxcontrib-serializinghtml"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "1.1.4"
[package.extras] [package.extras]
lint = ["flake8", "mypy", "docutils-stubs"] lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest"] test = ["pytest"]
[[package]] [[package]]
name = "sphinxcontrib-serializinghtml"
version = "1.1.4"
description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
category = "dev" category = "dev"
description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false
python-versions = ">=3.5"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest"]
[[package]]
name = "tomli"
version = "1.2.3"
description = "A lil' TOML parser"
category = "dev"
optional = false
python-versions = ">=3.6"
[[package]]
name = "typed-ast"
version = "1.5.2"
description = "a fork of Python 2 and 3 ast modules with type comment support"
category = "dev"
optional = false
python-versions = ">=3.6"
[[package]]
name = "typing-extensions"
version = "4.0.1"
description = "Backported and Experimental Type Hints for Python 3.6+"
category = "dev"
optional = false
python-versions = ">=3.6"
[[package]]
name = "urllib3" name = "urllib3"
version = "1.25.9"
description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
version = "1.25.9"
[package.extras] [package.extras]
brotli = ["brotlipy (>=0.6.0)"] brotli = ["brotlipy (>=0.6.0)"]
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"] secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"]
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]] [[package]]
category = "dev"
description = "Measures the displayed width of unicode strings in a terminal"
name = "wcwidth" name = "wcwidth"
version = "0.2.4"
description = "Measures the displayed width of unicode strings in a terminal"
category = "dev"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "0.2.4"
[[package]] [[package]]
category = "dev"
description = "Backport of pathlib-compatible object wrapper for zip files"
marker = "python_version < \"3.8\""
name = "zipp" name = "zipp"
version = "3.1.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
category = "dev"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.6"
version = "3.1.0"
[package.extras] [package.extras]
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
testing = ["jaraco.itertools", "func-timeout"] testing = ["jaraco.itertools", "func-timeout"]
[metadata] [metadata]
content-hash = "b47b9ecb692b818f41e5c444d71d45b46d42d2c1d1263de485d857ef4eee9707" lock-version = "1.1"
python-versions = "^3.6" python-versions = "^3.6.2"
content-hash = "15ba7d06ad87a6deb9cfec3590a6921496fae849edbae8ffd364db9fbcba9c62"
[metadata.files] [metadata.files]
alabaster = [ alabaster = [
@ -423,6 +510,31 @@ babel = [
{file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"},
{file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"}, {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"},
] ]
black = [
{file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"},
{file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"},
{file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"},
{file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"},
{file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"},
{file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"},
{file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"},
{file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"},
{file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"},
{file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"},
{file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"},
{file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"},
{file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"},
{file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"},
{file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"},
{file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"},
{file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"},
{file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"},
{file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"},
{file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"},
{file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"},
{file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"},
{file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"},
]
certifi = [ certifi = [
{file = "certifi-2020.4.5.2-py2.py3-none-any.whl", hash = "sha256:9cd41137dc19af6a5e03b630eefe7d1f458d964d406342dd3edf625839b944cc"}, {file = "certifi-2020.4.5.2-py2.py3-none-any.whl", hash = "sha256:9cd41137dc19af6a5e03b630eefe7d1f458d964d406342dd3edf625839b944cc"},
{file = "certifi-2020.4.5.2.tar.gz", hash = "sha256:5ad7e9a056d25ffa5082862e36f119f7f7cec6457fa07ee2f8c339814b80c9b1"}, {file = "certifi-2020.4.5.2.tar.gz", hash = "sha256:5ad7e9a056d25ffa5082862e36f119f7f7cec6457fa07ee2f8c339814b80c9b1"},
@ -431,10 +543,18 @@ chardet = [
{file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
{file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
] ]
click = [
{file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
{file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
]
colorama = [ colorama = [
{file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
{file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"},
] ]
dataclasses = [
{file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"},
{file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"},
]
docutils = [ docutils = [
{file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
{file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
@ -474,30 +594,61 @@ markupsafe = [
{file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"},
{file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"},
{file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"},
{file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"},
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"},
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"},
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"},
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"},
{file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"},
{file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"},
{file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"},
{file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"},
{file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"},
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"},
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"},
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"},
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"},
{file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"},
{file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"},
{file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"},
{file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"},
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"},
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"},
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"},
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"},
{file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"},
{file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"},
{file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"},
{file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"},
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"},
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"},
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"},
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"},
{file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"},
{file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"},
{file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"},
{file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"},
] ]
more-itertools = [ more-itertools = [
{file = "more-itertools-8.3.0.tar.gz", hash = "sha256:558bb897a2232f5e4f8e2399089e35aecb746e1f9191b6584a151647e89267be"}, {file = "more-itertools-8.3.0.tar.gz", hash = "sha256:558bb897a2232f5e4f8e2399089e35aecb746e1f9191b6584a151647e89267be"},
{file = "more_itertools-8.3.0-py3-none-any.whl", hash = "sha256:7818f596b1e87be009031c7653d01acc46ed422e6656b394b0f765ce66ed4982"}, {file = "more_itertools-8.3.0-py3-none-any.whl", hash = "sha256:7818f596b1e87be009031c7653d01acc46ed422e6656b394b0f765ce66ed4982"},
] ]
mypy-extensions = [
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
]
packaging = [ packaging = [
{file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"},
{file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"},
] ]
pathspec = [
{file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
{file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
]
platformdirs = [
{file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"},
{file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"},
]
pluggy = [ pluggy = [
{file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
{file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
@ -523,6 +674,7 @@ pytz = [
{file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"},
] ]
requests = [ requests = [
{file = "requests-2.23.0-py2.7.egg", hash = "sha256:5d2d0ffbb515f39417009a46c14256291061ac01ba8f875b90cad137de83beb4"},
{file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"}, {file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"},
{file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"}, {file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"},
] ]
@ -566,6 +718,40 @@ sphinxcontrib-serializinghtml = [
{file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"},
{file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"},
] ]
tomli = [
{file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"},
{file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"},
]
typed-ast = [
{file = "typed_ast-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266"},
{file = "typed_ast-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596"},
{file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc2542e83ac8399752bc16e0b35e038bdb659ba237f4222616b4e83fb9654985"},
{file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76"},
{file = "typed_ast-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a"},
{file = "typed_ast-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837"},
{file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:963a0ccc9a4188524e6e6d39b12c9ca24cc2d45a71cfdd04a26d883c922b4b78"},
{file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e"},
{file = "typed_ast-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d"},
{file = "typed_ast-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd"},
{file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7407cfcad702f0b6c0e0f3e7ab876cd1d2c13b14ce770e412c0c4b9728a0f88"},
{file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f30ddd110634c2d7534b2d4e0e22967e88366b0d356b24de87419cc4410c41b7"},
{file = "typed_ast-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30"},
{file = "typed_ast-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90904d889ab8e81a956f2c0935a523cc4e077c7847a836abee832f868d5c26a4"},
{file = "typed_ast-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bbebc31bf11762b63bf61aaae232becb41c5bf6b3461b80a4df7e791fabb3aca"},
{file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29dd9a3a9d259c9fa19d19738d021632d673f6ed9b35a739f48e5f807f264fb"},
{file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b"},
{file = "typed_ast-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:da0a98d458010bf4fe535f2d1e367a2e2060e105978873c04c04212fb20543f7"},
{file = "typed_ast-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098"},
{file = "typed_ast-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344"},
{file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e"},
{file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f290617f74a610849bd8f5514e34ae3d09eafd521dceaa6cf68b3f4414266d4e"},
{file = "typed_ast-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:df05aa5b241e2e8045f5f4367a9f6187b09c4cdf8578bb219861c4e27c443db5"},
{file = "typed_ast-1.5.2.tar.gz", hash = "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27"},
]
typing-extensions = [
{file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"},
{file = "typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e"},
]
urllib3 = [ urllib3 = [
{file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"}, {file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"},
{file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"}, {file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"},

View file

@ -15,17 +15,23 @@
# Library dependencies # Library dependencies
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.6" python = "^3.6.2"
# Development dependencies # Development dependencies
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
pytest = "^5.2.1" pytest = "^5.2.1"
sphinx = "^2.2.1" sphinx = "^2.2.1"
sphinx_rtd_theme = "^0.4.3" sphinx_rtd_theme = "^0.4.3"
black = "^22.1.0"
# Optional dependencies # Optional dependencies
[tool.poetry.extras] [tool.poetry.extras]
# Code style
[tool.black]
line-length = 120
target-version = ['py36']
# Used build system # Used build system
[build-system] [build-system]
requires = ["poetry>=0.12"] requires = ["poetry>=0.12"]