localdex 0.2.2__py3-none-any.whl → 0.2.23__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. localdex/__init__.py +0 -3
  2. localdex/core.py +16 -173
  3. localdex/data/pokemon/aegislash.json +88 -0
  4. localdex/data/pokemon/basculegion.json +86 -0
  5. localdex/data/pokemon/basculin.json +105 -0
  6. localdex/data/pokemon/darmanitan.json +117 -0
  7. localdex/data/pokemon/deoxys.json +144 -0
  8. localdex/data/pokemon/dudunsparce.json +117 -0
  9. localdex/data/pokemon/eiscue.json +80 -0
  10. localdex/data/pokemon/enamorus.json +77 -0
  11. localdex/data/pokemon/giratina.json +123 -0
  12. localdex/data/pokemon/gourgeist.json +109 -0
  13. localdex/data/pokemon/indeedee.json +89 -0
  14. localdex/data/pokemon/keldeo.json +107 -0
  15. localdex/data/pokemon/landorus.json +105 -0
  16. localdex/data/pokemon/lycanroc.json +107 -0
  17. localdex/data/pokemon/maushold.json +80 -0
  18. localdex/data/pokemon/meloetta.json +131 -0
  19. localdex/data/pokemon/meowstic.json +122 -0
  20. localdex/data/pokemon/mimikyu.json +113 -0
  21. localdex/data/pokemon/minior.json +90 -0
  22. localdex/data/pokemon/morpeko.json +100 -0
  23. localdex/data/pokemon/nidoran.json +109 -0
  24. localdex/data/pokemon/oinkologne.json +78 -0
  25. localdex/data/pokemon/oricorio.json +91 -0
  26. localdex/data/pokemon/palafin.json +90 -0
  27. localdex/data/pokemon/pumpkaboo.json +105 -0
  28. localdex/data/pokemon/shaymin.json +101 -0
  29. localdex/data/pokemon/squawkabilly.json +79 -0
  30. localdex/data/pokemon/tatsugiri.json +65 -0
  31. localdex/data/pokemon/thundurus.json +116 -0
  32. localdex/data/pokemon/tornadus.json +107 -0
  33. localdex/data/pokemon/toxtricity.json +112 -0
  34. localdex/data/pokemon/urshifu.json +101 -0
  35. localdex/data/pokemon/wishiwashi.json +77 -0
  36. localdex/data/pokemon/wormadam.json +93 -0
  37. localdex/data/pokemon/zygarde.json +93 -0
  38. localdex/download_data.py +62 -0
  39. localdex/models/pokemon.py +8 -11
  40. {localdex-0.2.2.dist-info → localdex-0.2.23.dist-info}/METADATA +2 -168
  41. {localdex-0.2.2.dist-info → localdex-0.2.23.dist-info}/RECORD +44 -10
  42. localdex/random_battles.py +0 -251
  43. {localdex-0.2.2.dist-info → localdex-0.2.23.dist-info}/WHEEL +0 -0
  44. {localdex-0.2.2.dist-info → localdex-0.2.23.dist-info}/entry_points.txt +0 -0
  45. {localdex-0.2.2.dist-info → localdex-0.2.23.dist-info}/top_level.txt +0 -0
localdex/__init__.py CHANGED
@@ -2,7 +2,6 @@
2
2
  from .core import LocalDex
3
3
  from .models import Pokemon, Move, Ability, Item, BaseStats
4
4
  from .exceptions import PokemonNotFoundError, MoveNotFoundError, AbilityNotFoundError, ItemNotFoundError
5
- from .random_battles import RandomBattleSets
6
5
 
