diff --git a/Pokemon/base.py b/Pokemon/base.py new file mode 100644 index 0000000..74892e8 --- /dev/null +++ b/Pokemon/base.py @@ -0,0 +1,135 @@ +from Pokemon.caching import CacheDict +import abc +import dataclasses +import typing +import httpx +import pydantic +import json + +Payload = typing.Dict[str, typing.Any] +base_url = "https://pokeapi.co/api/v2/" + + +class BaseType1(pydantic.BaseModel, abc.ABC): + + id: typing.Optional[typing.Union[int, str]] + name: typing.Optional[str] + + @pydantic.root_validator(pre=True) + @classmethod + def id_or_name( + cls, vals: typing.Dict[str, typing.Any] + ) -> typing.Optional[typing.Dict[str, typing.Any]]: + """Checks if either of name or id is + passed returns error if none of + them is passed or both are passed""" + + if "id" not in vals and "name" not in vals: + raise TypeError("Missing Arguments : name or id") + elif "id" in vals and "name" in vals: + raise TypeError("Too many Arguments provided : name and id") + return vals + + @property + @abc.abstractmethod + def cache(self) -> object: + ... + + @property + @abc.abstractmethod + def address(self) -> str: + ... + + @property + @abc.abstractmethod + def error(self) -> Exception: + ... + + @property + def url(self) -> str: + return f"{base_url}{self.address}/{self.id or self.name}" + + @property + def raw_data(self) -> CacheDict[int, CacheDict[str, typing.Any]]: + id_or_name = self.id or self.name + id_and_name_list = [i for h in self.cache.name_id_map.items() for i in h] + if not id_or_name in id_and_name_list: + try: + response = CacheDict(httpx.get(self.url).json()) + self.cache.add_new(self.address, response) + except json.JSONDecodeError: + raise self.error(arg=id_or_name) + else: + return response + if not self.id: + return self.cache.cached_data[self.cache.name_id_map.get(self.name)][ + self.address + ] + return self.cache.cached_data[self.id][self.address] + + class Config: + allow_mutation = False + + +class BaseType2(pydantic.BaseModel, abc.ABC): + + id: typing.Union[int, str] + + @property + @abc.abstractmethod + def cache(self) -> object: + ... + + @property + @abc.abstractmethod + def address(self) -> str: + ... + + @property + @abc.abstractmethod + def error(self) -> Exception: + ... + + @property + def url(self) -> str: + return f"{base_url}{self.address}/{self.id}" + + @property + def raw_data(self) -> CacheDict[int, CacheDict[str, typing.Any]]: + if not id in self.cache.cached_data: + try: + response = CacheDict(httpx.get(self.url).json()) + self.cache.add_new(self.address, response) + except json.JSONDecodeError: + raise self.error(arg=self.id) + else: + return response + return self.cache.cached_data[self.id][self.address] + + ... + + class Config: + allow_mutation = False + + +@dataclasses.dataclass(frozen=True) +class UtilsParser(abc.ABC): + data: Payload + + +@dataclasses.dataclass(frozen=True) +class BaseParser1(UtilsParser): + @property + def id(self): + return self.data.get("id") + + @property + def name(self): + return self.data.get("name") + + +@dataclasses.dataclass(frozen=True) +class BaseParser2(UtilsParser): + @property + def id(self): + return self.data.get("id") diff --git a/Pokemon/cache.py b/Pokemon/cache.py deleted file mode 100644 index 70eabf8..0000000 --- a/Pokemon/cache.py +++ /dev/null @@ -1,520 +0,0 @@ -class CacheManager: - def __init__(self) -> None: - self.name_id_map = dict() - - -class Berries(CacheManager): - def __init__(self) -> None: - super().__init__() - self.berry_firmness = dict() - self.berry_flavors = dict() - self.berries = dict() - - def add_berry_firmness(self, id, data: dict) -> None: - if not len(self.name_id_map) >= 10: - self.berry_firmness[id] = data - else: - self.__init__() - self.berry_firmness[id] = data - - def add_berry_flavour(self, id, data: dict) -> None: - if not len(self.name_id_map) >= 10: - self.berry_flavours[id] = data - else: - self.__init__() - self.berry_flavour[id] = data - - def add_berry(self, id, data: dict) -> None: - if not len(self.name_id_map) >= 10: - self.berries[id] = data - else: - self.__init__() - self.berries[id] = data - - -class Contests(CacheManager): - def __init__(self) -> None: - super().__init__() - self.contest_types = dict() - self.contest_effects = dict() - self.super_contest_effects = dict() - - def add_contest_type(self, id, data: dict) -> None: - if (not len(self.name_id_map) >= 10 - or not len(self.contest_effects) >= 10 - or not len(self.super_contest_effects) >= 10): - self.contest_types[id] = data - else: - self.__init__() - self.contest_types[id] = data - - def add_contest_effect(self, id, data: dict) -> None: - if (not len(self.name_id_map) >= 10 - or not len(self.contest_effects) >= 10 - or not len(self.super_contest_effects) >= 10): - self.contest_effects[id] = data - else: - self.__init__() - self.contest_effects[id] = data - - def add_super_contest_effect(self, id, data: dict) -> None: - if (not len(self.name_id_map) >= 10 - or not len(self.contest_effects) >= 10 - or not len(self.super_contest_effects) >= 10): - self.super_contest_effects[id] = data - else: - self.__init__() - self.super_contest_effects[id] = data - -class Encounters(CacheManager): - def __init__(self) -> None: - super().__init__() - self.encounter_methods = dict() - self.encounter_conditions = dict() - self.encounter_condition_values = dict() - - def add_encounter_method(self, id, data: dict) -> None: - if not len(self.name_id_map) >= 10: - self.encounter_methods[id] = data - else: - self.__init__() - self.encounter_methods[id] = data - - def add_encounter_condition(self, id, data: dict) -> None: - if not len(self.name_id_map) >= 10: - self.encounter_conditions[id] = data - else: - self.__init__() - self.encounter_conditions[id] = data - - def add_encounter_condition_value(self, id, data: dict) -> None: - if not len(self.name_id_map) >= 10: - self.encounter_condition_values[id] = data - else: - self.__init__() - self.encounter_condition_values[id] = data - - - -class Evolutions: - def __init__(self) -> None: - self.evolution_chains = dict() - self.evolution_triggers = dict() - - def add_evolution_chain(self, id, data: dict) -> None: - if (not len(self.evolution_chains) >= 10 or - not len(self.evolution_triggers) >= 10): - self.evolution_chains[id] = data - else: - self.__init__() - self.encounter_condition_values[id] = data - - def add_evolution_trigger(self, id, data: dict) -> None: - if (not len(self.evolution_chains) >= 10 or - not len(self.evolution_triggers) >= 10): - self.evolution_triggers[id] = data - else: - self.__init__() - self.evolution_triggers[id] = data - - - -class Games(CacheManager): - def __init__(self) -> None: - super().__init__() - self.generations = dict() - self.pokedexes = dict() - self.versions = dict() - self.version_groups = dict() - - def add_generation(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.generations[id] = data - else: - self.__init__() - self.generations[id] = data - - def add_pokedex(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.pokedexes[id] = data - else: - self.__init__() - self.pokedexes[id] = data - - def add_version(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.versions[id] = data - else: - self.__init__() - self.versions[id] = data - - def add_version_group(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.version_groups[id] = data - else: - self.__init__() - self.version_groups[id] = data - - -class Items(CacheManager): - def __init__(self) -> None: - super().__init__() - self.item_attributes = dict() - self.item_categories = dict() - self.item_fling_effects = dict() - self.item_pockets = dict() - self.items = dict() - - def add_item_attribute(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.item_attributes[id] = data - else: - self.__init__() - self.item_attributes[id] = data - - def add_item_category(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.item_categories[id] = data - else: - self.__init__() - self.item_categories[id] = data - - def add_item_fling_effect(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.item_fling_effects[id] = data - else: - self.__init__() - self.item_fling_effects[id] = data - - def add_item_pocket(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.item_pockets[id] = data - else: - self.__init__() - self.item_pockets[id] = data - -class Locations(CacheManager): - def __init__(self) -> None: - super().__init__() - self.locations = dict() - self.location_areas = dict() - self.pal_park_areas = dict() - self.regions = dict() - - def add_location(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.locations[id] = data - else: - self.__init__() - self.locations[id] = data - - - def add_location_area(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.location_areas[id] = data - else: - self.__init__() - self.location_areas[id] = data - - def add_pal_park_area(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.pal_park_areas[id] = data - else: - self.__init__() - self.pal_park_areas[id] = data - - - def add_region(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.regions[id] = data - else: - self.__init__() - self.regions[id] = data - - - -class Machines(CacheManager): - def __init__(self) -> None: - super().__init__() - self.machines = dict() - - def add_machine(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.machines[id] = data - else: - self.__init__() - self.machines[id] = data - - - -class Moves(CacheManager): - def __init__(self) -> None: - super().__init__() - self.moves = dict() - self.move_ailments = dict() - self.move_battle_styles = dict() - self.move_categories = dict() - self.move_damage_classes = dict() - self.move_learn_methods = dict() - self.move_targets = dict() - - def add_move(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.moves[id] = data - else: - self.__init__() - self.moves[id] = data - - def add_move_ailment(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.move_ailments[id] = data - else: - self.__init__() - self.move_ailments[id] = data - - def add_move_battle_style(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.move_battle_styles[id] = data - else: - self.__init__() - self.move_battle_styles[id] = data - - def add_move_category(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.move_categories[id] = data - else: - self.__init__() - self.move_categories[id] = data - - def add_move_damage_class(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.move_damage_classes[id] = data - else: - self.__init__() - self.move_damage_classes[id] = data - - def add_move_learn_method(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.move_learn_methods[id] = data - else: - self.__init__() - self.move_learn_methods[id] = data - - def add_move_target(self, id, data: dict) -> None: - if not len(self.evolution_chains) >= 10: - self.move_targets[id] = data - else: - self.__init__() - self.move_targets[id] = data - -class Pokemons(CacheManager): - def __init__(self) -> None: - super().__init__() - self.abilities = dict() - self.characteristics = dict() - self.genders = dict() - self.growth_rates = dict() - self.natures = dict() - self.pokeathlon_stats = dict() - self.pokemons = dict() - self.pokemon_location_areas = dict() - self.pokemon_colors = dict() - self.pokemon_forms = dict() - self.pokemon_habitats = dict() - self.pokemon_shapes = dict() - self.pokemon_species = dict() - self.stats = dict() - self.types = dict() - - - def add_ability(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.abilities[id] = data - else: - self.__init__() - self.abilities[id] = data - - def add_characteristic(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.characteristics[id] = data - else: - self.__init__() - self.characteristics[id] = data - - def add_gender(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.genders[id] = data - else: - self.__init__() - self.genders[id] = data - - def add_growth_rate(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.growth_rates[id] = data - else: - self.__init__() - self.growth_rates[id] = data - - - def add_nature(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.natures[id] = data - else: - self.__init__() - self.natures[id] = data - - - def add_pokeathlon_stat(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.pokeathlon_stats[id] = data - else: - self.__init__() - self.pokeathlon_stats[id] = data - - - def add_pokemon(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.pokemons[id] = data - else: - self.__init__() - self.pokemons[id] = data - - - def add_pokemon_location_area(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.pokemon_location_areas[id] = data - else: - self.__init__() - self.pokemon_location_areas[id] = data - - - def add_pokemon_color(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.pokemon_colors[id] = data - else: - self.__init__() - self.pokemon_colors[id] = data - - - def add_pokemon_form(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.pokemon_forms[id] = data - else: - self.__init__() - self.pokemon_forms[id] = data - - - def add_pokemon_habitat(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.pokemon_habitats[id] = data - else: - self.__init__() - self.pokemon_habitats[id] = data - - - def add_pokemon_shape(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.pokemon_shapes[id] = data - else: - self.__init__() - self.pokemon_shapes[id] = data - - - def add_pokemon_species(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.pokemon_species[id] = data - else: - self.__init__() - self.pokemon_species[id] = data - - - def add_stat(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.stats[id] = data - else: - self.__init__() - self.stats[id] = data - - - def add_type(self, id, data: dict) -> None: - if ( - not len(self.name_id_map) >= 10 - or not len(self.characteristics) >= 10 - or not len(self.genders) >= 10 - or not len(self.growth_rates) >= 10 - ): - self.types[id] = data - else: - self.__init__() - self.types[id] = data - \ No newline at end of file diff --git a/Pokemon/caching.py b/Pokemon/caching.py new file mode 100644 index 0000000..120b601 --- /dev/null +++ b/Pokemon/caching.py @@ -0,0 +1,67 @@ +import typing +import abc + + +class CacheDict(dict): + def __add__( + self, other: typing.Dict[typing.Any, typing.Any] + ) -> typing.Dict[typing.Any, typing.Any]: + return CacheDict({**self, **other}) + + def __iadd__( + self, other: typing.Dict[typing.Any, typing.Any] + ) -> typing.Dict[typing.Any, typing.Any]: + return CacheDict({**self, **other}) + + +class CacheBase(abc.ABC): + def __init__(self) -> None: + self.name_id_map = CacheDict() + self.cached_data = CacheDict() + + def add_new(self, field: str, other: typing.Dict[typing.Any, typing.Any]): + self.name_id_map += CacheDict({other.get("name"): other.get("id")}) + try: + self.cached_data[other.get("id")] += CacheDict({field: other}) + except KeyError: + self.cached_data[other.get("id")] = CacheDict({field: other}) + + +class BerryCache(CacheBase): + ... + + +class ContestCache(CacheBase): + ... + + +class EncounterCache(CacheBase): + ... + + +class EvolutionCache(CacheBase): + ... + + +class GameCache(CacheBase): + ... + + +class ItemCache(CacheBase): + ... + + +class LocationCache(CacheBase): + ... + + +class MachineCache(CacheBase): + ... + + +class MoveCache(CacheBase): + ... + + +class PokemonCache(CacheBase): + ... diff --git a/Pokemon/errors.py b/Pokemon/errors.py index de8b92f..c779243 100644 --- a/Pokemon/errors.py +++ b/Pokemon/errors.py @@ -42,7 +42,7 @@ class MoveNotFound(Exception): def __init__(self, arg: str) -> None: super().__init__(f"Move was not found : {arg}") - + class PokemonNotFound(Exception): def __init__(self, arg: str) -> None: super().__init__(f"Pokemon was not found : {arg}") diff --git a/Pokemon/objects.py b/Pokemon/objects.py new file mode 100644 index 0000000..41f4161 --- /dev/null +++ b/Pokemon/objects.py @@ -0,0 +1,679 @@ +from Pokemon.base import BaseType1, BaseType2 +import Pokemon.caching as caching +import Pokemon.errors as errors + +berry_cache = caching.BerryCache() +contest_cache = caching.ContestCache() +encounter_cache = caching.EncounterCache() +evolution_cache = caching.EvolutionCache() +game_cache = caching.GameCache() +item_cache = caching.ItemCache() +location_cache = caching.LocationCache() +machine_cache = caching.MachineCache() +move_cache = caching.MoveCache() +pokemon_cache = caching.PokemonCache() + + +class BerryGroup(BaseType1): + @property + def cache(self) -> object: + return berry_cache + + @property + def error(self) -> Exception: + return errors.BerryNotFound + + @property + def parsed_data(self) -> object: + ... + + @property + def address(self) -> str: + ... + + +class Berry(BerryGroup): + @property + def address(self) -> str: + return "berry" + + @property + def parsed_data(self) -> object: + return + + +class BerryFirmness(BerryGroup): + @property + def address(self) -> str: + return "berry-firmness" + + @property + def parsed_data(self) -> object: + return + + +class BerryFlavour(BerryGroup): + @property + def address(self) -> str: + return "berry-flavour" + + @property + def parsed_data(self) -> object: + return + + +class ContestGroup(BaseType2): + @property + def cache(self) -> object: + return contest_cache + + @property + def error(self) -> Exception: + return errors.ContestNotFound + + @property + def parsed_data(self) -> object: + ... + + @property + def address(self) -> str: + ... + + +class ContestType(BaseType1): + @property + def address(self) -> str: + return "contest-type" + + @property + def cache(self) -> object: + return contest_cache + + @property + def error(self) -> Exception: + return errors.ContestNotFound + + @property + def parsed_data(self) -> object: + ... + + +class ContestEffect(ContestGroup): + @property + def address(self) -> str: + return "contest-effect" + + @property + def parsed_data(self) -> object: + return + + +class SuperContestEffect(ContestGroup): + @property + def address(self) -> str: + return "super-contest-effect" + + @property + def parsed_data(self) -> object: + return + + +class EncounterGroup(BaseType1): + @property + def address(self) -> str: + ... + + @property + def cache(self) -> object: + return encounter_cache + + @property + def error(self) -> Exception: + return errors.EncounterNotFound + + @property + def parsed_data(self) -> object: + ... + + +class EncounterMethod(EncounterGroup): + @property + def address(self) -> str: + return "encounter-method" + + @property + def parsed_data(self) -> object: + return + + +class EncounterCondition(EncounterGroup): + @property + def address(self) -> str: + return "encounter-condition" + + @property + def parsed_data(self) -> object: + return + + +class EncounterConditionValue(EncounterGroup): + @property + def address(self) -> str: + return "encounter-condition-value" + + @property + def parsed_data(self) -> object: + return + + +class EvolutionGroup(BaseType2): + @property + def address(self) -> str: + ... + + @property + def cache(self) -> object: + return evolution_cache + + @property + def error(self) -> Exception: + return errors.EvolutionNotFound + + @property + def parsed_data(self) -> object: + ... + + +class EvolutionChain(EvolutionGroup): + @property + def address(self) -> str: + return "evolution-chain" + + @property + def parsed_data(self) -> object: + return + + +class EvolutionTrigger(EvolutionGroup): + @property + def address(self) -> str: + return "evolution-trigger" + + @property + def parsed_data(self) -> object: + return + + +class GameGroup(BaseType1): + @property + def address(self) -> str: + ... + @property + def cache(self) -> object: + return game_cache + + @property + def error(self) -> Exception: + return errors.GameNotFound + + @property + def parsed_data(self) -> object: + ... + + +class Generation(GameGroup): + @property + def address(self) -> str: + return "generation" + + @property + def parsed_data(self) -> object: + return + + +class Pokedex(GameGroup): + @property + def address(self) -> str: + return "pokedex" + + @property + def parsed_data(self) -> object: + return + + +class Version(GameGroup): + @property + def address(self) -> str: + return "version" + + @property + def parsed_data(self) -> object: + return + + +class VersionGroup(GameGroup): + @property + def address(self) -> str: + return "version-group" + + @property + def parsed_data(self) -> object: + return + + +class ItemGroup(BaseType1): + @property + def address(self) -> str: + ... + @property + def cache(self) -> object: + return item_cache + + @property + def error(self) -> Exception: + return errors.ItemNotFound + + @property + def parsed_data(self) -> object: + ... + + +class ItemAttribute(ItemGroup): + @property + def address(self) -> str: + return "item-attribute" + + @property + def parsed_data(self) -> object: + return + + +class ItemCategory(ItemGroup): + @property + def address(self) -> str: + return "item-category" + + @property + def parsed_data(self) -> object: + return + + +class ItemFlingEffect(ItemGroup): + @property + def address(self) -> str: + return "item-fling-effect" + + @property + def parsed_data(self) -> object: + return + + +class Item(ItemGroup): + @property + def address(self) -> str: + return "item" + + @property + def parsed_data(self) -> object: + return + + +class LocationGroup(BaseType1): + @property + def address(self) -> str: + ... + @property + def cache(self) -> object: + return location_cache + + @property + def error(self) -> Exception: + return errors.LocationNotFound + + @property + def parsed_data(self) -> object: + ... + + +class Location(LocationGroup): + @property + def address(self) -> str: + return "location" + + @property + def parsed_data(self) -> object: + return + + +class LocationArea(LocationGroup): + @property + def address(self) -> str: + return "location-area" + + @property + def parsed_data(self) -> object: + return + + +class PalParkArea(LocationGroup): + @property + def address(self) -> str: + return "pal-park-area" + + @property + def parsed_data(self) -> object: + return + + +class Region(LocationGroup): + @property + def address(self) -> str: + return "region" + + @property + def parsed_data(self) -> object: + return + + +class Machine(BaseType2): + @property + def address(self) -> str: + return "machine" + + @property + def cache(self) -> object: + return machine_cache + + @property + def error(self) -> Exception: + return errors.MachineNotFound + + @property + def parsed_data(self) -> object: + return + + +class MoveGroup(BaseType1): + @property + def address(self) -> str: + ... + @property + def error(self) -> Exception: + return errors.MoveNotFound + + @property + def cache(self) -> object: + return move_cache + + @property + def parsed_data(self) -> object: + ... + + +class Move(MoveGroup): + @property + def address(self) -> str: + return "move" + + @property + def parsed_data(self) -> object: + return + + +class MoveAilment(MoveGroup): + @property + def address(self) -> str: + return "move-ailment" + + @property + def parsed_data(self) -> object: + return + + +class MoveBattleStyle(MoveGroup): + @property + def address(self) -> str: + return "move-battle-style" + + @property + def parsed_data(self) -> object: + return + + +class MoveCategory(MoveGroup): + @property + def address(self) -> str: + return "move-category" + + @property + def parsed_data(self) -> object: + return + + +class MoveDamageClass(MoveGroup): + @property + def address(self) -> str: + return "move-damage-class" + + @property + def parsed_data(self) -> object: + return + + +class MoveLearnMethod(MoveGroup): + @property + def address(self) -> str: + return "move-learn-method" + + @property + def parsed_data(self) -> object: + return + + +class MoveTarget(MoveGroup): + @property + def address(self) -> str: + return "move-target" + + @property + def parsed_data(self) -> object: + return + + +class PokemonGroup(BaseType1): + @property + def address(self) -> str: + ... + @property + def error(self) -> Exception: + return errors.PokemonNotFound + + @property + def cache(self) -> object: + return pokemon_cache + + @property + def parsed_data(self) -> object: + ... + + +class Ability(PokemonGroup): + @property + def address(self) -> str: + return "ability" + + @property + def parsed_data(self) -> object: + return + +class Characteristic(BaseType2): + @property + def address(self) -> str: + return "characteristic" + + @property + def parsed_data(self) -> object: + return + + @property + def error(self) -> Exception: + return errors.PokemonNotFound + + @property + def cache(self) -> object: + return pokemon_cache + + +class Gender(BaseType2): + @property + def address(self) -> str: + return "gender" + + @property + def parsed_data(self) -> object: + return + + @property + def error(self) -> Exception: + return errors.PokemonNotFound + + @property + def cache(self) -> object: + return pokemon_cache + + + +class GrowthRate(BaseType2): + @property + def address(self) -> str: + return "growth-rate" + + @property + def parsed_data(self) -> object: + return + + @property + def error(self) -> Exception: + return errors.PokemonNotFound + + @property + def cache(self) -> object: + return pokemon_cache + + + +class Nature(PokemonGroup): + @property + def address(self) -> str: + return "nature" + + @property + def parsed_data(self) -> object: + return + + +class PokeathlonStat(PokemonGroup): + @property + def address(self) -> str: + return "pokeathlon-stat" + + @property + def parsed_data(self) -> object: + return + + +class Pokemon(PokemonGroup): + @property + def address(self) -> str: + return "pokemon" + + @property + def parsed_data(self) -> object: + return + + +class PokemonLocationArea(PokemonGroup): + @property + def address(self) -> str: + return "pokemon" + + @property + def url(self) -> str: + return ( + f"https://pokeapi.co/api/v2/pokemon/{self.id}/encounters" + or f"https://pokeapi.co/api/v2/pokemon{self.name}/encounters" + ) + + @property + def parsed_data(self) -> object: + return + + +class PokemonColor(PokemonGroup): + @property + def address(self) -> str: + return "pokemon-color" + + @property + def parsed_data(self) -> object: + return + + +class PokemonForm(PokemonGroup): + @property + def address(self) -> str: + return "pokemon-form" + + @property + def parsed_data(self) -> object: + return + + +class PokemonHabitat(PokemonGroup): + @property + def address(self) -> str: + return "pokemon-habitat" + + @property + def parsed_data(self) -> object: + return + + +class PokemonShape(PokemonGroup): + @property + def address(self) -> str: + return "pokemon-shape" + + @property + def parsed_data(self) -> object: + return + + +class PokemonSpecies(PokemonGroup): + @property + def address(self) -> str: + return "pokemon-species" + + @property + def parsed_data(self) -> object: + return + + +class Stat(PokemonGroup): + @property + def address(self) -> str: + return "stat" + + @property + def parsed_data(self) -> object: + return + + +class Type(PokemonGroup): + @property + def address(self) -> str: + return "type" + + @property + def parsed_data(self) -> object: + return diff --git a/Pokemon/objects/berries.py b/Pokemon/objects/berries.py deleted file mode 100644 index 03a9e68..0000000 --- a/Pokemon/objects/berries.py +++ /dev/null @@ -1,151 +0,0 @@ -from typing import Union, Any -from dataclasses import dataclass -import httpx -import json -from ..url import base_url -from ..cache import Berries -from ..errors import BerryNotFound - -BerryCache = Berries() - -@dataclass(frozen=True) -class BerryFirmness: - """Determination of berry's softness or hardness.""" - - name_or_id: Union[str, int] - from_cache: bool = False - - @property - def url(self) -> str: - return f"{base_url}berry-firmness/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise BerryNotFound(self.name_or_id) - else: - BerryCache.add_berry_firmness(data.get('id'), data) - BerryCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = BerryCache.name_id_map.get( - self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise BerryNotFound(self.name_or_id) - else: - BerryCache.add_berry_firmness(data.get('id'), data) - BerryCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise BerryNotFound(self.name_or_id) - data = BerryCache.berry_firmness.get(id) - return data - - -@dataclass(frozen=True) -class BerryFlavour: - """Flavors determine whether a Pokémon will benefit or suffer from eating a berry based - on their nature.""" - - name_or_id: Union[str, int] - from_cache: bool = False - - @property - def url(self) -> str: - return f"{base_url}berry-flavor/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise BerryNotFound(self.name_or_id) - else: - BerryCache.add_berry_flavour(data.get('id'), data) - BerryCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = BerryCache.name_id_map.get( - self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise BerryNotFound(self.name_or_id) - else: - BerryCache.add_berry_flavour(data.get('id'), data) - BerryCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise BerryNotFound(self.name_or_id) - data = BerryCache.berry_flavours.get(id) - return data - - -@dataclass(frozen=True) -class Berry: - """Berries are small fruits that can provide HP and status condition restoration, stat enhancement, - and even damage negation when eaten by Pokémon.""" - - name_or_id: Union[str, int] - from_cache: bool = False - - @property - def url(self) -> str: - return f"{base_url}berry/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise BerryNotFound(self.name_or_id) - else: - BerryCache.add_berry(data.get('id'), data) - BerryCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = BerryCache.name_id_map.get( - self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise BerryNotFound(self.name_or_id) - else: - BerryCache.add_berry(data.get('id'), data) - BerryCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise BerryNotFound(self.name_or_id) - data = BerryCache.berries.get(id) - return data diff --git a/Pokemon/objects/contests.py b/Pokemon/objects/contests.py deleted file mode 100644 index 7afece0..0000000 --- a/Pokemon/objects/contests.py +++ /dev/null @@ -1,136 +0,0 @@ -from typing import Union, Any -from dataclasses import dataclass -import httpx -import json -from ..url import base_url -from ..cache import Contests -from ..errors import ContestNotFound - -ContestCache = Contests() - - -@dataclass(frozen=True) -class ContestType: - """Contest types are categories judges used to weigh a Pokémon's condition in Pokémon contests.""" - - name_or_id: Union[str, int] - from_cache: bool = False - - @property - def url(self) -> str: - return f"{base_url}contest-type/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ContestNotFound(self.name_or_id) - else: - ContestCache.add_contest_type(data.get('id'), data) - ContestCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = ContestCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ContestCache(self.name_or_id) - else: - ContestCache.add_contest_type(data.get('id'), data) - ContestCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise ContestNotFound(self.name_or_id) - data = ContestCache.contest_types.get(id) - return data - - -@dataclass(frozen=True) -class ContestEffect: - """Contest effects refer to the effects of moves when used in contests.""" - - id: int - from_cache: bool = False - - @property - def url(self) -> str: - return f"{base_url}contest-effect/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ContestNotFound(self.id) - else: - ContestCache.add_contest_effect(data.get('id'), data) - return data - else: - if isinstance(self.id, str): - try: - id = int(self.id) - except ValueError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ContestNotFound(self.id) - else: - ContestCache.add_contest_effect(data.get('id'), data) - return data - elif isinstance(self.id, int): - id = self.id - else: - raise ContestNotFound(self.id) - data = ContestCache.contest_effects.get(id) - return data - -@dataclass(frozen=True) -class SuperContestEffect: - """Super contest effects refer to the effects of moves when used in super contests.""" - - id: int - from_cache: bool = False - - @property - def url(self) -> str: - return f"{base_url}super-contest-effect/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ContestNotFound(self.id) - else: - ContestCache.add_super_contest_effect(data.get('id'), data) - return data - else: - if isinstance(self.id, str): - try: - id = int(self.id) - except ValueError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ContestNotFound(self.id) - else: - ContestCache.add_super_contest_effect(data.get('id'), data) - return data - elif isinstance(self.id, int): - id = self.id - else: - raise ContestNotFound(self.id) - data = ContestCache.super_contest_effects.get(id) - return data diff --git a/Pokemon/objects/encounters.py b/Pokemon/objects/encounters.py deleted file mode 100644 index 60cce00..0000000 --- a/Pokemon/objects/encounters.py +++ /dev/null @@ -1,148 +0,0 @@ -from typing import Union, Any -from dataclasses import dataclass -import httpx -import json -from ..url import base_url -from ..cache import Encounters -from ..errors import EncounterNotFound - - -EncounterCache = Encounters() - -@dataclass(frozen=True) -class EncounterMethod: - - """Methods by which the player might can encounter Pokémon in the wild, e.g., walking in tall grass.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self): - return f"{base_url}encounter-method/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EncounterNotFound(self.name_or_id) - else: - EncounterCache.add_encounter_method(data.get('id'), data) - EncounterCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = EncounterCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EncounterNotFound(self.name_or_id) - else: - EncounterCache.add_encounter_method(data.get('id'), data) - EncounterCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise EncounterNotFound(self.name_or_id) - data = EncounterCache.encounter_methods.get(id) - return data - -@dataclass(frozen=True) -class EncounterCondition: - - """Conditions which affect what pokemon might appear in the wild, e.g., day or night.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self): - return f"{base_url}encounter-condition/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EncounterNotFound(self.name_or_id) - else: - EncounterCache.add_encounter_condition(data.get('id'), data) - EncounterCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = EncounterCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EncounterNotFound(self.name_or_id) - else: - EncounterCache.add_encounter_condition(data.get('id'), data) - EncounterCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise EncounterNotFound(self.name_or_id) - data = EncounterCache.encounter_conditions.get(id) - return data - -@dataclass(frozen=True) -class EncounterConditionValue: - - """Encounter condition values are the various states that an encounter condition can have, i.e., time of day can be either day or night.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self): - return f"{base_url}encounter-condition-value/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EncounterNotFound(self.name_or_id) - else: - EncounterCache.add_encounter_condition_value(data.get('id'), data) - EncounterCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = EncounterCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EncounterNotFound(self.name_or_id) - else: - EncounterCache.add_encounter_condition_value(data.get('id'), data) - EncounterCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise EncounterNotFound(self.name_or_id) - data = EncounterCache.encounter_condition_values.get(id) - return data \ No newline at end of file diff --git a/Pokemon/objects/evolution.py b/Pokemon/objects/evolution.py deleted file mode 100644 index 20e3d1a..0000000 --- a/Pokemon/objects/evolution.py +++ /dev/null @@ -1,96 +0,0 @@ -from typing import Any -from dataclasses import dataclass -import json -from ..url import base_url -from ..cache import Evolutions -from ..errors import EvolutionNotFound -import httpx - -EvolutionCache = Evolutions() - -@dataclass(frozen=True) -class EvolutionChain: - - """Evolution chains are essentially family trees. - They start with the lowest - stage within a family and detail evolution - conditions for each as well as - Pokémon they can evolve into up through the hierarchy.""" - - id: int - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}evolution-chain/{self.id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EvolutionNotFound(self.id) - else: - EvolutionCache.add_evolution_chain(data.get('id'), data) - return data - else: - if isinstance(self.id, str): - try: - id = int(self.id) - except ValueError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EvolutionNotFound(self.id) - else: - EvolutionCache.add_evolution_chain(data.get('id'), data) - return data - elif isinstance(self.id, int): - id = self.id - else: - raise EvolutionNotFound(self.id) - data = EvolutionCache.evolution_chains.get(id) - return data - -@dataclass(frozen=True) -class EvolutionTrigger: - - """Evolution triggers are the events and - conditions that cause a Pokémon to evolve.""" - - id: int - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}evolution-trigger/{self.id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EvolutionNotFound(self.id) - else: - EvolutionCache.add_evolution_trigger(data.get('id'), data) - return data - else: - if isinstance(self.id, str): - try: - id = int(self.id) - except ValueError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise EvolutionNotFound(self.id) - else: - EvolutionCache.add_evolution_trigger(data.get('id'), data) - return data - elif isinstance(self.id, int): - id = self.id - else: - raise EvolutionNotFound(self.id) - data = EvolutionCache.evolution_triggers.get(id) - return data \ No newline at end of file diff --git a/Pokemon/objects/games.py b/Pokemon/objects/games.py deleted file mode 100644 index 264eb9e..0000000 --- a/Pokemon/objects/games.py +++ /dev/null @@ -1,200 +0,0 @@ -from typing import Union, Any -from dataclasses import dataclass -import httpx -import json -from ..url import base_url -from ..cache import Games -from ..errors import GameNotFound - -GameCache = Games() - -@dataclass(frozen=True) -class Generation: - - """A generation is a grouping of the Pokémon games that - separates them based on the Pokémon they include. - In each generation, a new set of Pokémon, Moves, - Abilities and Types that did not exist - in the previous generation are released.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}generation/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise GameNotFound(self.name_or_id) - else: - GameCache.add_generation(data.get('id'), data) - GameCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = GameCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise GameNotFound(self.name_or_id) - else: - GameCache.add_generation(data.get('id'), data) - GameCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise GameNotFound(self.name_or_id) - data = GameCache.generations.get(id) - return data - -@dataclass(frozen=True) -class Pokedex: - - """A Pokédex is a handheld electronic encyclopedia device; - one which is capable of recording and retaining information - of the various Pokémon in a given region with the exception of the national - dex and some smaller dexes related to portions of a region.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pokedex/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise GameNotFound(self.name_or_id) - else: - GameCache.add_pokedex(data.get('id'), data) - GameCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = GameCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise GameNotFound(self.name_or_id) - else: - GameCache.add_pokedex(data.get('id'), data) - GameCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise GameNotFound(self.name_or_id) - data = GameCache.pokedexes.get(id) - return data - -@dataclass(frozen=True) -class Version: - - """Versions of the games, e.g., Red, Blue or Yellow.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}version/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise GameNotFound(self.name_or_id) - else: - GameCache.add_version(data.get('id'), data) - GameCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = GameCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise GameNotFound(self.name_or_id) - else: - GameCache.add_version(data.get('id'), data) - GameCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise GameNotFound(self.name_or_id) - data = GameCache.versions.get(id) - return data - -@dataclass(frozen=True) -class VersionGroup: - - """Version groups categorize highly similar versions of the games.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}version-group/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise GameNotFound(self.name_or_id) - else: - GameCache.add_version_group(data.get('id'), data) - GameCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = GameCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise GameNotFound(self.name_or_id) - else: - GameCache.add_version_group(data.get('id'), data) - GameCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise GameNotFound(self.name_or_id) - data = GameCache.version_groups.get(id) - return data \ No newline at end of file diff --git a/Pokemon/objects/items.py b/Pokemon/objects/items.py deleted file mode 100644 index bda3582..0000000 --- a/Pokemon/objects/items.py +++ /dev/null @@ -1,250 +0,0 @@ -from typing import Union, Any -from dataclasses import dataclass -import httpx -import json -from ..url import base_url -from ..cache import Items -from ..errors import ItemNotFound - -ItemCache = Items() - -@dataclass(frozen=True) -class ItemAttribute: - - """An item is an object in the games which the - player can pick up, keep in their bag, and use - in some manner. They have various uses, - including healing, powering up, - helping catch Pokémon, or to access a new area.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self): - return f"{base_url}item-attribute/{self.name_or_id}/" - - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item_attribute(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = ItemCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item_attribute(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise ItemNotFound(self.name_or_id) - data = ItemCache.item_attributes.get(id) - return data -@dataclass(frozen=True) -class ItemCategory: - - """Item categories determine where - items will be placed in the players bag.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self): - return f"{base_url}item-category/{self.name_or_id}/" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item_category(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = ItemCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item_category(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise ItemNotFound(self.name_or_id) - data = ItemCache.item_categories.get(id) - return data - -@dataclass(frozen=True) -class ItemFlingEffect: - - """The various effects of the move - "Fling" when used with different items.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self): - return f"{base_url}item-fling-effect/{self.name_or_id}/" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item_fling_effect(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = ItemCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item_fling_effect(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise ItemNotFound(self.name_or_id) - data = ItemCache.item_fling_effects.get(id) - return data - -@dataclass(frozen=True) -class ItemPocket: - - """Pockets within the - players bag used for storing items by category.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self): - return f"{base_url}item-pocket/{self.name_or_id}/" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item_pocket(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = ItemCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item_pocket(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise ItemNotFound(self.name_or_id) - data = ItemCache.item_pockets.get(id) - return data - -@dataclass(frozen=True) -class Item: - - """An item is an object in the games which - the player can pick up, keep in their bag, - and use in some manner. - They have various uses, including healing, powering up, - helping catch Pokémon, or to access a new area.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self): - return f"{base_url}item/{self.name_or_id}/" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = ItemCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise ItemNotFound(self.name_or_id) - else: - ItemCache.add_item(data.get('id'), data) - ItemCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise ItemNotFound(self.name_or_id) - data = ItemCache.items.get(id) - return data \ No newline at end of file diff --git a/Pokemon/objects/locations.py b/Pokemon/objects/locations.py deleted file mode 100644 index 38d70a8..0000000 --- a/Pokemon/objects/locations.py +++ /dev/null @@ -1,202 +0,0 @@ -from typing import Union, Any -from dataclasses import dataclass -import httpx -import json -from ..url import base_url -from ..cache import Locations -from ..errors import LocationNotFound - -LocationCache = Locations() - -@dataclass(frozen=True) -class Location: - - """Locations that can be visited within the games. - Locations make up sizable portions of regions, - like cities or routes.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}location/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise LocationNotFound(self.name_or_id) - else: - LocationCache.add_location(data.get('id'), data) - LocationCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = LocationCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise LocationNotFound(self.name_or_id) - else: - LocationCache.add_location(data.get('id'), data) - LocationCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise LocationNotFound(self.name_or_id) - data = LocationCache.locations.get(id) - return data - -@dataclass(frozen=True) -class LocationArea: - - """Location areas are sections of areas, - such as floors in a building or cave. - Each area has its own set of - possible Pokémon encounters.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}location-area/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise LocationNotFound(self.name_or_id) - else: - LocationCache.add_location_area(data.get('id'), data) - LocationCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = LocationCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise LocationNotFound(self.name_or_id) - else: - LocationCache.add_location_area(data.get('id'), data) - LocationCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise LocationNotFound(self.name_or_id) - data = LocationCache.location_area.get(id) - return data - -@dataclass(frozen=True) -class PalParkArea: - - """Areas used for grouping Pokémon encounters in Pal Park.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pal-park-area/{self.name_or_id}" - - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise LocationNotFound(self.name_or_id) - else: - LocationCache.add_pal_park_area(data.get('id'), data) - LocationCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = LocationCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise LocationNotFound(self.name_or_id) - else: - LocationCache.add_pal_park_area(data.get('id'), data) - LocationCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise LocationNotFound(self.name_or_id) - data = LocationCache.pal_park_areas.get(id) - return data - -@dataclass(frozen=True) -class Region: - - """A region is an organized area of the Pokémon world. - Most often, the main difference - between regions is the species - of Pokémon that can be encountered within them.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}region/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise LocationNotFound(self.name_or_id) - else: - LocationCache.add_region(data.get('id'), data) - LocationCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = LocationCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise LocationNotFound(self.name_or_id) - else: - LocationCache.add_region(data.get('id'), data) - LocationCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise LocationNotFound(self.name_or_id) - data = LocationCache.regions.get(id) - return data \ No newline at end of file diff --git a/Pokemon/objects/machines.py b/Pokemon/objects/machines.py deleted file mode 100644 index f7f8759..0000000 --- a/Pokemon/objects/machines.py +++ /dev/null @@ -1,52 +0,0 @@ -from typing import Union, Any -from dataclasses import dataclass -from ..url import base_url -from ..cache import Machines -from ..errors import MachineNotFound -import json -import httpx - -MachineCache = Machines() - -@dataclass(frozen=True) -class Machine: - - """Machines are the representation of items that - teach moves to Pokémon. They vary from version to version, so it is not certain that one - specific TM or HM corresponds to a single Machine.""" - - id : int - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}machine/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MachineNotFound(self.id) - else: - MachineCache.add_machine(data.get('id'), data) - return data - else: - if isinstance(self.id, str): - try: - id = int(self.id) - except ValueError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MachineNotFound(self.id) - else: - MachineCache.add_machine(data.get('id'), data) - return data - elif isinstance(self.id, int): - id = self.id - else: - raise MachineNotFound(self.id) - data = MachineCache.machines.get(id) - return data \ No newline at end of file diff --git a/Pokemon/objects/moves.py b/Pokemon/objects/moves.py deleted file mode 100644 index 7dc1082..0000000 --- a/Pokemon/objects/moves.py +++ /dev/null @@ -1,340 +0,0 @@ -from typing import Union, Any -from dataclasses import dataclass -from ..url import base_url -from ..cache import Moves -from ..errors import MoveNotFound -import json -import httpx - -MovesCache = Moves() - -@dataclass(frozen=True) -class Move: - - """Moves are the skills of Pokémon in battle. - In battle, a Pokémon uses one move each turn. - Some moves (including those learned by Hidden Machine) - can be used outside of battle as well, usually for the - purpose of removing obstacles or exploring new areas.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}move/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = MovesCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise MoveNotFound(self.name_or_id) - data = MovesCache.moves.get(id) - return data - -@dataclass(frozen=True) -class MoveAilment: - - """Move Ailments are status conditions - caused by moves used during battle.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}move-ailment/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_ailment(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = MovesCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_ailment(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise MoveNotFound(self.name_or_id) - data = MovesCache.move_ailments.get(id) - return data - -@dataclass(frozen=True) -class MoveBattleStyle: - - """Styles of moves when used in the Battle Palace.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}move-battle-style/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_battle_style(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = MovesCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_battle_style(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise MoveNotFound(self.name_or_id) - data = MovesCache.move_battle_styles.get(id) - return data - -@dataclass(frozen=True) -class MoveCategory: - - """Very general categories that loosely - group move effects.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}move-category/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_category(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = MovesCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_category(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise MoveNotFound(self.name_or_id) - data = MovesCache.move_categories.get(id) - return data - -@dataclass(frozen=True) -class MoveDamageClass: - - """Damage classes moves can have, - e.g. physical, special, or non-damaging.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}move-damage-class/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_damage_class(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = MovesCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_damage_class(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise MoveNotFound(self.name_or_id) - data = MovesCache.move_damage_classes.get(id) - return data - -@dataclass(frozen=True) -class MoveLearnMethod: - - """Methods by which Pokémon can learn moves.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}move-learn-method/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_learn_method(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = MovesCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_learn_method(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise MoveNotFound(self.name_or_id) - data = MovesCache.move_learn_methods.get(id) - return data - -@dataclass(frozen=True) -class MoveTarget: - - """Targets moves can be directed at during battle. - Targets can be Pokémon, environments - or even other moves.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}move-target/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_target(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = MovesCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise MoveNotFound(self.name_or_id) - else: - MovesCache.add_move_target(data.get('id'), data) - MovesCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise MoveNotFound(self.name_or_id) - data = MovesCache.move_targets.get(id) - return data \ No newline at end of file diff --git a/Pokemon/objects/pokemons.py b/Pokemon/objects/pokemons.py deleted file mode 100644 index c9bb710..0000000 --- a/Pokemon/objects/pokemons.py +++ /dev/null @@ -1,730 +0,0 @@ -from typing import Union, Any -from dataclasses import dataclass -from ..url import base_url -from ..cache import Pokemons -from ..errors import PokemonNotFound -import json -import httpx - -PokemonsCache = Pokemons() - -@dataclass(frozen=True) -class Ability: - - """Abilities provide passive effects for - Pokémon in battle or in the overworld. - Pokémon have multiple possible abilities - but can have only one ability at a time.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}ability/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_ability(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_ability(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.abilities.get(id) - return data - -@dataclass(frozen=True) -class Characteristic: - - """Characteristics indicate which - stat contains a Pokémon's highest IV. - A Pokémon's Characteristic is determined - by the remainder of its highest IV - divided by 5 (gene_modulo).""" - - id: int - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}characteristic/{self.id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.id) - else: - PokemonsCache.add_characteristic(data.get('id'), data) - return data - else: - if isinstance(self.id, str): - try: - id = int(self.id) - except ValueError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.id) - else: - PokemonsCache.add_characteristic(data.get('id'), data) - return data - elif isinstance(self.id, int): - id = self.id - else: - raise PokemonNotFound(self.id) - data = PokemonsCache.characteristics.get(id) - return data - -@dataclass(frozen=True) -class Gender: - - """Genders were introduced in Generation II - for the purposes of breeding - Pokémon but can also result in visual differences - or even different evolutionary lines.""" - - id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}gender/{self.id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.id) - else: - PokemonsCache.add_gender(data.get('id'), data) - return data - else: - if isinstance(self.id, str): - try: - id = int(self.id) - except ValueError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.id) - else: - PokemonsCache.add_gender(data.get('id'), data) - return data - elif isinstance(self.id, int): - id = self.id - else: - raise PokemonNotFound(self.id) - data = PokemonsCache.genders.get(id) - return data - -@dataclass(frozen=True) -class GrowthRate: - - """Growth rates are the speed with which - Pokémon gain levels through experience.""" - - id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}gender/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.id) - else: - PokemonsCache.add_growth_rate(data.get('id'), data) - return data - else: - if isinstance(self.id, str): - try: - id = int(self.id) - except ValueError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.id) - else: - PokemonsCache.add_growth_rate(data.get('id'), data) - return data - elif isinstance(self.id, int): - id = self.id - else: - raise PokemonNotFound(self.id) - data = PokemonsCache.growth_rates.get(id) - return data - -@dataclass(frozen=True) -class Nature: - - """Natures influence how a Pokémon's stats grow.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}nature/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_nature(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_nature(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.natures.get(id) - return data - -@dataclass(frozen=True) -class PokeathlonStat: - - """Pokeathlon Stats are different attributes of - a Pokémon's performance in Pokéathlons. - In Pokéathlons, competitions happen on different courses; - one for each of the different Pokéathlon stats.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pokeathlon-stat/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokeathlon_stat(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokeathlon_stat(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.pokeathlon_stats.get(id) - return data - -@dataclass(frozen=True) -class Pokemon: - - """Pokémon are the creatures that - inhabit the world of the Pokémon games. - They can be caught using Pokéballs - and trained by battling with other Pokémon. - Each Pokémon belongs to a specific - species but may take on a - variant which makes it differ from - other Pokémon of the same species, - such as base stats, available abilities and typings.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pokemon/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.pokemons.get(id) - return data - -@dataclass(frozen=True) -class PokemonLocationArea: - - """Pokémon Location Areas are ares where Pokémon can be found.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pokemon/{self.name_or_id}/encounters" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_location_area(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_location_area(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.pokemon_location_areas.get(id) - return data - -@dataclass(frozen=True) -class PokemonColor: - - """Colors used for sorting Pokémon in a Pokédex. - The color listed in the Pokédex is usually the - color most apparent or covering each Pokémon's body. - No orange category exists; Pokémon that are primarily - orange are listed as red or brown.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pokemon-color/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_color(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_color((data.get('id'), data)) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.pokemon_colors.get(id) - return data - -@dataclass(frozen=True) -class PokemonForm: - - """Some Pokémon may appear in - one of multiple, visually different forms. - These differences are purely cosmetic. - For variations within a Pokémon species, - which do differ in more than just visuals, - the 'Pokémon' entity is used to - represent such a variety.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pokemon-form/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_form(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_form((data.get('id'), data)) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.pokemon_forms.get(id) - return data - -@dataclass(frozen=True) -class PokemonHabitat: - - """Habitats are generally different - terrain Pokémon can be - found in but can also be areas - designated for rare or legendary Pokémon.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pokemon-habitat/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_habitat(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_habitat((data.get('id'), data)) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.pokemon_habitats.get(id) - return data - -@dataclass(frozen=True) -class PokemonShape: - - """Shapes used for sorting Pokémon in a Pokédex.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pokemon-shape/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_shape(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_shape((data.get('id'), data)) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.pokemon_shapes.get(id) - return data - -@dataclass(frozen=True) -class PokemonSpecies: - - """A Pokémon Species forms the basis - for at least one Pokémon. - Attributes of a Pokémon species are shared across - all varieties of Pokémon within the species. - A good example is Wormadam; Wormadam is the - species which can be found in three different varieties, - Wormadam-Trash, Wormadam-Sandy and Wormadam-Plant.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}pokemon-species/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_species(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_pokemon_species((data.get('id'), data)) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.pokemon_species.get(id) - return data - -@dataclass(frozen=True) -class Stat: - - """Stats determine certain aspects of battles. - Each Pokémon has a value for each stat - which grows as they gain levels and can - be altered momentarily by effects in battles.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}stat/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_stat(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_stat((data.get('id'), data)) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.stats.get(id) - return data - -@dataclass(frozen=True) -class Type: - - """Types are properties for Pokémon and their moves. - Each type has three properties: which types of - Pokémon it is super effective against, which types of Pokémon it is not very effective against, and which types of Pokémon it is completely ineffective against.""" - - name_or_id: Union[str, int] - from_cache : bool = False - - @property - def url(self) -> str: - return f"{base_url}type/{self.name_or_id}" - - @property - def raw_data(self) -> Any: - if not self.from_cache: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_type(data.get('id'), data) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - else: - if isinstance(self.name_or_id, str): - try: - id = int(self.name_or_id) - except ValueError: - try: - id = PokemonsCache.name_id_map.get(self.name_or_id).lower() - except AttributeError: - try: - data = httpx.get(self.url).json() - except json.decoder.JSONDecodeError: - raise PokemonNotFound(self.name_or_id) - else: - PokemonsCache.add_type((data.get('id'), data)) - PokemonsCache.name_id_map[data.get('name')] = data.get('id') - return data - elif isinstance(self.name_or_id, int): - id = self.name_or_id - else: - raise PokemonNotFound(self.name_or_id) - data = PokemonsCache.types.get(id) - return data \ No newline at end of file diff --git a/Pokemon/parser/berry.py b/Pokemon/parser/berry.py deleted file mode 100644 index 3d94203..0000000 --- a/Pokemon/parser/berry.py +++ /dev/null @@ -1,72 +0,0 @@ -from _typeshed import Self -from dataclasses import dataclass -from ..payload import DataPayload -from berry_firmness import BerryFirmness -from item import Item - -@dataclass(frozen=True) -class BerryFlavorMap: - - data : DataPayload - - @property - def potency(self): - return self.data.get("potency") - - @property - def potency(self): - return self.data.get("flavor") - - -@dataclass(frozen=True) -class Berry: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def growth_time(self): - return self.data.get("growth_time") - - @property - def max_harvest(self): - return self.data.get("max_harvest") - - @property - def natural_gift_power(self): - return self.data.get("natural_gift_power") - - @property - def size(self): - return self.data.get("size") - - @property - def smoothness(self): - return self.data.get("smoothness") - - @property - def soil_dryness(self): - return self.data.get("soil_dryness") - - @property - def firmness(self): - return BerryFirmness(self.data.get("firmness")) - - @property - def item(self): - return Item(self.data.get("item")) - - @property - def natural_gift_type(self): - return Item(self.data.get("natural_gift_type")) - - @property - def flavors(self): - return [BerryFlavorMap(_) for _ in self.data.get("flavors")] \ No newline at end of file diff --git a/Pokemon/parser/berry_firmness.py b/Pokemon/parser/berry_firmness.py deleted file mode 100644 index 047b668..0000000 --- a/Pokemon/parser/berry_firmness.py +++ /dev/null @@ -1,25 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from berry import Berry -from ..utility.common_models import Name - -@dataclass(frozen=True) -class BerryFirmness: - - data : DataPayload - - @property - def id(self): - return self.data.get('id') - - @property - def name(self): - return self.data.get('name') - - @property - def names(self): - return [Name(_) for _ in self.data.get('names')] - - @property - def berries(self): - return [Berry(_) for _ in self.data.get('berries')] diff --git a/Pokemon/parser/berry_flavor.py b/Pokemon/parser/berry_flavor.py deleted file mode 100644 index 7028ac6..0000000 --- a/Pokemon/parser/berry_flavor.py +++ /dev/null @@ -1,44 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from berry import Berry -from contest_type import ContestType -from ..utility.common_models import Name - -@dataclass(frozen=True) -class FlavorBerryMap: - - data : DataPayload - - @property - def potency(self): - return self.data.get('potency') - - @property - def berry(self): - Berry(self.data.get('berry')) - - -@dataclass(frozen=True) -class BerryFlavor: - - data : DataPayload - - @property - def id(self): - return self.data.get('id') - - @property - def name(self): - return self.data.get('name') - - @property - def names(self): - return [Name(_) for _ in self.data.get('names')] - - @property - def berries(self): - return [FlavorBerryMap(_) for _ in self.data.get('berries')] - - @property - def berries(self): - return [ContestType(_) for _ in self.data.get('contest_type')] \ No newline at end of file diff --git a/Pokemon/parser/contest_effect.py b/Pokemon/parser/contest_effect.py deleted file mode 100644 index 7b5761f..0000000 --- a/Pokemon/parser/contest_effect.py +++ /dev/null @@ -1,26 +0,0 @@ -from dataclasses import dataclass -from payload import DataPayload - -@dataclass(frozen=True) -class ContestEffect: - data : DataPayload - - @property - def id(self): - return self.data.get('id') - - @property - def appeal(self): - return self.data.get('appeal') - - @property - def jam(self): - return self.data.get('jam') - - @property - def effect_entries(self): - return [_ for _ in self.data.get('effect_entries')] - - @property - def flavor_text_entries(self): - return [_ for _ in self.data.get('flavor_text_entries')] \ No newline at end of file diff --git a/Pokemon/parser/contest_type.py b/Pokemon/parser/contest_type.py deleted file mode 100644 index ff2cb51..0000000 --- a/Pokemon/parser/contest_type.py +++ /dev/null @@ -1,42 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from berry_flavor import BerryFlavor -from utility.languages import Language - -@dataclass(frozen=True) -class ContestName: - data : DataPayload - - @property - def name(self): - return self.data.get("name") - - @property - def color(self): - return self.data.get("color") - - @property - def language(self): - return Language(self.data.get("language")) - - -@dataclass(frozen=True) -class ContestType: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def names(self): - return [ContestName(_) for _ in self.data.get("names")] - - @property - def berry_flavor(self): - return BerryFlavor(self.data.get('berry_flavor')) diff --git a/Pokemon/parser/encounter_condition.py b/Pokemon/parser/encounter_condition.py deleted file mode 100644 index c224585..0000000 --- a/Pokemon/parser/encounter_condition.py +++ /dev/null @@ -1,25 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from ..utility.common_models import Name -from encounter_condition_value import EncounterConditionValue - -@dataclass(frozen=True) -class EncounterCondition: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] - - @property - def values(self): - return [EncounterConditionValue(_) for _ in self.data.get("values")] \ No newline at end of file diff --git a/Pokemon/parser/encounter_condition_value.py b/Pokemon/parser/encounter_condition_value.py deleted file mode 100644 index 13447f7..0000000 --- a/Pokemon/parser/encounter_condition_value.py +++ /dev/null @@ -1,25 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from ..utility.common_models import Name -from encounter_condition import EncounterCondition - -@dataclass(frozen=True) -class EncounterConditionValue: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] - - @property - def condition(self): - return EncounterCondition(self.data.get("condition")) \ No newline at end of file diff --git a/Pokemon/parser/encounter_method.py b/Pokemon/parser/encounter_method.py deleted file mode 100644 index cdecfed..0000000 --- a/Pokemon/parser/encounter_method.py +++ /dev/null @@ -1,24 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from ..utility.common_models import Name - -@dataclass(frozen=True) -class EncounterMethod: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def order(self): - return self.data.get("order") - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] \ No newline at end of file diff --git a/Pokemon/parser/evoluion_trigger.py b/Pokemon/parser/evoluion_trigger.py deleted file mode 100644 index a339119..0000000 --- a/Pokemon/parser/evoluion_trigger.py +++ /dev/null @@ -1,24 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from ..utility.common_models import Name - -@dataclass(frozen=True) -class EvolutionTrigger: - - data : DataPayload - - @property - def id(self): - return self.data.get('id') - - @property - def id(self): - return self.data.get('name') - - @property - def names(self): - return [Name(_) for _ in self.data.get('names')] - - @property - def pokemon_species(self): - return [Name(_) for _ in self.data.get('pokemon_species')] \ No newline at end of file diff --git a/Pokemon/parser/evolution_chain.py b/Pokemon/parser/evolution_chain.py deleted file mode 100644 index 0253fb6..0000000 --- a/Pokemon/parser/evolution_chain.py +++ /dev/null @@ -1,115 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from evoluion_trigger import EvolutionTrigger -from item import Item -from location import Location - -@dataclass(frozen=True) -class EvolutionDetail: - - data : DataPayload - - @property - def gender(self): - return self.data.get('gender') - - @property - def min_level(self): - return self.data.get('min_level') - - @property - def min_happiness(self): - return self.data.get('min_happiness') - - @property - def min_affection(self): - return self.data.get('min_affection') - - @property - def needs_overworld_rain(self): - return self.data.get('needs_overworld_rain') - - @property - def relative_physical_stats(self): - return self.data.get('relative_physical_stats') - - @property - def time_of_day(self): - return self.data.get('time_of_day') - - @property - def turn_upside_down(self): - return self.data.get('turn_upside_down') - - @property - def trigger(self): - return [EvolutionTrigger(_) for _ in self.data.get('trigger')] - - @property - def item(self): - return Item(self.data.get('item')) - - @property - def held_item(self): - return Item(self.data.get('held_item')) - - @property - def known_move(self): - return self.data.get('known_move') - - @property - def known_move_type(self): - return self.data.get('known_move_type') - - @property - def location(self): - return Location(self.data.get('location')) - - @property - def party_species(self): - return self.data.get('party_species') - - @property - def party_type(self): - return self.data.get('party_type') - - @property - def trade_species(self): - return self.data.get('trade_species') - - -@dataclass(frozen=True) -class ChainLink: - - data : DataPayload - - @property - def is_baby(self): - return self.data.get('is_baby') - - @property - def evolution_details(self): - return [EvolutionDetail(_) for _ in self.data.get('evolution_details')] - - @property - def evolves_to(self): - return self.data.get('evolves_to') - - @property - def species(self): - return self.data.get('species') - - - -@dataclass(frozen=True) -class EvolutionChain: - - data : DataPayload - - @property - def id(self): - return self.data.get('id') - - @property - def chain(self): - return ChainLink(self.data.get('chain')) \ No newline at end of file diff --git a/Pokemon/parser/generation.py b/Pokemon/parser/generation.py deleted file mode 100644 index e85aa43..0000000 --- a/Pokemon/parser/generation.py +++ /dev/null @@ -1,44 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from version_group import VersionGroup - -@dataclass(frozen=True) -class Generation: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def main_region(self): - return self.data.get("main_region") - - @property - def names(self): - return self.data.get("names") - - @property - def version_groups(self): - return [VersionGroup(_) for _ in self.data.get("version_groups")] - - @property - def abilities(self): - return [_ for _ in self.data.get("abilities")] - - @property - def types(self): - return [_ for _ in self.data.get("types")] - - @property - def moves(self): - return [_ for _ in self.data.get("moves")] - - @property - def pokemon_species(self): - return [_ for _ in self.data.get("pokemon_species")] \ No newline at end of file diff --git a/Pokemon/parser/item.py b/Pokemon/parser/item.py deleted file mode 100644 index 12626c2..0000000 --- a/Pokemon/parser/item.py +++ /dev/null @@ -1,108 +0,0 @@ -from dataclasses import dataclass -from payload import DataPayload -from ..utility.common_models import Name -from evolution_chain import EvolutionChain -from item_category import ItemCategory -from version import Version -from item_fling_effect import ItemFlingEffect -from item_attribute import ItemAttribute -@dataclass(frozen=True) -class ItemHolderPokemonVersionDetail: - - data : DataPayload - - @property - def rarity(self): - return self.data.get("rarity") - - @property - def version(self): - return Version(self.data.get("version")) - -@dataclass(frozen=True) -class ItemHolderPokemon: - - data : DataPayload - - @property - def pokemon(self): - return self.data.get("pokemon") - - @property - def version_details(self): - return ItemHolderPokemonVersionDetail(self.data.get("version_details")) - -@dataclass(frozen=True) -class ItemSprite: - - data : DataPayload - - @property - def default(self): - return self.data.get("default") - - -@dataclass(frozen=True) -class Item: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def cost(self): - return self.data.get("cost") - - @property - def fling_power(self): - return self.data.get("fling_power") - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] - - @property - def sprites(self): - return ItemSprite(self.data.get("sprites")) - - @property - def baby_trigger_for(self): - return EvolutionChain(self.data.get("baby_trigger_for")) - - @property - def category(self): - return ItemCategory(self.data.get("category")) - - @property - def held_by_pokemon(self): - return ItemHolderPokemon(self.data.get("held_by_pokemon")) - - @property - def fling_effect(self): - return ItemFlingEffect(self.data.get("fling_effect")) - - @property - def attributes(self): - return [ItemAttribute(_) for _ in self.data.get("attributes")] - - @property - def machines(self): - return [_ for _ in self.data.get("machines")] - - @property - def effect_entries(self): - return [_ for _ in self.data.get("effect_entries")] - - @property - def flavor_text_entries(self): - return [_ for _ in self.data.get("flavor_text_entries")] - - @property - def game_indices(self): - return [_ for _ in self.data.get("game_indices")] \ No newline at end of file diff --git a/Pokemon/parser/item_attribute.py b/Pokemon/parser/item_attribute.py deleted file mode 100644 index 1dea125..0000000 --- a/Pokemon/parser/item_attribute.py +++ /dev/null @@ -1,29 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from ..utility.common_models import Description, Name -from item import Item - -@dataclass(frozen=True) -class ItemAttribute: - - data:DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def items(self): - return [Item(_) for _ in self.data.get("items")] - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] - - @property - def names(self): - return [Description(_) for _ in self.data.get("descriptions")] \ No newline at end of file diff --git a/Pokemon/parser/item_category.py b/Pokemon/parser/item_category.py deleted file mode 100644 index d417aba..0000000 --- a/Pokemon/parser/item_category.py +++ /dev/null @@ -1,30 +0,0 @@ -from dataclasses import dataclass -from payload import DataPayload -from ..utility.common_models import Name -from item import Item -from item_pocket import ItemPocket - -@dataclass(frozen=True) -class ItemCategory: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def name(self): - return ItemPocket(self.data.get("name")) - - @property - def items(self): - return [Item(_) for _ in self.data.get("items")] - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] \ No newline at end of file diff --git a/Pokemon/parser/item_fling_effect.py b/Pokemon/parser/item_fling_effect.py deleted file mode 100644 index 43c8418..0000000 --- a/Pokemon/parser/item_fling_effect.py +++ /dev/null @@ -1,24 +0,0 @@ -from dataclasses import dataclass -from payload import DataPayload -from item import Item - -@dataclass(frozen=True) -class ItemFlingEffect: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def items(self): - return [Item(_) for _ in self.data.get("items")] - - @property - def effect_entries(self): - return [_ for _ in self.data.get("effect_entries")] \ No newline at end of file diff --git a/Pokemon/parser/item_pocket.py b/Pokemon/parser/item_pocket.py deleted file mode 100644 index d8c5629..0000000 --- a/Pokemon/parser/item_pocket.py +++ /dev/null @@ -1,25 +0,0 @@ -from dataclasses import dataclass -from payload import DataPayload -from ..utility.common_models import Name -from item_category import ItemCategory - -@dataclass(frozen=True) -class ItemPocket: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def categories(self): - return [ItemCategory(_) for _ in self.data.get("categories")] - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] \ No newline at end of file diff --git a/Pokemon/parser/location.py b/Pokemon/parser/location.py deleted file mode 100644 index b96dde9..0000000 --- a/Pokemon/parser/location.py +++ /dev/null @@ -1,30 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from ..utility.common_models import Name - -@dataclass(frozen=True) -class Location: - - data:DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def region(self): - return self.data.get("region") - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] - -''' -TODO: -game_indices -areas -''' \ No newline at end of file diff --git a/Pokemon/parser/location_area.py b/Pokemon/parser/location_area.py deleted file mode 100644 index 5861120..0000000 --- a/Pokemon/parser/location_area.py +++ /dev/null @@ -1,80 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from ..utility.common_models import Name -from encounter_method import EncounterMethod -from version import Version -from location import Location - -@dataclass(frozen=True) -class PokemonEncounter: - - data:DataPayload - - @property - def pokemon(self): - return self.data.get("pokemon") - - @property - def version_details(self): - return Version(self.data.get("version_details")) - -@dataclass(frozen=True) -class EncounterVersionDetails: - - data:DataPayload - - @property - def encounter_method(self): - return self.data.get("rate") - - @property - def version(self): - return Version(self.data.get("version")) - - -@dataclass(frozen=True) -class EncounterMethodRate: - - data:DataPayload - - @property - def encounter_method(self): - return EncounterMethod(self.data.get("encounter_method")) - - @property - def version_details(self): - return EncounterMethod(self.data.get("version_details")) - - -@dataclass(frozen=True) -class LocationArea: - - data:DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def game_index(self): - return self.data.get("game_index") - - @property - def location(self): - return Location(self.data.get("location")) - - @property - def pokemon_encounters(self): - return [PokemonEncounter(_) for _ in self.data.get("pokemon_encounters")] - - @property - def encounter_method_rates(self): - return [EncounterMethodRate(_) for _ in self.data.get("encounter_method_rates")] - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] \ No newline at end of file diff --git a/Pokemon/parser/machine.py b/Pokemon/parser/machine.py deleted file mode 100644 index d8dbeb6..0000000 --- a/Pokemon/parser/machine.py +++ /dev/null @@ -1,25 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from item import Item -from version_group import VersionGroup - -@dataclass(frozen=True) -class Machine: - - data:DataPayload - - @property - def id(self): - return self.data.get('id') - - @property - def item(self): - return Item(self.data.get('item')) - - @property - def version_group(self): - return VersionGroup(self.data.get('version_group')) - - @property - def version_group(self): - return VersionGroup(self.data.get('move')) \ No newline at end of file diff --git a/Pokemon/parser/pokedex.py b/Pokemon/parser/pokedex.py deleted file mode 100644 index ef106af..0000000 --- a/Pokemon/parser/pokedex.py +++ /dev/null @@ -1,55 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from ..utility.common_models import Description -from version_group import VersionGroup - -@dataclass(frozen=True) -class PokemonEntry: - - data : DataPayload - - @property - def entry_number(self): - return self.data.get("entry_number") - - @property - def pokemon_species(self): - return self.data.get("pokemon_species") - - -@dataclass(frozen=True) -class Pokedex: - - data : DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def is_main_series(self): - return self.data.get("is_main_series") - - @property - def names(self): - return self.data.get("names") - - @property - def region(self): - return self.data.get("region") - - @property - def pokemon_entries(self): - return [PokemonEntry(_) for _ in self.data.get("pokemon_entries")] - - @property - def descriptions(self): - return [Description(_) for _ in self.data.get("descriptions")] - - @property - def version_groups(self): - return [VersionGroup(_) for _ in self.data.get("version_groups")] \ No newline at end of file diff --git a/Pokemon/parser/super_contest_effect.py b/Pokemon/parser/super_contest_effect.py deleted file mode 100644 index a9ffc67..0000000 --- a/Pokemon/parser/super_contest_effect.py +++ /dev/null @@ -1,24 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload - - -@dataclass(frozen=True) -class SuperContestEffect: - - data : DataPayload - - @property - def id(self): - return self.data.get('id') - - @property - def appeal(self): - return self.data.get('appeal') - - @property - def flavor_text_entries(self): - return [_ for _ in self.data.get('flavor_text_entries')] - - @property - def moves(self): - return [_ for _ in self.data.get('moves')] \ No newline at end of file diff --git a/Pokemon/parser/version.py b/Pokemon/parser/version.py deleted file mode 100644 index ddfa044..0000000 --- a/Pokemon/parser/version.py +++ /dev/null @@ -1,25 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from ..utility.common_models import Name -from version_group import VersionGroup - -@dataclass(frozen=True) -class Version: - - data : DataPayload - - @property - def id(self): - return self.data.get('id') - - @property - def name(self): - return self.data.get('name') - - @property - def name(self): - return [Name(_) for _ in self.data.get('name')] - - @property - def version_group(self): - return [VersionGroup(_) for _ in self.data.get('version_group')] \ No newline at end of file diff --git a/Pokemon/parser/version_group.py b/Pokemon/parser/version_group.py deleted file mode 100644 index d8ea32a..0000000 --- a/Pokemon/parser/version_group.py +++ /dev/null @@ -1,42 +0,0 @@ -from dataclasses import dataclass -from ..payload import DataPayload -from version import Version -from pokedex import Pokedex -from generation import Generation - -@dataclass(frozen=True) -class VersionGroup: - - data : DataPayload - - @property - def id(self): - return self.data.get('id') - - @property - def name(self): - return self.data.get('name') - - @property - def order(self): - return self.data.get('order') - - @property - def versions(self): - return [Version(_) for _ in self.data.get('versions')] - - @property - def pokedexes(self): - return [Pokedex(_) for _ in self.data.get('pokedexes')] - - @property - def pokedexes(self): - return [Generation(_) for _ in self.data.get('generation')] - - @property - def regions(self): - return [_ for _ in self.data.get('regions')] - - @property - def move_learn_methods(self): - return [_ for _ in self.data.get('move_learn_methods')] \ No newline at end of file diff --git a/Pokemon/parsers.py b/Pokemon/parsers.py new file mode 100644 index 0000000..41c6485 --- /dev/null +++ b/Pokemon/parsers.py @@ -0,0 +1,969 @@ +from Pokemon.base import BaseParser1, BaseParser2, UtilsParser + +get_names = lambda data: [NameParser(_) for _ in data.get("names")] + + +class APIResourceParser(UtilsParser): + @property + def url(self) -> str: + return self.data.get("url") + + +class DescriptionParser(UtilsParser): + @property + def descriptionParserDescriptionParser(self): + return self.data.get("description") + + @property + def language(self): + return LanguageParser(self.data.get("language")) + + +class EffectParser(UtilsParser): + @property + def language(self): + return LanguageParser(self.data.get("language")) + + @property + def effect(self): + return self.data.get("effect") + + +class EncounterParser(UtilsParser): + @property + def chance(self): + return self.data.get("chance") + + @property + def max_level(self): + return self.data.get("max_level") + + @property + def min_level(self): + return self.data.get("min_level") + + @property + def condition_values(self): + return EncounterConditionValueParser(self.data.get("condition_values")) + + @property + def method(self): + return EncounterMethodParser(self.data.get("method")) + + +class FlavorTextParser(UtilsParser): + @property + def flavor_text(self): + return self.data.get("flavor_text") + + @property + def name(self): + return LanguageParser(self.data.get("name")) + + @property + def version(self): + return VersionParser((self.data.get("version"))) + + +class GenerationGameIndexParser(UtilsParser): + @property + def game_index(self): + return self.data.get("game_index") + + @property + def generation(self): + return GenerationParser(self.data.get("generation")) + + +class MachineVersionDetailParser(UtilsParser): + @property + def machine(self): + return Machine(self.data.get("machine")) + + @property + def version_group(self): + return VersionGroupParser(self.data.get("version_group")) + + +class NameParser(UtilsParser): + @property + def name(self): + return self.data.get("name") + + @property + def language(self): + return LanguageParser(self.data.get("language")) + + +class LanguageParser(BaseParser1): + @property + def official(self): + return self.data.get("official") + + @property + def iso639(self): + return self.data.get("iso639") + + @property + def iso3166(self): + return self.data.get("iso3166") + + @property + def names(self): + return get_names(self.data) + + +class BerryFirmnessParser(BaseParser1): + @property + def names(self): + return get_names(self.data) + + @property + def berries(self): + return [BerryParser(_) for _ in self.data.get("berries")] + + +class FlavorBerryMapParser(UtilsParser): + @property + def potency(self): + return self.data.get("potency") + + @property + def berry(self): + BerryParser(self.data.get("berry")) + + + +class BerryFlavorParser(BaseParser1): + @property + def names(self): + return get_names(self.data) + + @property + def berries(self): + return [FlavorBerryMapParser(_) for _ in self.data.get("berries")] + + @property + def berries(self): + return [ContestTypeParser(_) for _ in self.data.get("contest_type")] + + +class BerryFlavorMapParser(UtilsParser): + @property + def potency(self): + return self.data.get("potency") + + @property + def flavor(self): + return self.data.get("flavor") + + +class BerryParser(BaseParser1): + @property + def growth_time(self): + return self.data.get("growth_time") + + @property + def max_harvest(self): + return self.data.get("max_harvest") + + @property + def natural_gift_power(self): + return self.data.get("natural_gift_power") + + @property + def size(self): + return self.data.get("size") + + @property + def smoothness(self): + return self.data.get("smoothness") + + @property + def soil_dryness(self): + return self.data.get("soil_dryness") + + @property + def firmness(self): + return BerryFirmnessParser(self.data.get("firmness")) + + @property + def ItemParser(self): + return ItemParser(self.data.get("item")) + + @property + def natural_gift_type(self): + return ItemParser(self.data.get("natural_gift_type")) + + @property + def flavors(self): + return [BerryFlavorMapParser(_) for _ in self.data.get("flavors")] + + +class ContestNameParser(UtilsParser): + @property + def name(self): + return self.data.get("name") + + @property + def color(self): + return self.data.get("color") + + @property + def language(self): + return LanguageParser(self.data.get("language")) + + +class ContestTypeParser(BaseParser1): + @property + def names(self): + return [ContestNameParser(_) for _ in self.data.get("names")] + + @property + def berry_flavor(self): + return BerryFlavorParser(self.data.get("berry_flavor")) + + +class ContestEffect(BaseParser2): + @property + def appeal(self): + return self.data.get("appeal") + + @property + def jam(self): + return self.data.get("jam") + + @property + def effect_entries(self): + return [_ for _ in self.data.get("effect_entries")] + + @property + def flavor_text_entries(self): + return [_ for _ in self.data.get("flavor_text_entries")] + + +class SuperContestEffect(BaseParser2): + @property + def appeal(self): + return self.data.get("appeal") + + @property + def flavor_text_entries(self): + return [_ for _ in self.data.get("flavor_text_entries")] + + @property + def moves(self): + return [_ for _ in self.data.get("moves")] + + +class EncounterMethodParser(BaseParser1): + @property + def order(self): + return self.data.get("order") + + @property + def names(self): + return get_names(self.data) + + +class EncounterConditionParser(BaseParser1): + @property + def names(self): + return get_names(self.data) + + @property + def values(self): + return [EncounterConditionValueParser(_) for _ in self.data.get("values")] + + +class EncounterConditionValueParser(BaseParser1): + @property + def names(self): + return get_names(self.data) + + @property + def condition(self): + return EncounterConditionParser(self.data.get("condition")) + + +class EvolutionDetailParser(UtilsParser): + @property + def gender(self): + return self.data.get("gender") + + @property + def min_level(self): + return self.data.get("min_level") + + @property + def min_happiness(self): + return self.data.get("min_happiness") + + @property + def min_affection(self): + return self.data.get("min_affection") + + @property + def needs_overworld_rain(self): + return self.data.get("needs_overworld_rain") + + @property + def relative_physical_stats(self): + return self.data.get("relative_physical_stats") + + @property + def time_of_day(self): + return self.data.get("time_of_day") + + @property + def turn_upside_down(self): + return self.data.get("turn_upside_down") + + @property + def trigger(self): + return [EvolutionTriggerParser(_) for _ in self.data.get("trigger")] + + @property + def item(self): + return ItemParser(self.data.get("item")) + + @property + def held_item(self): + return ItemParser(self.data.get("held_item")) + + @property + def known_move(self): + return self.data.get("known_move") + + @property + def known_move_type(self): + return self.data.get("known_move_type") + + @property + def locationParser(self): + return LocationParser(self.data.get("location")) + + @property + def party_species(self): + return self.data.get("party_species") + + @property + def party_type(self): + return self.data.get("party_type") + + @property + def trade_species(self): + return self.data.get("trade_species") + + +class ChainLinkParser(UtilsParser): + @property + def is_baby(self): + return self.data.get("is_baby") + + @property + def evolution_details(self): + return [EvolutionDetailParser(_) for _ in self.data.get("evolution_details")] + + @property + def evolves_to(self): + return self.data.get("evolves_to") + + @property + def species(self): + return self.data.get("species") + + +class EvolutionChain(BaseParser2): + @property + def chain(self): + return ChainLinkParser(self.data.get("chain")) + + +class EvolutionTriggerParser(BaseParser1): + @property + def names(self): + return get_names(self.data) + + @property + def pokemon_species(self): + return [NameParser(_) for _ in self.data.get("pokemon_species")] + + +class PokemonEntryParser(UtilsParser): + @property + def entry_number(self): + return self.data.get("entry_number") + + @property + def pokemon_species(self): + return self.data.get("pokemon_species") + + +class PokedexParser(BaseParser1): + @property + def is_main_series(self): + return self.data.get("is_main_series") + + @property + def names(self): + return get_names(self.data) + + @property + def region(self): + return self.data.get("region") + + @property + def pokemon_entries(self): + return [PokemonEntryParser(_) for _ in self.data.get("pokemon_entries")] + + @property + def descriptions(self): + return [DescriptionParser(_) for _ in self.data.get("descriptions")] + + @property + def version_groups(self): + return [VersionGroupParser(_) for _ in self.data.get("version_groups")] + + +class GenerationParser(BaseParser1): + @property + def main_region(self): + return self.data.get("main_region") + + @property + def names(self): + return get_names(self.data) + + @property + def version_groups(self): + return [VersionGroupParser(_) for _ in self.data.get("version_groups")] + + @property + def abilities(self): + return [_ for _ in self.data.get("abilities")] + + @property + def types(self): + return [_ for _ in self.data.get("types")] + + @property + def moves(self): + return [_ for _ in self.data.get("moves")] + + @property + def pokemon_species(self): + return [_ for _ in self.data.get("pokemon_species")] + + +class VersionParser(BaseParser1): + @property + def name(self): + return get_names(self.data) + + @property + def version_group(self): + return [VersionGroupParser(_) for _ in self.data.get("version_group")] + + +class VersionGroupParser(BaseParser1): + @property + def order(self): + return self.data.get("order") + + @property + def versions(self): + return [VersionParser(_) for _ in self.data.get("versions")] + + @property + def pokedexes(self): + return [PokedexParser(_) for _ in self.data.get("pokedexes")] + + @property + def pokedexes(self): + return [GenerationParser(_) for _ in self.data.get("generation")] + + @property + def regions(self): + return [_ for _ in self.data.get("regions")] + + @property + def move_learn_methods(self): + return [_ for _ in self.data.get("move_learn_methods")] + + +class ItemAttributeParser(BaseParser1): + @property + def items(self): + return [ItemParser(_) for _ in self.data.get("items")] + + @property + def names(self): + return get_names(self.data) + + @property + def names(self): + return [DescriptionParser(_) for _ in self.data.get("descriptions")] + + +class ItemCategoryParser(BaseParser1): + @property + def items(self): + return [ItemParser(_) for _ in self.data.get("items")] + + @property + def names(self): + return get_names(self.data) + + +class ItemHolderPokemonVersionDetailParser(UtilsParser): + @property + def rarity(self): + return self.data.get("rarity") + + @property + def versionParser(self): + return VersionParser(self.data.get("version")) + + +class ItemHolderPokemonParser(UtilsParser): + @property + def pokemon(self): + return self.data.get("pokemon") + + @property + def version_details(self): + return ItemHolderPokemonVersionDetailParser(self.data.get("version_details")) + + +class ItemSpriteParser(UtilsParser): + @property + def default(self): + return self.data.get("default") + + +class ItemParser(BaseParser1): + @property + def cost(self): + return self.data.get("cost") + + @property + def fling_power(self): + return self.data.get("fling_power") + + @property + def names(self): + return get_names(self.data) + + @property + def sprites(self): + return ItemSpriteParser(self.data.get("sprites")) + + @property + def baby_trigger_for(self): + return EvolutionChain(self.data.get("baby_trigger_for")) + + @property + def category(self): + return ItemCategoryParser(self.data.get("category")) + + @property + def held_by_pokemon(self): + return ItemHolderPokemonParser(self.data.get("held_by_pokemon")) + + @property + def fling_effect(self): + return ItemFlingEffectParser(self.data.get("fling_effect")) + + @property + def attributes(self): + return [ItemAttributeParser(_) for _ in self.data.get("attributes")] + + @property + def machines(self): + return [_ for _ in self.data.get("machines")] + + @property + def effect_entries(self): + return [_ for _ in self.data.get("effect_entries")] + + @property + def flavor_text_entries(self): + return [_ for _ in self.data.get("flavor_text_entries")] + + @property + def game_indices(self): + return [_ for _ in self.data.get("game_indices")] + + +class ItemPocketParser(BaseParser1): + @property + def categories(self): + return [ItemCategoryParser(_) for _ in self.data.get("categories")] + + @property + def names(self): + return get_names(self.data) + + +class ItemFlingEffectParser(BaseParser1): + @property + def items(self): + return [ItemParser(_) for _ in self.data.get("items")] + + @property + def effect_entries(self): + return [_ for _ in self.data.get("effect_entries")] + + +class Machine(BaseParser2): + @property + def ItemParser(self): + return ItemParser(self.data.get("item")) + + @property + def version_group(self): + return VersionGroupParser(self.data.get("version_group")) + + @property + def move(self): + return Move(self.data.get("move")) + + + +class LocationParser(BaseParser1): + @property + def region(self): + return self.data.get("region") + + @property + def names(self): + return get_names(self.data) + + @property + def region(self): + return self.data.get("game_indices") + + @property + def region(self): + return [LocationAreaParser(_) for _ in self.data.get("areas")] + + +class PokemonEncounterParser(UtilsParser): + @property + def pokemon(self): + return self.data.get("pokemon") + + @property + def version_details(self): + return VersionParser(self.data.get("version_details")) + + +class EncounterVersionDetailsParser(UtilsParser): + @property + def encounter_method(self): + return self.data.get("rate") + + @property + def versionParser(self): + return VersionParser(self.data.get("version")) + + +class EncounterMethodRateParser(UtilsParser): + @property + def encounter_method(self): + return EncounterMethodParser(self.data.get("encounter_method")) + + @property + def version_details(self): + return EncounterMethodParser(self.data.get("version_details")) + + +class LocationAreaParser(BaseParser1): + @property + def game_index(self): + return self.data.get("game_index") + + @property + def location(self): + return LocationParser(self.data.get("location")) + + @property + def pokemon_encounters(self): + return [PokemonEncounterParser(_) for _ in self.data.get("pokemon_encounters")] + + @property + def encounter_method_rates(self): + return [EncounterMethodRateParser(_) for _ in self.data.get("encounter_method_rates")] + + @property + def names(self): + return get_names(self.data) + + +class MoveParser(BaseParser1): + @property + def accuracy(self): + return self.data.get("accuracy") + + @property + def effect_chance(self): + return self.data.get("effect_chance") + + @property + def pp(self): + return self.data.get("pp") + + @property + def priority(self): + return self.data.get("priority") + + @property + def power(self): + return self.data.get("power") + + @property + def contest_combos(self): + return self.data.get("contest_combos") + + @property + def contest_type(self): + return self.data.get("contest_type") + + @property + def contest_effect(self): + return self.data.get("contest_effect") + + @property + def damage_class(self): + return self.data.get("damage_class") + + @property + def effect_entries(self): + return self.data.get("effect_entries") + + @property + def effect_changes(self): + return self.data.get("effect_changes") + + @property + def learned_by_pokemon(self): + return self.data.get("learned_by_pokemon") + + @property + def flavor_text_entries(self): + return self.data.get("flavor_text_entries") + + @property + def generationParser(self): + return self.data.get("generation") + + @property + def machines(self): + return self.data.get("machines") + + @property + def meta(self): + return self.data.get("meta") + + @property + def names(self): + return get_names(self.data) + + @property + def past_values(self): + return self.data.get("past_values") + + @property + def stat_changes(self): + return self.data.get("stat_changes") + + @property + def super_contest_effect(self): + return self.data.get("super_contest_effect") + + @property + def target(self): + return self.data.get("target") + + @property + def type(self): + return self.data.get("type") + + +class ContestComboSetsParser(UtilsParser): + @property + def normal(self): + return self.data.get("normal") + + @property + def super(self): + return self.data.get("super") + + +class ContestComboDetailParser(UtilsParser): + @property + def use_before(self): + return self.data.get("use_before") + + @property + def use_after(self): + return self.data.get("use_after") + + +class MoveFlavorTextParser(UtilsParser): + @property + def flavor_text(self): + return self.data.get("flavor_text") + + @property + def language(self): + return self.data.get("language") + + @property + def version_group(self): + return self.data.get("version_group") + + +class MoveMetaDataParser(UtilsParser): + @property + def ailment(self): + return self.data.get("ailment") + + @property + def category(self): + return self.data.get("category") + + @property + def min_hits(self): + return self.data.get("min_hits") + + @property + def max_hits(self): + return self.data.get("max_hits") + + @property + def min_turns(self): + return self.data.get("min_turns") + + @property + def max_turns(self): + return self.data.get("max_turns") + + @property + def drain(self): + return self.data.get("drain") + + @property + def healing(self): + return self.data.get("healing") + + @property + def crit_rate(self): + return self.data.get("crit_rate") + + @property + def ailment_chance(self): + return self.data.get("ailment_chance") + + @property + def flinch_chance(self): + return self.data.get("flinch_chance") + + @property + def stat_chance(self): + return self.data.get("stat_chance") + + +class MoveStatChangeParser(UtilsParser): + @property + def change(self): + return self.data.get("change") + + @property + def stat(self): + return self.data.get("stat") + + +class MoveMetaDataParser(UtilsParser): + @property + def accuracy(self): + return self.data.get("accuracy") + + @property + def effect_chance(self): + return self.data.get("effect_chance") + + @property + def power(self): + return self.data.get("power") + + @property + def pp(self): + return self.data.get("pp") + + @property + def effect_entries(self): + return self.data.get("effect_entries") + + @property + def type(self): + return self.data.get("type") + + @property + def version_group(self): + return self.data.get("version_group") + + +class MoveAilmentParser(BaseParser1): + @property + def moves(self): + return self.data.get("moves") + + @property + def names(self): + return get_names(self.data) + + +class MoveBattleStyleParser(BaseParser1): + @property + def names(self): + return get_names(self.data) + + +class MoveCategoryParser(BaseParser1): + @property + def moves(self): + return self.data.get("moves") + + @property + def descriptions(self): + return self.data.get("descriptions") + + +class MoveLearnMethodParser(BaseParser1): + @property + def version_groups(self): + return self.data.get("version_groups") + + @property + def names(self): + return get_names(self.data) + + @property + def descriptions(self): + return self.data.get("descriptions") + + +class MoveTargetParser(BaseParser1): + @property + def moves(self): + return self.data.get("moves") + + @property + def names(self): + return get_names(self.data) + + @property + def descriptions(self): + return self.data.get("descriptions") diff --git a/Pokemon/payload.py b/Pokemon/payload.py deleted file mode 100644 index 62d3d79..0000000 --- a/Pokemon/payload.py +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Dict, Any - -DataPayload: Dict[str, Any] = Any \ No newline at end of file diff --git a/Pokemon/url.py b/Pokemon/url.py deleted file mode 100644 index 7399afa..0000000 --- a/Pokemon/url.py +++ /dev/null @@ -1 +0,0 @@ -base_url = "https://pokeapi.co/api/v2/" \ No newline at end of file diff --git a/Pokemon/utility/common_models.py b/Pokemon/utility/common_models.py deleted file mode 100644 index 9eee20a..0000000 --- a/Pokemon/utility/common_models.py +++ /dev/null @@ -1,116 +0,0 @@ -from dataclasses import dataclass -from languages import Language -from ..payload import DataPayload -from ..parser import encounter_method,encounter_condition_value,version,generation,version_group,machine - -@dataclass -class APIResource: - - data:DataPayload - - @property - def url(self): - return self.data.get("url") - -@dataclass -class Description: - - data:DataPayload - - @property - def description(self): - return self.data.get("description") - - @property - def language(self): - return Language(self.data.get("language")) - -@dataclass -class Effect: - data:DataPayload - - @property - def language(self): - return Language(self.data.get("language")) - - @property - def effect(self): - return self.data.get("effect") - -@dataclass -class Encounter: - data:DataPayload - - @property - def chance(self): - return self.data.get("chance") - - @property - def max_level(self): - return self.data.get("max_level") - - @property - def max_level(self): - return self.data.get("min_level") - - @property - def condition_values(self): - return encounter_condition_value.EncounterConditionValue(self.data.get("condition_values")) - - @property - def method(self): - return encounter_method.EncounterMethod(self.data.get("method")) - -@dataclass -class FlavorText: - data:DataPayload - - @property - def flavor_text(self): - return self.data.get("flavor_text") - - @property - def name(self): - return Language(self.data.get("name")) - - @property - def version(self): - return version.Version((self.data.get("version"))) - -@dataclass -class GenerationGameIndex: - data:DataPayload - - @property - def game_index(self): - return self.data.get("game_index") - - @property - def generation(self): - return generation.Generation(self.data.get("generation")) - - -@dataclass -class MachineVersionDetail: - data:DataPayload - - @property - def machine(self): - return machine.Machine(self.data.get("machine")) - - @property - def version_group(self): - return version_group.VersionGroup(self.data.get("version_group")) - - -@dataclass -class Name: - data:DataPayload - - @property - def name(self): - return self.data.get("name") - - @property - def language(self): - return Language(self.data.get("language")) \ No newline at end of file diff --git a/Pokemon/utility/languages.py b/Pokemon/utility/languages.py deleted file mode 100644 index 3d38aa9..0000000 --- a/Pokemon/utility/languages.py +++ /dev/null @@ -1,32 +0,0 @@ -from dataclasses import dataclass -from common_models import Name -from ..payload import DataPayload - -@dataclass -class Language: - - data:DataPayload - - @property - def id(self): - return self.data.get("id") - - @property - def name(self): - return self.data.get("name") - - @property - def official(self): - return self.data.get("official") - - @property - def iso639(self): - return self.data.get("iso639") - - @property - def iso3166(self): - return self.data.get("iso3166") - - @property - def names(self): - return [Name(_) for _ in self.data.get("names")] \ No newline at end of file