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 = 'lihzahrd'
copyright = '2020, Stefano Pigozzi'
author = 'Stefano Pigozzi'
project = "lihzahrd"
copyright = "2020, Stefano Pigozzi"
author = "Stefano Pigozzi"
# -- General configuration ---------------------------------------------------
@ -39,16 +39,16 @@ def skip(app, what, name: str, obj, would_skip, options):
def setup(app):
app.add_stylesheet('lihzahrd.css')
app.add_stylesheet("lihzahrd.css")
# 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
# directories to ignore when looking for source files.
# 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 -------------------------------------------------
@ -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
# 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,
# relative to this directory. They are copied after the builtin static files,
# 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"
def __init__(self,
chats: List[EntityType],
kills: Dict[EntityType, int],
sightings: List[EntityType]):
def __init__(self, chats: List[EntityType], kills: Dict[EntityType, int], sightings: List[EntityType]):
self.chats: List[EntityType] = chats
self.kills: Dict[EntityType, int] = kills
self.sightings: List[EntityType] = sightings

View file

@ -14,5 +14,7 @@ class Chest:
self.contents: typing.List[ItemStack] = contents
def __repr__(self):
return f'<Chest "{self.name}" at {self.position} ' \
f'with {len(list(filter(lambda x: x is not None, self.contents)))} items>'
return (
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.
Data from https://github.com/tModLoader/tModLoader/wiki/Vanilla-Tile-IDs."""
DIRT = 0
STONE = 1
GRASS = 2

View file

@ -3,6 +3,7 @@ import enum
class EntityType(enum.IntEnum):
"""An enumeration of all Terraria entities."""
# https://terraria.gamepedia.com/NPC_IDs
# 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]+)$

View file

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

View file

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

View file

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

View file

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

View file

@ -7,7 +7,7 @@ from .rect import Rect
class FileReader:
__slots__ = "file",
__slots__ = ("file",)
def __init__(self, file: typing.IO):
self.file: typing.IO = file
@ -48,14 +48,16 @@ class FileReader:
@staticmethod
@functools.lru_cache(256)
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_0100),
bool(data & 0b0000_1000),
bool(data & 0b0001_0000),
bool(data & 0b0010_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]:
data = struct.unpack("B", self.file.read(1))[0]

View file

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

View file

@ -1,6 +1,8 @@
class Backgrounds:
"""The backgrounds of various world biomes."""
def __init__(self,
def __init__(
self,
bg_underground_snow: int,
bg_underground_jungle: int,
bg_hell: int,
@ -16,7 +18,8 @@ class Backgrounds:
new_bg_2: int,
new_bg_3: int,
new_bg_4: int,
new_bg_5: int,):
new_bg_5: int,
):
self.bg_underground_snow: int = bg_underground_snow
self.bg_underground_jungle: int = bg_underground_jungle
self.bg_hell: int = bg_hell
@ -35,7 +38,9 @@ class Backgrounds:
self.new_bg_5: int = new_bg_5
def __repr__(self):
return f"WorldBackgrounds({self.bg_underground_snow}, {self.bg_underground_jungle}, {self.bg_hell}," \
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}," \
return (
f"WorldBackgrounds({self.bg_underground_snow}, {self.bg_underground_jungle}, {self.bg_hell},"
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})"
)

View file

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

View file

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

View file

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

View file

@ -4,11 +4,7 @@ from .invasiontype import InvasionType
class Invasion:
"""Invasions (goblin army, pirates, martian madness...) related information."""
def __init__(self, delay: int,
size: int,
type_: InvasionType,
position: float,
size_start: int):
def __init__(self, delay: int, size: int, type_: InvasionType, position: float, size_start: int):
self.delay: int = delay
self.size: int = size
@ -21,5 +17,7 @@ class Invasion:
self.size_start: int = size_start
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})"
)

View file