7
6
  __all__ = [
8
7
  "LocalDex",
@@ -15,6 +14,4 @@ __all__ = [
15
14
  "MoveNotFoundError",
16
15
  "AbilityNotFoundError",
17
16
  "ItemNotFoundError",
18
- "RandomBattleSets",
19
- "SpriteDownloader",
20
17
  ]
localdex/core.py CHANGED
@@ -18,7 +18,6 @@ from .exceptions import (
18
18
  ItemNotFoundError, DataLoadError, SearchError
19
19
  )
20
20
  from .data_loader import DataLoader
21
- from .random_battles import RandomBattleSets
22
21
 
23
22
 
24
23
  class LocalDex:
@@ -30,7 +29,7 @@ class LocalDex:
30
29
  performance and comprehensive search capabilities.
31
30
  """
32
31
 
33
- def __init__(self, data_path: Optional[str] = None, data_dir: Optional[str] = None, enable_caching: bool = True, enable_random_battles: bool = True):
32
+ def __init__(self, data_path: Optional[str] = None, data_dir: Optional[str] = None, enable_caching: bool = True):
34
33
  """
35
34
  Initialize the LocalDex.
36
35
 
@@ -38,18 +37,12 @@ class LocalDex:
38
37
  data_path: Optional path to data directory. If None, uses package data.
39
38
  data_dir: Alias for data_path for backward compatibility.
40
39
  enable_caching: Whether to enable caching for better performance.
41
- enable_random_battles: Whether to enable random battle sets functionality.
42
-
43
40
  """
44
41
  # Use data_dir if provided, otherwise use data_path
45
42
  final_data_path = data_dir if data_dir is not None else data_path
46
43
  self.data_loader = DataLoader(final_data_path)
47
44
  self.data_dir = final_data_path # Store for backward compatibility
48
45
  self.enable_caching = enable_caching
49
-
50
-
51
- # Initialize random battle sets
52
- self.random_battles = RandomBattleSets() if enable_random_battles else None
53
46
 
54
47
  # Initialize caches
55
48
  self._pokemon_cache: Dict[str, Pokemon] = {}
@@ -433,54 +426,38 @@ class LocalDex:
433
426
  base_stats_data = data.get("baseStats", {})
434
427
  base_stats = BaseStats(
435
428
  hp=base_stats_data.get("hp", 0),
436
- attack=base_stats_data.get("attack", base_stats_data.get("atk", 0)),
437
- defense=base_stats_data.get("defense", base_stats_data.get("def", 0)),
438
- special_attack=base_stats_data.get("special_attack", base_stats_data.get("spa", 0)),
439
- special_defense=base_stats_data.get("special_defense", base_stats_data.get("spd", 0)),
440
- speed=base_stats_data.get("speed", base_stats_data.get("spe", 0))
429
+ attack=base_stats_data.get("attack", 0),
430
+ defense=base_stats_data.get("defense", 0),
431
+ special_attack=base_stats_data.get("special-attack", 0),
432
+ special_defense=base_stats_data.get("special-defense", 0),
433
+ speed=base_stats_data.get("speed", 0),
441
434
  )
442
-
443
- # Create Pokemon object
444
- pokemon = Pokemon(
445
- id=data.get("id", 0),
446
- name=data.get("name", ""),
435
+ return Pokemon(
436
+ id=data["id"],
437
+ name=data["name"],
447
438
  types=data.get("types", []),
448
439
  base_stats=base_stats,
449
440
  height=data.get("height"),
450
441
  weight=data.get("weight"),
451
442
  color=data.get("color"),
452
- evolutions=data.get("evolutions"),
443
+ abilities=data.get("abilities", {}),
444
+ moves=data.get("moves", []),
445
+ learnset=data.get("learnset", {}),
446
+ evolutions=data.get("evolutions", []),
453
447
  prevo=data.get("prevo"),
454
448
  evo_level=data.get("evoLevel"),
455
449
  evo_type=data.get("evoType"),
456
450
  evo_condition=data.get("evoCondition"),
457
451
  evo_item=data.get("evoItem"),
458
- egg_groups=data.get("eggGroups"),
459
- gender_ratio=data.get("genderRatio"),
452
+ egg_groups=data.get("eggGroups", []),
453
+ gender_ratio=data.get("genderRatio", {}),
460
454
  generation=data.get("generation"),
461
455
  description=data.get("description"),
462
456
  is_legendary=data.get("isLegendary", False),
463
457
  is_mythical=data.get("isMythical", False),
464
458
  is_ultra_beast=data.get("isUltraBeast", False),
465
- random_battle_sets=data.get("randomBattleSets"),
466
- metadata=data
459
+ metadata=data.get("metadata", {}),
467
460
  )
468
-
469
- # Add abilities
470
- abilities_data = data.get("abilities", {})
471
- for slot, ability_data in abilities_data.items():
472
- if isinstance(ability_data, dict) and "data" in ability_data:
473
- ability = self._create_ability_from_data(ability_data["data"])
474
- pokemon.abilities[slot] = ability
475
-
476
- # Add moves
477
- moves_data = data.get("moves", [])
478
- for move_data in moves_data:
479
- if isinstance(move_data, dict):
480
- move = self._create_move_from_data(move_data)
481
- pokemon.moves.append(move)
482
-
483
- return pokemon
484
461
 
485
462
  def _create_move_from_data(self, data: Dict[str, Any]) -> Move:
486
463
  """Create a Move object from raw data."""
@@ -565,138 +542,4 @@ class LocalDex:
565
542
  "items": len(self._item_cache)
566
543
  }
567
544
 
568
- # Random Battle Sets Methods
569
-
570
- def get_random_battle_sets(self, pokemon_name: str, generation: int = 9, force_refresh: bool = False) -> Optional[Dict[str, Any]]:
571
- """
572
- Get random battle sets for a specific Pokemon.
573
-
574
- Args:
575
- pokemon_name: Name of the Pokemon (case-insensitive)
576
- generation: Generation to get sets from (8 or 9)
577
- force_refresh: If True, re-download data
578
-
579
- Returns:
580
- Pokemon's random battle sets or None if not found
581
-
582
- Raises:
583
- ValueError: If random battles are not enabled
584
- """
585
- if self.random_battles is None:
586
- raise ValueError("Random battle sets are not enabled. Set enable_random_battles=True when initializing LocalDex.")
587
-
588
- if generation == 9:
589
- return self.random_battles.get_pokemon_gen9_sets(pokemon_name, force_refresh)
590
- elif generation == 8:
591
- return self.random_battles.get_pokemon_gen8_data(pokemon_name, force_refresh)
592
- else:
593
- raise ValueError(f"Generation {generation} is not supported. Use 8 or 9.")
594
-
595
- def get_all_random_battle_sets(self, generation: int = 9, force_refresh: bool = False) -> Dict[str, Any]:
596
- """
597
- Get all random battle sets for a generation.
598
-
599
- Args:
600
- generation: Generation to get sets from (8 or 9)
601
- force_refresh: If True, re-download data
602
-
603
- Returns:
604
- Dictionary containing all random battle sets for the generation
605
-
606
- Raises:
607
- ValueError: If random battles are not enabled
608
- """
609
- if self.random_battles is None:
610
- raise ValueError("Random battle sets are not enabled. Set enable_random_battles=True when initializing LocalDex.")
611
-
612
- if generation == 9:
613
- return self.random_battles.get_gen9_sets(force_refresh)
614
- elif generation == 8:
615
- return self.random_battles.get_gen8_data(force_refresh)
616
- else:
617
- raise ValueError(f"Generation {generation} is not supported. Use 8 or 9.")
618
-
619
- def search_random_battle_pokemon_by_move(self, move_name: str, generation: int = 9, force_refresh: bool = False) -> List[str]:
620
- """
621
- Search for Pokemon that have a specific move in their random battle sets.
622
-
623
- Args:
624
- move_name: Name of the move to search for (case-insensitive)
625
- generation: Generation to search in (8 or 9)
626
- force_refresh: If True, re-download data
627
-
628
- Returns:
629
- List of Pokemon names that have the move
630
-
631
- Raises:
632
- ValueError: If random battles are not enabled
633
- """
634
- if self.random_battles is None:
635
- raise ValueError("Random battle sets are not enabled. Set enable_random_battles=True when initializing LocalDex.")
636
-
637
- return self.random_battles.search_pokemon_by_move(move_name, generation, force_refresh)
638
-
639
- def search_random_battle_pokemon_by_ability(self, ability_name: str, generation: int = 9, force_refresh: bool = False) -> List[str]:
640
- """
641
- Search for Pokemon that have a specific ability in their random battle sets.
642
-
643
- Args:
644
- ability_name: Name of the ability to search for (case-insensitive)
645
- generation: Generation to search in (8 or 9)
646
- force_refresh: If True, re-download data
647
-
648
- Returns:
649
- List of Pokemon names that have the ability
650
-
651
- Raises:
652
- ValueError: If random battles are not enabled
653
- """
654
- if self.random_battles is None:
655
- raise ValueError("Random battle sets are not enabled. Set enable_random_battles=True when initializing LocalDex.")
656
-
657
- return self.random_battles.search_pokemon_by_ability(ability_name, generation, force_refresh)
658
-
659
- def get_available_random_battle_generations(self) -> List[int]:
660
- """
661
- Get list of available generations for random battles.
662
-
663
- Returns:
664
- List of generation numbers
665
-
666
- Raises:
667
- ValueError: If random battles are not enabled
668
- """
669
- if self.random_battles is None:
670
- raise ValueError("Random battle sets are not enabled. Set enable_random_battles=True when initializing LocalDex.")
671
-
672
- return self.random_battles.get_available_generations()
673
-
674
- def get_random_battle_formats(self, generation: int) -> List[str]:
675
- """
676
- Get available formats for a specific generation.
677
-
678
- Args:
679
- generation: Generation number
680
-
681
- Returns:
682
- List of available format names
683
-
684
- Raises:
685
- ValueError: If random battles are not enabled
686
- """
687
- if self.random_battles is None:
688
- raise ValueError("Random battle sets are not enabled. Set enable_random_battles=True when initializing LocalDex.")
689
-
690
- return self.random_battles.get_generation_formats(generation)
691
-
692
- def clear_random_battle_cache(self) -> None:
693
- """Clear random battle cache."""
694
- if self.random_battles is not None:
695
- self.random_battles.clear_cache()
696
-
697
- def cleanup_random_battle_downloads(self) -> None:
698
- """Remove downloaded Pokemon Showdown repository."""
699
- if self.random_battles is not None:
700
- self.random_battles.cleanup_downloads()
701
-
702
545
 
@@ -0,0 +1,88 @@
1
+ {
2
+ "id": 681,
3
+ "name": "aegislash",
4
+ "types": [
5
+ "steel",
6
+ "ghost"
7
+ ],
8
+ "baseStats": {
9
+ "hp": 60,
10
+ "attack": 50,
11
+ "defense": 140,
12
+ "special_attack": 50,
13
+ "special_defense": 140,
14
+ "speed": 60
15
+ },
16
+ "height": 1.7,
17
+ "weight": 53.0,
18
+ "abilities": {
19
+ "0": {
20
+ "name": "stance-change"
21
+ }
22
+ },
23
+ "moves": [
24
+ "swords-dance",
25
+ "cut",
26
+ "tackle",
27
+ "hyper-beam",
28
+ "toxic",
29
+ "screech",
30
+ "double-team",
31
+ "reflect",
32
+ "rest",
33
+ "rock-slide",
34
+ "slash",
35
+ "substitute",
36
+ "snore",
37
+ "reversal",
38
+ "spite",
39
+ "protect",
40
+ "endure",
41
+ "false-swipe",
42
+ "swagger",
43
+ "fury-cutter",
44
+ "attract",
45
+ "sleep-talk",
46
+ "return",
47
+ "frustration",
48
+ "pursuit",
49
+ "hidden-power",
50
+ "rain-dance",
51
+ "sunny-day",
52
+ "shadow-ball",
53
+ "rock-smash",
54
+ "facade",
55
+ "brick-break",
56
+ "secret-power",
57
+ "metal-sound",
58
+ "aerial-ace",
59
+ "iron-defense",
60
+ "block",
61
+ "shock-wave",
62
+ "gyro-ball",
63
+ "close-combat",
64
+ "power-trick",
65
+ "magnet-rise",
66
+ "night-slash",
67
+ "air-slash",
68
+ "giga-impact",
69
+ "shadow-claw",
70
+ "shadow-sneak",
71
+ "psycho-cut",
72
+ "flash-cannon",
73
+ "iron-head",
74
+ "head-smash",
75
+ "autotomize",
76
+ "after-you",
77
+ "round",
78
+ "retaliate",
79
+ "sacred-sword",
80
+ "kings-shield",
81
+ "confide",
82
+ "solar-blade",
83
+ "laser-focus",
84
+ "brutal-swing",
85
+ "steel-beam"
86
+ ],
87
+ "generation": 6
88
+ }
@@ -0,0 +1,86 @@
1
+ {
2
+ "id": 902,
3
+ "name": "basculegion",
4
+ "types": [
5
+ "water",
6
+ "ghost"
7
+ ],
8
+ "baseStats": {
9
+ "hp": 120,
10
+ "attack": 112,
11
+ "defense": 65,
12
+ "special_attack": 80,
13
+ "special_defense": 75,
14
+ "speed": 78
15
+ },
16
+ "height": 3.0,
17
+ "weight": 110.0,
18
+ "abilities": {
19
+ "0": {
20
+ "name": "swift-swim"
21
+ },
22
+ "1": {
23
+ "name": "adaptability"
24
+ },
25
+ "H": {
26
+ "name": "mold-breaker"
27
+ }
28
+ },
29
+ "moves": [
30
+ "headbutt",
31
+ "tackle",
32
+ "take-down",
33
+ "thrash",
34
+ "double-edge",
35
+ "tail-whip",
36
+ "bite",
37
+ "water-gun",
38
+ "hydro-pump",
39
+ "surf",
40
+ "ice-beam",
41
+ "blizzard",
42
+ "hyper-beam",
43
+ "agility",
44
+ "night-shade",
45
+ "confuse-ray",
46
+ "waterfall",
47
+ "rest",
48
+ "substitute",
49
+ "flail",
50
+ "spite",
51
+ "protect",
52
+ "scary-face",
53
+ "icy-wind",
54
+ "outrage",
55
+ "sleep-talk",
56
+ "pain-split",
57
+ "rain-dance",
58
+ "crunch",
59
+ "shadow-ball",
60
+ "whirlpool",
61
+ "uproar",
62
+ "facade",
63
+ "endeavor",
64
+ "muddy-water",
65
+ "mud-shot",
66
+ "water-pulse",
67
+ "giga-impact",
68
+ "ice-fang",
69
+ "zen-headbutt",
70
+ "aqua-jet",
71
+ "head-smash",
72
+ "soak",
73
+ "hex",
74
+ "phantom-force",
75
+ "psychic-fangs",
76
+ "liquidation",
77
+ "scale-shot",
78
+ "flip-turn",
79
+ "wave-crash",
80
+ "tera-blast",
81
+ "last-respects",
82
+ "snowscape",
83
+ "chilling-water"
84
+ ],
85
+ "generation": 9
86
+ }
@@ -0,0 +1,105 @@
1
+ {
2
+ "id": 550,
3
+ "name": "basculin",
4
+ "types": [
5
+ "water"
6
+ ],
7
+ "baseStats": {
8
+ "hp": 70,
9
+ "attack": 92,
10
+ "defense": 65,
11
+ "special_attack": 80,
12
+ "special_defense": 55,
13
+ "speed": 98
14
+ },
15
+ "height": 1.0,
16
+ "weight": 18.0,
17
+ "abilities": {
18
+ "0": {
19
+ "name": "reckless"
20
+ },
21
+ "1": {
22
+ "name": "adaptability"
23
+ },
24
+ "H": {
25
+ "name": "mold-breaker"
26
+ }
27
+ },
28
+ "moves": [
29
+ "cut",
30
+ "headbutt",
31
+ "tackle",
32
+ "take-down",
33
+ "thrash",
34
+ "double-edge",
35
+ "tail-whip",
36
+ "bite",
37
+ "water-gun",
38
+ "hydro-pump",
39
+ "surf",
40
+ "ice-beam",
41
+ "blizzard",
42
+ "bubble-beam",
43
+ "hyper-beam",
44
+ "toxic",
45
+ "agility",
46
+ "rage",
47
+ "double-team",
48
+ "waterfall",
49
+ "swift",
50
+ "rest",
51
+ "substitute",
52
+ "snore",
53
+ "flail",
54
+ "reversal",
55
+ "protect",
56
+ "scary-face",
57
+ "icy-wind",
58
+ "endure",
59
+ "swagger",
60
+ "attract",
61
+ "sleep-talk",
62
+ "return",
63
+ "frustration",
64
+ "hidden-power",
65
+ "rain-dance",
66
+ "crunch",
67
+ "whirlpool",
68
+ "uproar",
69
+ "hail",
70
+ "facade",
71
+ "taunt",
72
+ "superpower",
73
+ "revenge",
74
+ "endeavor",
75
+ "secret-power",
76
+ "dive",
77
+ "muddy-water",
78
+ "bounce",
79
+ "mud-shot",
80
+ "water-pulse",
81
+ "brine",
82
+ "assurance",
83
+ "aqua-tail",
84
+ "giga-impact",
85
+ "ice-fang",
86
+ "zen-headbutt",
87
+ "aqua-jet",
88
+ "head-smash",
89
+ "soak",
90
+ "round",
91
+ "chip-away",
92
+ "scald",
93
+ "final-gambit",
94
+ "confide",
95
+ "psychic-fangs",
96
+ "liquidation",
97
+ "scale-shot",
98
+ "flip-turn",
99
+ "wave-crash",
100
+ "tera-blast",
101
+ "snowscape",
102
+ "chilling-water"
103
+ ],
104
+ "generation": 5
105
+ }
@@ -0,0 +1,117 @@
1
+ {
2
+ "id": 555,
3
+ "name": "darmanitan",
4
+ "types": [
5
+ "fire"
6
+ ],
7
+ "baseStats": {
8
+ "hp": 105,
9
+ "attack": 140,
10
+ "defense": 55,
11
+ "special_attack": 30,
12
+ "special_defense": 55,
13
+ "speed": 95
14
+ },
15
+ "height": 1.3,
16
+ "weight": 92.9,
17
+ "abilities": {
18
+ "0": {
19
+ "name": "sheer-force"
20
+ },
21
+ "H": {
22
+ "name": "zen-mode"
23
+ }
24
+ },
25
+ "moves": [
26
+ "mega-punch",
27
+ "fire-punch",
28
+ "mega-kick",
29
+ "headbutt",
30
+ "tackle",
31
+ "body-slam",
32
+ "thrash",
33
+ "bite",
34
+ "roar",
35
+ "ember",
36
+ "flamethrower",
37
+ "hyper-beam",
38
+ "strength",
39
+ "solar-beam",
40
+ "fire-spin",
41
+ "earthquake",
42
+ "dig",
43
+ "toxic",
44
+ "psychic",
45
+ "rage",
46
+ "double-team",
47
+ "focus-energy",
48
+ "fire-blast",
49
+ "rest",
50
+ "rock-slide",
51
+ "substitute",
52
+ "thief",
53
+ "snore",
54
+ "reversal",
55
+ "protect",
56
+ "belly-drum",
57
+ "endure",
58
+ "rollout",
59
+ "swagger",
60
+ "attract",
61
+ "sleep-talk",
62
+ "return",
63
+ "frustration",
64
+ "encore",
65
+ "hidden-power",
66
+ "sunny-day",
67
+ "future-sight",
68
+ "rock-smash",
69
+ "uproar",
70
+ "heat-wave",
71
+ "torment",
72
+ "will-o-wisp",
73
+ "facade",
74
+ "focus-punch",
75
+ "taunt",
76
+ "trick",
77
+ "superpower",
78
+ "brick-break",
79
+ "endeavor",
80
+ "snatch",
81
+ "secret-power",
82
+ "overheat",
83
+ "rock-tomb",
84
+ "iron-defense",
85
+ "bulk-up",
86
+ "hammer-arm",
87
+ "gyro-ball",
88
+ "u-turn",
89
+ "payback",
90
+ "fling",
91
+ "power-swap",
92
+ "guard-swap",
93
+ "flare-blitz",
94
+ "focus-blast",
95
+ "giga-impact",
96
+ "fire-fang",
97
+ "zen-headbutt",
98
+ "iron-head",
99
+ "stone-edge",
100
+ "grass-knot",
101
+ "smack-down",
102
+ "flame-charge",
103
+ "round",
104
+ "incinerate",
105
+ "bulldoze",
106
+ "work-up",
107
+ "confide",
108
+ "mystical-fire",
109
+ "power-up-punch",
110
+ "laser-focus",
111
+ "body-press",
112
+ "expanding-force",
113
+ "burning-jealousy",
114
+ "lash-out"
115
+ ],
116
+ "generation": 5
117
+ }