@ -3,11 +3,8 @@ import typing
class LanternNight:
"""Lantern Night event related information."""
def __init__(self,
nights_on_cooldown: int,
genuine: bool,
manual: bool,
next_night_is_lantern_night: bool):
def __init__(self, nights_on_cooldown: int, genuine: bool, manual: bool, next_night_is_lantern_night: bool):
self.nights_on_cooldown: int = nights_on_cooldown
"""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?"""
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})"
)
@property
def is_active(self):

View file

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

View file

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

View file

@ -3,11 +3,10 @@ import typing
class Party:
"""NPC Party related information."""
def __init__(self,
thrown_by_party_center: bool,
thrown_by_npcs: bool,
cooldown: int,
partying_npcs: typing.List[int]):
def __init__(
self, thrown_by_party_center: bool, thrown_by_npcs: bool, cooldown: int, partying_npcs: typing.List[int]
):
self.thrown_by_party_center: bool = thrown_by_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."""
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})"
)
@property
def is_active(self):

View file

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

View file

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

View file

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

View file

@ -1,10 +1,7 @@
class Sandstorm:
"""Sandstorm related information."""
def __init__(self,
is_active: bool,
time_left: int,
severity: float,
intended_severity: float):
def __init__(self, is_active: bool, time_left: int, severity: float, intended_severity: float):
self.is_active: bool = is_active
"""If a sandstorm is currently ongoing in the desert."""
@ -15,5 +12,7 @@ class Sandstorm:
self.intended_severity: float = intended_severity
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})"
)

View file

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

View file

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

View file

@ -1,10 +1,7 @@
class ShadowOrbs:
"""Information related to the Shadow Orbs (or the Crimson Hearts) smashed in the world."""
def __init__(self,
smashed_at_least_once: bool,
spawn_meteorite: bool,
evil_boss_counter: int):
def __init__(self, smashed_at_least_once: bool, spawn_meteorite: bool, evil_boss_counter: int):
self.smashed_at_least_once: bool = smashed_at_least_once
"""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."""
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})"
)

View file

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

View file

@ -1,10 +1,9 @@
class Time:
"""Game time related information."""
def __init__(self, current: float,
is_daytime: bool,
moon_phase: int,
sundial_cooldown: int,
fast_forward_time: bool):
def __init__(
self, current: float, is_daytime: bool, moon_phase: int, sundial_cooldown: int, fast_forward_time: bool
):
self.current: float = current
"""The current game time."""
@ -20,5 +19,7 @@ class Time:
self.fast_forward_time: bool = fast_forward_time
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})"
)

View file

@ -4,7 +4,7 @@ import typing
class Version:
"""A Terraria version."""
__slots__ = ("id", )
__slots__ = ("id",)
_version_ids = {
12: "1.0.5",
@ -52,7 +52,7 @@ class Version:
227: "1.4.0.3",
228: "1.4.0.4",
230: "1.4.0.5",
238: "1.4.2.3"
238: "1.4.2.3",
}
def __init__(self, data: typing.Union[int, str]):

View file

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

View file

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

View file

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

View file

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

View file

@ -4,7 +4,7 @@ from ..fileutils import Coordinates
class WeighedPressurePlate:
"""A single `Weighed Pressure Plate <https://terraria.gamepedia.com/Pressure_Plates>`_ placed in the world."""
__slots__ = ("position", )
__slots__ = ("position",)
def __init__(self, position: Coordinates):
self.position: Coordinates = position

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -6,12 +6,9 @@ class Wiring:
__slots__ = "red", "green", "blue", "yellow", "actuator"
def __init__(self,
red: bool = False,
green: bool = False,
blue: bool = False,
yellow: bool = False,
actuator: bool = False):
def __init__(
self, red: bool = False, green: bool = False, blue: bool = False, yellow: bool = False, actuator: bool = False
):
self.red: bool = red
"""If there's a red Wire in the tile."""
@ -28,8 +25,10 @@ class Wiring:
"""If there's an Actuator in the tile."""
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})"
)
def __bool__(self):
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:
"""An object to track and print the time required to perform a section of code."""
def __init__(self, name: str, display: bool = True):
self.name: str = name
self.display: bool = display

View file

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

456
poetry.lock generated
View file

@ -1,27 +1,26 @@
[[package]]
category = "dev"
description = "A configurable sidebar-enabled Sphinx theme"
name = "alabaster"
version = "0.7.12"
description = "A configurable sidebar-enabled Sphinx theme"
category = "dev"
optional = false
python-versions = "*"
version = "0.7.12"
[[package]]
category = "dev"
description = "Atomic file writes."
marker = "sys_platform == \"win32\""
name = "atomicwrites"
version = "1.4.0"
description = "Atomic file writes."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "1.4.0"
[[package]]
category = "dev"
description = "Classes Without Boilerplate"
name = "attrs"
version = "19.3.0"
description = "Classes Without Boilerplate"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "19.3.0"
[package.extras]
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"]
[[package]]
category = "dev"
description = "Internationalization utilities"
name = "babel"
version = "2.8.0"
description = "Internationalization utilities"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.8.0"
[package.dependencies]
pytz = ">=2015.7"
[[package]]
name = "black"
version = "22.1.0"
description = "The uncompromising code formatter."
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"
optional = false
python-versions = "*"
version = "2020.4.5.2"
[[package]]
description = "Python package for providing Mozilla's CA Bundle."
category = "dev"
description = "Universal encoding detector for Python 2 and 3"
name = "chardet"
optional = false
python-versions = "*"
[[package]]
name = "chardet"
version = "3.0.4"
description = "Universal encoding detector for Python 2 and 3"
category = "dev"
optional = false
python-versions = "*"
[[package]]
name = "click"
version = "8.0.3"
description = "Composable command line interface toolkit"
category = "dev"
description = "Cross-platform colored terminal text."
marker = "sys_platform == \"win32\""
optional = false
python-versions = ">=3.6"
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
[[package]]
name = "colorama"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "0.4.3"
[[package]]
description = "Cross-platform colored terminal text."
category = "dev"
description = "Docutils -- Python Documentation Utilities"
name = "docutils"
optional = false
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"
description = "Docutils -- Python Documentation Utilities"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
category = "dev"
description = "Internationalized Domain Names in Applications (IDNA)"
name = "idna"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.9"
[[package]]
description = "Internationalized Domain Names in Applications (IDNA)"
category = "dev"
description = "Getting image size from png/jpeg/jpeg2000/gif file"
name = "imagesize"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "1.2.0"
[[package]]
name = "imagesize"
version = "1.2.0"
description = "Getting image size from png/jpeg/jpeg2000/gif file"
category = "dev"
description = "Read metadata from Python packages"
marker = "python_version < \"3.8\""
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "importlib-metadata"
version = "1.6.1"
description = "Read metadata from Python packages"
category = "dev"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
version = "1.6.1"
[package.dependencies]
zipp = ">=0.5"
@ -106,12 +147,12 @@ docs = ["sphinx", "rst.linker"]
testing = ["packaging", "pep517", "importlib-resources (>=1.3)"]
[[package]]
category = "dev"
description = "A very fast and expressive template engine."
name = "jinja2"
version = "2.11.2"
description = "A very fast and expressive template engine."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "2.11.2"
[package.dependencies]
MarkupSafe = ">=0.23"
@ -120,114 +161,137 @@ MarkupSafe = ">=0.23"
i18n = ["Babel (>=0.8)"]
[[package]]
category = "dev"
description = "Safely add untrusted strings to HTML/XML markup."
name = "markupsafe"
version = "1.1.1"
description = "Safely add untrusted strings to HTML/XML markup."
category = "dev"
optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
version = "1.1.1"
[[package]]
category = "dev"
description = "More routines for operating on iterables, beyond itertools"
name = "more-itertools"
version = "8.3.0"
description = "More routines for operating on iterables, beyond itertools"
category = "dev"
optional = false
python-versions = ">=3.5"
version = "8.3.0"
[[package]]
name = "mypy-extensions"
version = "0.4.3"
description = "Experimental type system extensions for programs checked with the mypy typechecker."
category = "dev"
description = "Core utilities for Python packages"
optional = false
python-versions = "*"
[[package]]
name = "packaging"
version = "20.4"
description = "Core utilities for Python packages"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "20.4"
[package.dependencies]
pyparsing = ">=2.0.2"
six = "*"
[[package]]
name = "pathspec"
version = "0.9.0"
description = "Utility library for gitignore style pattern matching of file paths."
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"
version = "0.13.1"
description = "plugin and hook calling mechanisms for python"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "0.13.1"
[package.dependencies]
[package.dependencies.importlib-metadata]
python = "<3.8"
version = ">=0.12"
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
[package.extras]
dev = ["pre-commit", "tox"]
[[package]]
category = "dev"
description = "library with cross-python path, ini-parsing, io, code, log facilities"
name = "py"
version = "1.8.1"
description = "library with cross-python path, ini-parsing, io, code, log facilities"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "1.8.1"
[[package]]
category = "dev"
description = "Pygments is a syntax highlighting package written in Python."
name = "pygments"
version = "2.6.1"
description = "Pygments is a syntax highlighting package written in Python."
category = "dev"
optional = false
python-versions = ">=3.5"
version = "2.6.1"
[[package]]
category = "dev"
description = "Python parsing module"
name = "pyparsing"
version = "2.4.7"
description = "Python parsing module"
category = "dev"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
version = "2.4.7"
[[package]]
category = "dev"
description = "pytest: simple powerful testing with Python"
name = "pytest"
version = "5.4.3"
description = "pytest: simple powerful testing with Python"
category = "dev"
optional = false
python-versions = ">=3.5"
version = "5.4.3"
[package.dependencies]
atomicwrites = ">=1.0"
atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
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"
packaging = "*"
pluggy = ">=0.12,<1.0"
py = ">=1.5.0"
wcwidth = "*"
[package.dependencies.importlib-metadata]
python = "<3.8"
version = ">=0.12"
[package.extras]
checkqa-mypy = ["mypy (v0.761)"]
checkqa-mypy = ["mypy (==v0.761)"]
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
[[package]]
category = "dev"
description = "World timezone definitions, modern and historical"
name = "pytz"
version = "2020.1"
description = "World timezone definitions, modern and historical"
category = "dev"
optional = false
python-versions = "*"
version = "2020.1"
[[package]]
category = "dev"
description = "Python HTTP for Humans."
name = "requests"
version = "2.23.0"
description = "Python HTTP for Humans."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "2.23.0"
[package.dependencies]
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]
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]]
category = "dev"
description = "Python 2 and 3 compatibility utilities"
name = "six"
version = "1.15.0"
description = "Python 2 and 3 compatibility utilities"
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
version = "1.15.0"
[[package]]
category = "dev"
description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms."
name = "snowballstemmer"
version = "2.0.0"
description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms."
category = "dev"
optional = false
python-versions = "*"
version = "2.0.0"
[[package]]
category = "dev"
description = "Python documentation generator"
name = "sphinx"
version = "2.4.4"
description = "Python documentation generator"
category = "dev"
optional = false
python-versions = ">=3.5"
version = "2.4.4"
[package.dependencies]
Jinja2 = ">=2.3"
Pygments = ">=2.0"
alabaster = ">=0.7,<0.8"
babel = ">=1.3,<2.0 || >2.0"
colorama = ">=0.3.5"
colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
docutils = ">=0.12"
imagesize = "*"
Jinja2 = ">=2.3"
packaging = "*"
Pygments = ">=2.0"
requests = ">=2.5.0"
setuptools = "*"
snowballstemmer = ">=1.1"
sphinxcontrib-applehelp = "*"
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"]
[[package]]
category = "dev"
description = "Read the Docs theme for Sphinx"
name = "sphinx-rtd-theme"
version = "0.4.3"
description = "Read the Docs theme for Sphinx"
category = "dev"
optional = false
python-versions = "*"
version = "0.4.3"
[package.dependencies]
sphinx = "*"
[[package]]
category = "dev"
description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books"
name = "sphinxcontrib-applehelp"
version = "1.0.2"
description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books"
category = "dev"
optional = false
python-versions = ">=3.5"
version = "1.0.2"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest"]
[[package]]
category = "dev"
description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
name = "sphinxcontrib-devhelp"
version = "1.0.2"
description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
category = "dev"
optional = false
python-versions = ">=3.5"
version = "1.0.2"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest"]
[[package]]
category = "dev"
description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
name = "sphinxcontrib-htmlhelp"
version = "1.0.3"
description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
category = "dev"
optional = false
python-versions = ">=3.5"
version = "1.0.3"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest", "html5lib"]
[[package]]
category = "dev"
description = "A sphinx extension which renders display math in HTML via JavaScript"
name = "sphinxcontrib-jsmath"
version = "1.0.1"
description = "A sphinx extension which renders display math in HTML via JavaScript"
category = "dev"
optional = false
python-versions = ">=3.5"
version = "1.0.1"
[package.extras]
test = ["pytest", "flake8", "mypy"]
[[package]]
category = "dev"
description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
name = "sphinxcontrib-qthelp"
optional = false
python-versions = ">=3.5"
version = "1.0.3"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest"]
[[package]]
description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
category = "dev"
description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
name = "sphinxcontrib-serializinghtml"
optional = false
python-versions = ">=3.5"
version = "1.1.4"
[package.extras]
lint = ["flake8", "mypy", "docutils-stubs"]
test = ["pytest"]
[[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"
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"
version = "1.25.9"
description = "HTTP library with thread-safe connection pooling, file post, and more."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
version = "1.25.9"
[package.extras]
brotli = ["brotlipy (>=0.6.0)"]
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]]
category = "dev"
description = "Measures the displayed width of unicode strings in a terminal"
name = "wcwidth"
version = "0.2.4"
description = "Measures the displayed width of unicode strings in a terminal"
category = "dev"
optional = false
python-versions = "*"
version = "0.2.4"
[[package]]
category = "dev"
description = "Backport of pathlib-compatible object wrapper for zip files"
marker = "python_version < \"3.8\""
name = "zipp"
version = "3.1.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
category = "dev"
optional = false
python-versions = ">=3.6"
version = "3.1.0"
[package.extras]
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
testing = ["jaraco.itertools", "func-timeout"]
[metadata]
content-hash = "b47b9ecb692b818f41e5c444d71d45b46d42d2c1d1263de485d857ef4eee9707"
python-versions = "^3.6"
lock-version = "1.1"
python-versions = "^3.6.2"
content-hash = "15ba7d06ad87a6deb9cfec3590a6921496fae849edbae8ffd364db9fbcba9c62"
[metadata.files]
alabaster = [
@ -423,6 +510,31 @@ babel = [
{file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"},
{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 = [
{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"},
@ -431,10 +543,18 @@ chardet = [
{file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
{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 = [
{file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
{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 = [
{file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
{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-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_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_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-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_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_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-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-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-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-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"},
]
more-itertools = [
{file = "more-itertools-8.3.0.tar.gz", hash = "sha256:558bb897a2232f5e4f8e2399089e35aecb746e1f9191b6584a151647e89267be"},
{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 = [
{file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"},
{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 = [
{file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
{file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
@ -523,6 +674,7 @@ pytz = [
{file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"},
]
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.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-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 = [
{file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"},
{file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"},

View file

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