Metadata-Version: 2.4
Name: localsets
Version: 0.1.4
Summary: Local Pokemon random battle sets (auto-updating) and Smogon competitive sets
Author: Pokemon RandBats Team
License: MIT
Project-URL: Homepage, https://github.com/colefoster/localsets
Project-URL: Repository, https://github.com/colefoster/localsets
Project-URL: Documentation, https://github.com/colefoster/localsets#readme
Keywords: pokemon,battle,data,random,showdown,smogon,competitive
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Games/Entertainment
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: requests>=2.25.0
Requires-Dist: appdirs>=1.4.0
Provides-Extra: gen1-randbats
Requires-Dist: gen1randombattle; extra == "gen1-randbats"
Provides-Extra: gen2-randbats
Requires-Dist: gen2randombattle; extra == "gen2-randbats"
Provides-Extra: gen3-randbats
Requires-Dist: gen3randombattle; extra == "gen3-randbats"
Provides-Extra: gen4-randbats
Requires-Dist: gen4randombattle; extra == "gen4-randbats"
Provides-Extra: gen5-randbats
Requires-Dist: gen5randombattle; extra == "gen5-randbats"
Provides-Extra: gen6-randbats
Requires-Dist: gen6randombattle; extra == "gen6-randbats"
Provides-Extra: gen7-randbats
Requires-Dist: gen7randombattle; extra == "gen7-randbats"
Provides-Extra: gen8-randbats
Requires-Dist: gen8randombattle; extra == "gen8-randbats"
Provides-Extra: gen9-randbats
Requires-Dist: gen9randombattle; extra == "gen9-randbats"
Provides-Extra: classic-randbats
Requires-Dist: gen1randombattle; extra == "classic-randbats"
Requires-Dist: gen2randombattle; extra == "classic-randbats"
Requires-Dist: gen3randombattle; extra == "classic-randbats"
Requires-Dist: gen4randombattle; extra == "classic-randbats"
Provides-Extra: modern-randbats
Requires-Dist: gen8randombattle; extra == "modern-randbats"
Requires-Dist: gen9randombattle; extra == "modern-randbats"
Provides-Extra: doubles-randbats
Requires-Dist: gen8randomdoublesbattle; extra == "doubles-randbats"
Requires-Dist: gen9randomdoublesbattle; extra == "doubles-randbats"
Provides-Extra: letsgo-randbats
Requires-Dist: gen7letsgorandombattle; extra == "letsgo-randbats"
Provides-Extra: bdsp-randbats
Requires-Dist: gen8bdsprandombattle; extra == "bdsp-randbats"
Provides-Extra: baby-randbats
Requires-Dist: gen9babyrandombattle; extra == "baby-randbats"
Provides-Extra: randbats-all
Requires-Dist: gen1randombattle; extra == "randbats-all"
Requires-Dist: gen2randombattle; extra == "randbats-all"
Requires-Dist: gen3randombattle; extra == "randbats-all"
Requires-Dist: gen4randombattle; extra == "randbats-all"
Requires-Dist: gen5randombattle; extra == "randbats-all"
Requires-Dist: gen6randombattle; extra == "randbats-all"
Requires-Dist: gen7letsgorandombattle; extra == "randbats-all"
Requires-Dist: gen7randombattle; extra == "randbats-all"
Requires-Dist: gen8bdsprandombattle; extra == "randbats-all"
Requires-Dist: gen8randombattle; extra == "randbats-all"
Requires-Dist: gen8randomdoublesbattle; extra == "randbats-all"
Requires-Dist: gen9babyrandombattle; extra == "randbats-all"
Requires-Dist: gen9randombattle; extra == "randbats-all"
Requires-Dist: gen9randomdoublesbattle; extra == "randbats-all"
Provides-Extra: ou
Requires-Dist: gen9ou; extra == "ou"
Requires-Dist: gen8ou; extra == "ou"
Requires-Dist: gen7ou; extra == "ou"
Requires-Dist: gen6ou; extra == "ou"
Requires-Dist: gen5ou; extra == "ou"
Requires-Dist: gen4ou; extra == "ou"
Requires-Dist: gen3ou; extra == "ou"
Requires-Dist: gen2ou; extra == "ou"
Requires-Dist: gen1ou; extra == "ou"
Provides-Extra: uu
Requires-Dist: gen9uu; extra == "uu"
Requires-Dist: gen8uu; extra == "uu"
Requires-Dist: gen7uu; extra == "uu"
Requires-Dist: gen6uu; extra == "uu"
Requires-Dist: gen5uu; extra == "uu"
Requires-Dist: gen4uu; extra == "uu"
Requires-Dist: gen3uu; extra == "uu"
Requires-Dist: gen2uu; extra == "uu"
Requires-Dist: gen1uu; extra == "uu"
Provides-Extra: ru
Requires-Dist: gen9ru; extra == "ru"
Requires-Dist: gen8ru; extra == "ru"
Requires-Dist: gen7ru; extra == "ru"
Requires-Dist: gen6ru; extra == "ru"
Requires-Dist: gen5ru; extra == "ru"
Requires-Dist: gen4ru; extra == "ru"
Requires-Dist: gen3ru; extra == "ru"
Requires-Dist: gen2ru; extra == "ru"
Requires-Dist: gen1ru; extra == "ru"
Provides-Extra: nu
Requires-Dist: gen9nu; extra == "nu"
Requires-Dist: gen8nu; extra == "nu"
Requires-Dist: gen7nu; extra == "nu"
Requires-Dist: gen6nu; extra == "nu"
Requires-Dist: gen5nu; extra == "nu"
Requires-Dist: gen4nu; extra == "nu"
Requires-Dist: gen3nu; extra == "nu"
Requires-Dist: gen2nu; extra == "nu"
Requires-Dist: gen1nu; extra == "nu"
Provides-Extra: pu
Requires-Dist: gen9pu; extra == "pu"
Requires-Dist: gen8pu; extra == "pu"
Requires-Dist: gen7pu; extra == "pu"
Requires-Dist: gen6pu; extra == "pu"
Requires-Dist: gen5pu; extra == "pu"
Requires-Dist: gen4pu; extra == "pu"
Requires-Dist: gen3pu; extra == "pu"
Requires-Dist: gen2pu; extra == "pu"
Requires-Dist: gen1pu; extra == "pu"
Provides-Extra: ubers
Requires-Dist: gen9ubers; extra == "ubers"
Requires-Dist: gen8ubers; extra == "ubers"
Requires-Dist: gen7ubers; extra == "ubers"
Requires-Dist: gen6ubers; extra == "ubers"
Requires-Dist: gen5ubers; extra == "ubers"
Requires-Dist: gen4ubers; extra == "ubers"
Requires-Dist: gen3ubers; extra == "ubers"
Requires-Dist: gen2ubers; extra == "ubers"
Requires-Dist: gen1ubers; extra == "ubers"
Provides-Extra: smogon-doubles
Requires-Dist: gen9doublesou; extra == "smogon-doubles"
Requires-Dist: gen8doublesou; extra == "smogon-doubles"
Requires-Dist: gen7doublesou; extra == "smogon-doubles"
Requires-Dist: gen6doublesou; extra == "smogon-doubles"
Requires-Dist: gen5doublesou; extra == "smogon-doubles"
Requires-Dist: gen4doublesou; extra == "smogon-doubles"
Requires-Dist: gen3doublesou; extra == "smogon-doubles"
Requires-Dist: gen2doublesou; extra == "smogon-doubles"
Requires-Dist: gen1doublesou; extra == "smogon-doubles"
Provides-Extra: vgc
Requires-Dist: gen9vgc2024; extra == "vgc"
Requires-Dist: gen8vgc2022; extra == "vgc"
Requires-Dist: gen8vgc2023; extra == "vgc"
Requires-Dist: gen7vgc2017; extra == "vgc"
Requires-Dist: gen7vgc2018; extra == "vgc"
Requires-Dist: gen7vgc2019; extra == "vgc"
Requires-Dist: gen6vgc2014; extra == "vgc"
Requires-Dist: gen6vgc2015; extra == "vgc"
Requires-Dist: gen6vgc2016; extra == "vgc"
Requires-Dist: gen5vgc2011; extra == "vgc"
Requires-Dist: gen5vgc2012; extra == "vgc"
Requires-Dist: gen5vgc2013; extra == "vgc"
Requires-Dist: gen4vgc2009; extra == "vgc"
Requires-Dist: gen4vgc2010; extra == "vgc"
Provides-Extra: gen9-smogon
Requires-Dist: gen9ou; extra == "gen9-smogon"
Requires-Dist: gen9uu; extra == "gen9-smogon"
Requires-Dist: gen9ru; extra == "gen9-smogon"
Requires-Dist: gen9nu; extra == "gen9-smogon"
Requires-Dist: gen9pu; extra == "gen9-smogon"
Requires-Dist: gen9ubers; extra == "gen9-smogon"
Requires-Dist: gen9doublesou; extra == "gen9-smogon"
Requires-Dist: gen9vgc2024; extra == "gen9-smogon"
Provides-Extra: gen8-smogon
Requires-Dist: gen8ou; extra == "gen8-smogon"
Requires-Dist: gen8uu; extra == "gen8-smogon"
Requires-Dist: gen8ru; extra == "gen8-smogon"
Requires-Dist: gen8nu; extra == "gen8-smogon"
Requires-Dist: gen8pu; extra == "gen8-smogon"
Requires-Dist: gen8ubers; extra == "gen8-smogon"
Requires-Dist: gen8doublesou; extra == "gen8-smogon"
Requires-Dist: gen8vgc2022; extra == "gen8-smogon"
Requires-Dist: gen8vgc2023; extra == "gen8-smogon"
Provides-Extra: gen7-smogon
Requires-Dist: gen7ou; extra == "gen7-smogon"
Requires-Dist: gen7uu; extra == "gen7-smogon"
Requires-Dist: gen7ru; extra == "gen7-smogon"
Requires-Dist: gen7nu; extra == "gen7-smogon"
Requires-Dist: gen7pu; extra == "gen7-smogon"
Requires-Dist: gen7ubers; extra == "gen7-smogon"
Requires-Dist: gen7doublesou; extra == "gen7-smogon"
Requires-Dist: gen7vgc2017; extra == "gen7-smogon"
Requires-Dist: gen7vgc2018; extra == "gen7-smogon"
Requires-Dist: gen7vgc2019; extra == "gen7-smogon"
Provides-Extra: gen6-smogon
Requires-Dist: gen6ou; extra == "gen6-smogon"
Requires-Dist: gen6uu; extra == "gen6-smogon"
Requires-Dist: gen6ru; extra == "gen6-smogon"
Requires-Dist: gen6nu; extra == "gen6-smogon"
Requires-Dist: gen6pu; extra == "gen6-smogon"
Requires-Dist: gen6ubers; extra == "gen6-smogon"
Requires-Dist: gen6doublesou; extra == "gen6-smogon"
Requires-Dist: gen6vgc2014; extra == "gen6-smogon"
Requires-Dist: gen6vgc2015; extra == "gen6-smogon"
Requires-Dist: gen6vgc2016; extra == "gen6-smogon"
Provides-Extra: gen5-smogon
Requires-Dist: gen5ou; extra == "gen5-smogon"
Requires-Dist: gen5uu; extra == "gen5-smogon"
Requires-Dist: gen5ru; extra == "gen5-smogon"
Requires-Dist: gen5nu; extra == "gen5-smogon"
Requires-Dist: gen5pu; extra == "gen5-smogon"
Requires-Dist: gen5ubers; extra == "gen5-smogon"
Requires-Dist: gen5doublesou; extra == "gen5-smogon"
Requires-Dist: gen5vgc2011; extra == "gen5-smogon"
Requires-Dist: gen5vgc2012; extra == "gen5-smogon"
Requires-Dist: gen5vgc2013; extra == "gen5-smogon"
Provides-Extra: gen4-smogon
Requires-Dist: gen4ou; extra == "gen4-smogon"
Requires-Dist: gen4uu; extra == "gen4-smogon"
Requires-Dist: gen4nu; extra == "gen4-smogon"
Requires-Dist: gen4pu; extra == "gen4-smogon"
Requires-Dist: gen4ubers; extra == "gen4-smogon"
Requires-Dist: gen4doublesou; extra == "gen4-smogon"
Requires-Dist: gen4vgc2009; extra == "gen4-smogon"
Requires-Dist: gen4vgc2010; extra == "gen4-smogon"
Provides-Extra: gen3-smogon
Requires-Dist: gen3ou; extra == "gen3-smogon"
Requires-Dist: gen3uu; extra == "gen3-smogon"
Requires-Dist: gen3nu; extra == "gen3-smogon"
Requires-Dist: gen3pu; extra == "gen3-smogon"
Requires-Dist: gen3ubers; extra == "gen3-smogon"
Requires-Dist: gen3doublesou; extra == "gen3-smogon"
Provides-Extra: gen2-smogon
Requires-Dist: gen2ou; extra == "gen2-smogon"
Requires-Dist: gen2uu; extra == "gen2-smogon"
Requires-Dist: gen2nu; extra == "gen2-smogon"
Requires-Dist: gen2pu; extra == "gen2-smogon"
Requires-Dist: gen2ubers; extra == "gen2-smogon"
Requires-Dist: gen2doublesou; extra == "gen2-smogon"
Provides-Extra: gen1-smogon
Requires-Dist: gen1ou; extra == "gen1-smogon"
Requires-Dist: gen1uu; extra == "gen1-smogon"
Requires-Dist: gen1nu; extra == "gen1-smogon"
Requires-Dist: gen1pu; extra == "gen1-smogon"
Requires-Dist: gen1ubers; extra == "gen1-smogon"
Requires-Dist: gen1doublesou; extra == "gen1-smogon"
Provides-Extra: smogon-all
Requires-Dist: gen9ou; extra == "smogon-all"
Requires-Dist: gen9uu; extra == "smogon-all"
Requires-Dist: gen9ru; extra == "smogon-all"
Requires-Dist: gen9nu; extra == "smogon-all"
Requires-Dist: gen9pu; extra == "smogon-all"
Requires-Dist: gen9ubers; extra == "smogon-all"
Requires-Dist: gen9doublesou; extra == "smogon-all"
Requires-Dist: gen9vgc2024; extra == "smogon-all"
Requires-Dist: gen8ou; extra == "smogon-all"
Requires-Dist: gen8uu; extra == "smogon-all"
Requires-Dist: gen8ru; extra == "smogon-all"
Requires-Dist: gen8nu; extra == "smogon-all"
Requires-Dist: gen8pu; extra == "smogon-all"
Requires-Dist: gen8ubers; extra == "smogon-all"
Requires-Dist: gen8doublesou; extra == "smogon-all"
Requires-Dist: gen8vgc2022; extra == "smogon-all"
Requires-Dist: gen8vgc2023; extra == "smogon-all"
Requires-Dist: gen7ou; extra == "smogon-all"
Requires-Dist: gen7uu; extra == "smogon-all"
Requires-Dist: gen7ru; extra == "smogon-all"
Requires-Dist: gen7nu; extra == "smogon-all"
Requires-Dist: gen7pu; extra == "smogon-all"
Requires-Dist: gen7ubers; extra == "smogon-all"
Requires-Dist: gen7doublesou; extra == "smogon-all"
Requires-Dist: gen7vgc2017; extra == "smogon-all"
Requires-Dist: gen7vgc2018; extra == "smogon-all"
Requires-Dist: gen7vgc2019; extra == "smogon-all"
Requires-Dist: gen6ou; extra == "smogon-all"
Requires-Dist: gen6uu; extra == "smogon-all"
Requires-Dist: gen6ru; extra == "smogon-all"
Requires-Dist: gen6nu; extra == "smogon-all"
Requires-Dist: gen6pu; extra == "smogon-all"
Requires-Dist: gen6ubers; extra == "smogon-all"
Requires-Dist: gen6doublesou; extra == "smogon-all"
Requires-Dist: gen6vgc2014; extra == "smogon-all"
Requires-Dist: gen6vgc2015; extra == "smogon-all"
Requires-Dist: gen6vgc2016; extra == "smogon-all"
Requires-Dist: gen5ou; extra == "smogon-all"
Requires-Dist: gen5uu; extra == "smogon-all"
Requires-Dist: gen5ru; extra == "smogon-all"
Requires-Dist: gen5nu; extra == "smogon-all"
Requires-Dist: gen5pu; extra == "smogon-all"
Requires-Dist: gen5ubers; extra == "smogon-all"
Requires-Dist: gen5doublesou; extra == "smogon-all"
Requires-Dist: gen5vgc2011; extra == "smogon-all"
Requires-Dist: gen5vgc2012; extra == "smogon-all"
Requires-Dist: gen5vgc2013; extra == "smogon-all"
Requires-Dist: gen4ou; extra == "smogon-all"
Requires-Dist: gen4uu; extra == "smogon-all"
Requires-Dist: gen4nu; extra == "smogon-all"
Requires-Dist: gen4pu; extra == "smogon-all"
Requires-Dist: gen4ubers; extra == "smogon-all"
Requires-Dist: gen4doublesou; extra == "smogon-all"
Requires-Dist: gen4vgc2009; extra == "smogon-all"
Requires-Dist: gen4vgc2010; extra == "smogon-all"
Requires-Dist: gen3ou; extra == "smogon-all"
Requires-Dist: gen3uu; extra == "smogon-all"
Requires-Dist: gen3nu; extra == "smogon-all"
Requires-Dist: gen3pu; extra == "smogon-all"
Requires-Dist: gen3ubers; extra == "smogon-all"
Requires-Dist: gen3doublesou; extra == "smogon-all"
Requires-Dist: gen2ou; extra == "smogon-all"
Requires-Dist: gen2uu; extra == "smogon-all"
Requires-Dist: gen2nu; extra == "smogon-all"
Requires-Dist: gen2pu; extra == "smogon-all"
Requires-Dist: gen2ubers; extra == "smogon-all"
Requires-Dist: gen2doublesou; extra == "smogon-all"
Requires-Dist: gen1ou; extra == "smogon-all"
Requires-Dist: gen1uu; extra == "smogon-all"
Requires-Dist: gen1nu; extra == "smogon-all"
Requires-Dist: gen1pu; extra == "smogon-all"
Requires-Dist: gen1ubers; extra == "smogon-all"
Requires-Dist: gen1doublesou; extra == "smogon-all"
Provides-Extra: gen9-all
Requires-Dist: gen9randombattle; extra == "gen9-all"
Requires-Dist: gen9ou; extra == "gen9-all"
Requires-Dist: gen9uu; extra == "gen9-all"
Requires-Dist: gen9ru; extra == "gen9-all"
Requires-Dist: gen9nu; extra == "gen9-all"
Requires-Dist: gen9pu; extra == "gen9-all"
Requires-Dist: gen9ubers; extra == "gen9-all"
Requires-Dist: gen9doublesou; extra == "gen9-all"
Requires-Dist: gen9vgc2024; extra == "gen9-all"
Provides-Extra: gen8-all
Requires-Dist: gen8randombattle; extra == "gen8-all"
Requires-Dist: gen8ou; extra == "gen8-all"
Requires-Dist: gen8uu; extra == "gen8-all"
Requires-Dist: gen8ru; extra == "gen8-all"
Requires-Dist: gen8nu; extra == "gen8-all"
Requires-Dist: gen8pu; extra == "gen8-all"
Requires-Dist: gen8ubers; extra == "gen8-all"
Requires-Dist: gen8doublesou; extra == "gen8-all"
Requires-Dist: gen8vgc2022; extra == "gen8-all"
Requires-Dist: gen8vgc2023; extra == "gen8-all"
Provides-Extra: gen7-all
Requires-Dist: gen7randombattle; extra == "gen7-all"
Requires-Dist: gen7ou; extra == "gen7-all"
Requires-Dist: gen7uu; extra == "gen7-all"
Requires-Dist: gen7ru; extra == "gen7-all"
Requires-Dist: gen7nu; extra == "gen7-all"
Requires-Dist: gen7pu; extra == "gen7-all"
Requires-Dist: gen7ubers; extra == "gen7-all"
Requires-Dist: gen7doublesou; extra == "gen7-all"
Requires-Dist: gen7vgc2017; extra == "gen7-all"
Requires-Dist: gen7vgc2018; extra == "gen7-all"
Requires-Dist: gen7vgc2019; extra == "gen7-all"
Provides-Extra: gen6-all
Requires-Dist: gen6randombattle; extra == "gen6-all"
Requires-Dist: gen6ou; extra == "gen6-all"
Requires-Dist: gen6uu; extra == "gen6-all"
Requires-Dist: gen6ru; extra == "gen6-all"
Requires-Dist: gen6nu; extra == "gen6-all"
Requires-Dist: gen6pu; extra == "gen6-all"
Requires-Dist: gen6ubers; extra == "gen6-all"
Requires-Dist: gen6doublesou; extra == "gen6-all"
Requires-Dist: gen6vgc2014; extra == "gen6-all"
Requires-Dist: gen6vgc2015; extra == "gen6-all"
Requires-Dist: gen6vgc2016; extra == "gen6-all"
Provides-Extra: gen5-all
Requires-Dist: gen5randombattle; extra == "gen5-all"
Requires-Dist: gen5ou; extra == "gen5-all"
Requires-Dist: gen5uu; extra == "gen5-all"
Requires-Dist: gen5ru; extra == "gen5-all"
Requires-Dist: gen5nu; extra == "gen5-all"
Requires-Dist: gen5pu; extra == "gen5-all"
Requires-Dist: gen5ubers; extra == "gen5-all"
Requires-Dist: gen5doublesou; extra == "gen5-all"
Requires-Dist: gen5vgc2011; extra == "gen5-all"
Requires-Dist: gen5vgc2012; extra == "gen5-all"
Requires-Dist: gen5vgc2013; extra == "gen5-all"
Provides-Extra: gen4-all
Requires-Dist: gen4randombattle; extra == "gen4-all"
Requires-Dist: gen4ou; extra == "gen4-all"
Requires-Dist: gen4uu; extra == "gen4-all"
Requires-Dist: gen4nu; extra == "gen4-all"
Requires-Dist: gen4pu; extra == "gen4-all"
Requires-Dist: gen4ubers; extra == "gen4-all"
Requires-Dist: gen4doublesou; extra == "gen4-all"
Requires-Dist: gen4vgc2009; extra == "gen4-all"
Requires-Dist: gen4vgc2010; extra == "gen4-all"
Provides-Extra: gen3-all
Requires-Dist: gen3randombattle; extra == "gen3-all"
Requires-Dist: gen3ou; extra == "gen3-all"
Requires-Dist: gen3uu; extra == "gen3-all"
Requires-Dist: gen3nu; extra == "gen3-all"
Requires-Dist: gen3pu; extra == "gen3-all"
Requires-Dist: gen3ubers; extra == "gen3-all"
Requires-Dist: gen3doublesou; extra == "gen3-all"
Provides-Extra: gen2-all
Requires-Dist: gen2randombattle; extra == "gen2-all"
Requires-Dist: gen2ou; extra == "gen2-all"
Requires-Dist: gen2uu; extra == "gen2-all"
Requires-Dist: gen2nu; extra == "gen2-all"
Requires-Dist: gen2pu; extra == "gen2-all"
Requires-Dist: gen2ubers; extra == "gen2-all"
Requires-Dist: gen2doublesou; extra == "gen2-all"
Provides-Extra: gen1-all
Requires-Dist: gen1randombattle; extra == "gen1-all"
Requires-Dist: gen1ou; extra == "gen1-all"
Requires-Dist: gen1uu; extra == "gen1-all"
Requires-Dist: gen1nu; extra == "gen1-all"
Requires-Dist: gen1pu; extra == "gen1-all"
Requires-Dist: gen1ubers; extra == "gen1-all"
Requires-Dist: gen1doublesou; extra == "gen1-all"
Provides-Extra: all
Requires-Dist: gen1randombattle; extra == "all"
Requires-Dist: gen2randombattle; extra == "all"
Requires-Dist: gen3randombattle; extra == "all"
Requires-Dist: gen4randombattle; extra == "all"
Requires-Dist: gen5randombattle; extra == "all"
Requires-Dist: gen6randombattle; extra == "all"
Requires-Dist: gen7letsgorandombattle; extra == "all"
Requires-Dist: gen7randombattle; extra == "all"
Requires-Dist: gen8bdsprandombattle; extra == "all"
Requires-Dist: gen8randombattle; extra == "all"
Requires-Dist: gen8randomdoublesbattle; extra == "all"
Requires-Dist: gen9babyrandombattle; extra == "all"
Requires-Dist: gen9randombattle; extra == "all"
Requires-Dist: gen9randomdoublesbattle; extra == "all"
Requires-Dist: gen9ou; extra == "all"
Requires-Dist: gen9uu; extra == "all"
Requires-Dist: gen9ru; extra == "all"
Requires-Dist: gen9nu; extra == "all"
Requires-Dist: gen9pu; extra == "all"
Requires-Dist: gen9ubers; extra == "all"
Requires-Dist: gen9doublesou; extra == "all"
Requires-Dist: gen9vgc2024; extra == "all"
Requires-Dist: gen8ou; extra == "all"
Requires-Dist: gen8uu; extra == "all"
Requires-Dist: gen8ru; extra == "all"
Requires-Dist: gen8nu; extra == "all"
Requires-Dist: gen8pu; extra == "all"
Requires-Dist: gen8ubers; extra == "all"
Requires-Dist: gen8doublesou; extra == "all"
Requires-Dist: gen8vgc2022; extra == "all"
Requires-Dist: gen8vgc2023; extra == "all"
Requires-Dist: gen7ou; extra == "all"
Requires-Dist: gen7uu; extra == "all"
Requires-Dist: gen7ru; extra == "all"
Requires-Dist: gen7nu; extra == "all"
Requires-Dist: gen7pu; extra == "all"
Requires-Dist: gen7ubers; extra == "all"
Requires-Dist: gen7doublesou; extra == "all"
Requires-Dist: gen7vgc2017; extra == "all"
Requires-Dist: gen7vgc2018; extra == "all"
Requires-Dist: gen7vgc2019; extra == "all"
Requires-Dist: gen6ou; extra == "all"
Requires-Dist: gen6uu; extra == "all"
Requires-Dist: gen6ru; extra == "all"
Requires-Dist: gen6nu; extra == "all"
Requires-Dist: gen6pu; extra == "all"
Requires-Dist: gen6ubers; extra == "all"
Requires-Dist: gen6doublesou; extra == "all"
Requires-Dist: gen6vgc2014; extra == "all"
Requires-Dist: gen6vgc2015; extra == "all"
Requires-Dist: gen6vgc2016; extra == "all"
Requires-Dist: gen5ou; extra == "all"
Requires-Dist: gen5uu; extra == "all"
Requires-Dist: gen5ru; extra == "all"
Requires-Dist: gen5nu; extra == "all"
Requires-Dist: gen5pu; extra == "all"
Requires-Dist: gen5ubers; extra == "all"
Requires-Dist: gen5doublesou; extra == "all"
Requires-Dist: gen5vgc2011; extra == "all"
Requires-Dist: gen5vgc2012; extra == "all"
Requires-Dist: gen5vgc2013; extra == "all"
Requires-Dist: gen4ou; extra == "all"
Requires-Dist: gen4uu; extra == "all"
Requires-Dist: gen4nu; extra == "all"
Requires-Dist: gen4pu; extra == "all"
Requires-Dist: gen4ubers; extra == "all"
Requires-Dist: gen4doublesou; extra == "all"
Requires-Dist: gen4vgc2009; extra == "all"
Requires-Dist: gen4vgc2010; extra == "all"
Requires-Dist: gen3ou; extra == "all"
Requires-Dist: gen3uu; extra == "all"
Requires-Dist: gen3nu; extra == "all"
Requires-Dist: gen3pu; extra == "all"
Requires-Dist: gen3ubers; extra == "all"
Requires-Dist: gen3doublesou; extra == "all"
Requires-Dist: gen2ou; extra == "all"
Requires-Dist: gen2uu; extra == "all"
Requires-Dist: gen2nu; extra == "all"
Requires-Dist: gen2pu; extra == "all"
Requires-Dist: gen2ubers; extra == "all"
Requires-Dist: gen2doublesou; extra == "all"
Requires-Dist: gen1ou; extra == "all"
Requires-Dist: gen1uu; extra == "all"
Requires-Dist: gen1nu; extra == "all"
Requires-Dist: gen1pu; extra == "all"
Requires-Dist: gen1ubers; extra == "all"
Requires-Dist: gen1doublesou; extra == "all"
Provides-Extra: dev
Requires-Dist: pytest>=6.0.0; extra == "dev"
Requires-Dist: pytest-cov>=2.10.0; extra == "dev"
Requires-Dist: black>=21.0.0; extra == "dev"
Requires-Dist: flake8>=3.8.0; extra == "dev"
Requires-Dist: mypy>=0.800; extra == "dev"
Requires-Dist: twine>=3.0.0; extra == "dev"
Requires-Dist: wheel>=0.36.0; extra == "dev"
Dynamic: license-file

# Pokemon Data Package

A Python package providing offline access to Pokemon random battle data and Smogon competitive sets with automatic updates from official source repositories.

## Features

- **Offline Access**: Bundle data files within the package for immediate use
- **Auto-Updates**: Automatically check for RandBats updates every 24 hours (configurable)
- **Dual Data Sources**: Both RandBats random battle data and Smogon competitive sets
- **Modular Installation**: Install only the generations/formats you need
- **Clean API**: Simple programmatic access to Pokemon data
- **Rich CLI**: Beautiful command-line interface with colored output
- **Multiple Formats**: Support for all Pokemon generations and battle formats
- **Graceful Fallbacks**: Robust error handling and network failure recovery

## Installation

### Full Installation (All Formats)
```bash
pip install localsets[all]
```

### RandBats Only (Random Battle Data)
```bash
# All RandBats formats
pip install localsets[randbats-all]

# Specific generations
pip install localsets[gen1,gen2,gen3]

# Classic generations (1-4)
pip install localsets[classic]

# Modern generations (8-9)
pip install localsets[modern]
```

### Smogon Only (Competitive Sets)
```bash
# All Smogon formats
pip install localsets[smogon-all]

# Specific tiers
pip install localsets[ou,uu,ru]  # OverUsed, UnderUsed, RarelyUsed

# Current generation competitive
pip install localsets[current]  # gen9ou, gen9uu, gen9ru, gen9nu, gen9pu

# VGC formats
pip install localsets[vgc]

# Doubles formats
pip install localsets[smogon-doubles]
```

### Combined Installations
```bash
# Current generation both types
pip install localsets[current]  # gen9randombattle, gen9ou, gen9uu

# Complete competitive setup
pip install localsets[competitive]  # All Smogon formats

# Everything
pip install localsets[complete]  # All RandBats + Smogon formats
```

## Quick Start

### Programmatic Usage

```python
from localsets import PokemonData, get_pokemon, get_smogon_sets

# Initialize with specific formats
data = PokemonData(
    randbats_formats=['gen9randombattle', 'gen8randombattle'],
    smogon_formats=['gen9ou', 'gen8ou']
)

# RandBats data (random battle)
pikachu_randbats = data.get_randbats('pikachu', 'gen9randombattle')

# Smogon sets (competitive)
pikachu_sets = data.get_smogon_sets('pikachu', 'gen9ou')
life_orb_set = data.get_smogon_set('pikachu', 'gen9ou', 'Life Orb')

# List available Pokemon
randbats_pokemon = data.list_randbats_pokemon('gen9randombattle')
smogon_pokemon = data.list_smogon_pokemon('gen9ou')

# Update RandBats data
data.update_randbats(['gen9randombattle'])  # specific format
data.update_randbats_all()  # all RandBats formats

# Search across all formats
all_results = data.search_all('pikachu')

# Quick access functions
get_pokemon('pikachu', 'gen9randombattle')  # RandBats
get_smogon_sets('pikachu', 'gen9ou')  # Smogon
```

### Command Line Interface

```bash
# RandBats commands
localsets randbats update
localsets randbats get pikachu --format gen9randombattle
localsets randbats list --format gen9randombattle

# Smogon commands
localsets smogon get pikachu gen9ou
localsets smogon get pikachu gen9ou --set "Life Orb"
localsets smogon sets pikachu gen9ou
localsets smogon list gen9ou
localsets smogon search pikachu
localsets smogon formats

# Unified commands
localsets get pikachu --randbats gen9randombattle --smogon gen9ou
localsets formats --all  # show both RandBats and Smogon formats

# Legacy commands (backward compatibility)
localsets update  # same as randbats update
localsets get pikachu  # same as randbats get
localsets list  # same as randbats list
```

## Supported Formats

### RandBats Formats (Random Battle)

| Format | Generation | Type | Description |
|--------|------------|------|-------------|
| `gen1randombattle` | 1 | Singles | Generation 1 random battle |
| `gen2randombattle` | 2 | Singles | Generation 2 random battle |
| `gen3randombattle` | 3 | Singles | Generation 3 random battle |
| `gen4randombattle` | 4 | Singles | Generation 4 random battle |
| `gen5randombattle` | 5 | Singles | Generation 5 random battle |
| `gen6randombattle` | 6 | Singles | Generation 6 random battle |
| `gen7randombattle` | 7 | Singles | Generation 7 random battle |
| `gen7letsgorandombattle` | 7 | Let's Go | Let's Go Pikachu/Eevee format |
| `gen8randombattle` | 8 | Singles | Generation 8 random battle |
| `gen8bdsprandombattle` | 8 | BDSP | Brilliant Diamond/Shining Pearl |
| `gen8randomdoublesbattle` | 8 | Doubles | Generation 8 doubles battle |
| `gen9randombattle` | 9 | Singles | Generation 9 random battle |
| `gen9randomdoublesbattle` | 9 | Doubles | Generation 9 doubles battle |
| `gen9babyrandombattle` | 9 | Baby | Baby Pokemon format |

### Smogon Formats (Competitive Sets)

| Format | Generation | Type | Description |
|--------|------------|------|-------------|
| `gen9ou` | 9 | OU | OverUsed tier |
| `gen9uu` | 9 | UU | UnderUsed tier |
| `gen9ru` | 9 | RU | RarelyUsed tier |
| `gen9nu` | 9 | NU | NeverUsed tier |
| `gen9pu` | 9 | PU | PU tier |
| `gen9ubers` | 9 | Ubers | Ubers tier |
| `gen9doublesou` | 9 | Doubles | Doubles OU |
| `gen9vgc2024` | 9 | VGC | Video Game Championships 2024 |
| `gen8ou` | 8 | OU | OverUsed tier |
| `gen8uu` | 8 | UU | UnderUsed tier |
| `gen8vgc2022` | 8 | VGC | Video Game Championships 2022 |
| `gen8vgc2023` | 8 | VGC | Video Game Championships 2023 |
| ... | ... | ... | ... (similar for all generations) |

## Installation Extras

### RandBats Extras
| Extra | Formats Included |
|-------|------------------|
| `gen1` | `gen1randombattle` |
| `gen2` | `gen2randombattle` |
| `gen3` | `gen3randombattle` |
| `gen4` | `gen4randombattle` |
| `gen5` | `gen5randombattle` |
| `gen6` | `gen6randombattle` |
| `gen7` | `gen7randombattle` |
| `gen8` | `gen8randombattle` |
| `gen9` | `gen9randombattle` |
| `classic` | `gen1randombattle`, `gen2randombattle`, `gen3randombattle`, `gen4randombattle` |
| `modern` | `gen8randombattle`, `gen9randombattle` |
| `doubles` | `gen8randomdoublesbattle`, `gen9randomdoublesbattle` |
| `letsgo` | `gen7letsgorandombattle` |
| `bdsp` | `gen8bdsprandombattle` |
| `baby` | `gen9babyrandombattle` |
| `randbats-all` | All RandBats formats |

### Smogon Extras
| Extra | Formats Included |
|-------|------------------|
| `ou` | All OU formats across generations |
| `uu` | All UU formats across generations |
| `ru` | All RU formats across generations |
| `nu` | All NU formats across generations |
| `pu` | All PU formats across generations |
| `ubers` | All Ubers formats across generations |
| `smogon-doubles` | All Doubles OU formats |
| `vgc` | All VGC formats across generations |
| `current` | `gen9ou`, `gen9uu`, `gen9ru`, `gen9nu`, `gen9pu` |
| `gen9-smogon` | All Generation 9 Smogon formats |
| `gen8-smogon` | All Generation 8 Smogon formats |
| ... | ... (similar for all generations) |
| `smogon-all` | All Smogon formats |

### Combined Extras
| Extra | Formats Included |
|-------|------------------|
| `current` | `gen9randombattle`, `gen9ou`, `gen9uu` |
| `competitive` | All Smogon formats |
| `random` | All RandBats formats |
| `complete` | All RandBats + Smogon formats |
| `all` | All formats |

## API Reference

### PokemonData Class

The main class for managing Pokemon data from both RandBats and Smogon sources.

#### Constructor
```python
PokemonData(randbats_formats=None, smogon_formats=None, cache_dir=None, auto_update=True)
```

- `randbats_formats`: List of RandBats format names to load (default: all available)
- `smogon_formats`: List of Smogon format names to load (default: all available)
- `cache_dir`: Directory to store cached data (default: system cache)
- `auto_update`: Whether to automatically check for RandBats updates (default: True)

#### RandBats Methods

- `get_randbats(pokemon_name, format_name=None)`: Get RandBats Pokemon data
- `list_randbats_pokemon(format_name)`: List all Pokemon in a RandBats format
- `get_randbats_formats()`: Get list of available RandBats formats
- `update_randbats(formats=None)`: Update RandBats data for specific formats
- `update_randbats_all()`: Update RandBats data for all available formats

#### Smogon Methods

- `get_smogon_sets(pokemon_name, format_name)`: Get all Smogon sets for a Pokemon
- `get_smogon_set(pokemon_name, format_name, set_name)`: Get a specific Smogon set
- `list_smogon_sets(pokemon_name, format_name)`: List all set names for a Pokemon
- `list_smogon_pokemon(format_name)`: List all Pokemon in a Smogon format
- `get_smogon_formats()`: Get list of available Smogon formats
- `search_smogon(pokemon_name)`: Search for a Pokemon across all Smogon formats

#### Unified Methods

- `get_all_formats()`: Get all available formats from both sources
- `search_all(pokemon_name)`: Search for a Pokemon across both sources

#### Backward Compatibility Methods

- `get_pokemon(pokemon_name, format_name=None)`: Alias for `get_randbats`
- `list_pokemon(format_name)`: Alias for `list_randbats_pokemon`
- `get_formats()`: Alias for `get_randbats_formats`
- `update(formats=None)`: Alias for `update_randbats`
- `update_all()`: Alias for `update_randbats_all`

### Quick Access Functions

- `get_pokemon(pokemon_name, format_name=None)`: Quick RandBats lookup
- `get_smogon_sets(pokemon_name, format_name)`: Quick Smogon sets lookup
- `list_pokemon(format_name)`: Quick RandBats format listing
- `list_smogon_pokemon(format_name)`: Quick Smogon format listing
- `update_data(formats=None)`: Quick RandBats data update

## Data Structure Differences

### RandBats Format (Random Battle)
```json
{
  "pikachu": {
    "level": 50,
    "abilities": ["Static"],
    "items": ["Light Ball"],
    "moves": ["Thunderbolt", "Quick Attack"]
  }
}
```

### Smogon Sets Format (Competitive)
```json
{
  "Pikachu": {
    "Life Orb": {
      "item": "Life Orb",
      "ability": "Static",
      "nature": "Naive",
      "evs": {"atk": 252, "spa": 4, "spe": 252},
      "moves": ["Volt Tackle", "Extreme Speed", "Iron Tail", "Knock Off"]
    },
    "Choice Band": {
      "item": "Choice Band",
      "ability": "Static",
      "nature": "Adamant",
      "evs": {"hp": 4, "atk": 252, "spe": 252},
      "moves": ["Volt Tackle", "Extreme Speed", "Iron Tail", "U-turn"]
    }
  }
}
```

## Configuration

The package uses a JSON configuration file located at `~/.cache/localsets/config.json`:

```json
{
    "update_interval_hours": 24,
    "enabled_randbats_formats": ["gen9randombattle", "gen8randombattle"],
    "enabled_smogon_formats": ["gen9ou", "gen8ou"],
    "auto_update": true,
    "cache_dir": "~/.cache/localsets"
}
```

## Data Sources

### RandBats Data
- **Source**: [pkmn/randbats](https://github.com/pkmn/randbats) repository
- **Raw Data**: `https://raw.githubusercontent.com/pkmn/randbats/main/data/`
- **API Metadata**: `https://api.github.com/repos/pkmn/randbats/contents/data`
- **Update Frequency**: Frequent (daily/weekly)

### Smogon Data
- **Source**: [pkmn/smogon](https://github.com/pkmn/smogon) repository
- **Raw Data**: `https://pkmn.github.io/smogon/data/sets/`
- **Update Frequency**: Infrequent (monthly/seasonal)
- **Bundled**: Data is bundled at build time, no runtime updates

## Caching

- **Cache Directory**: `~/.cache/localsets/` (configurable)
- **RandBats Data Files**: `{format_name}.json`
- **RandBats Metadata Files**: `{format_name}_metadata.json`
- **Smogon Data Files**: Bundled in package, no caching
- **Update Tracking**: `last_update` timestamp file (RandBats only)

## Error Handling

The package includes robust error handling:

- **Network Failures**: Graceful fallback to bundled data
- **Invalid JSON**: Skip corrupted files and continue
- **Missing Data**: Create empty data structures
- **Update Failures**: Continue with existing data
- **Smogon 404s**: Skip unavailable formats during build

## Performance

- **Lazy Loading**: Only load requested formats into memory
- **Caching**: Store updated RandBats data locally for fast access
- **Efficient Updates**: Only download changed RandBats files
- **Memory Management**: Automatic cleanup of unused data
- **Static Smogon Data**: No runtime network requests for Smogon data

## Development

### Building from Source

```bash
git clone <repository>
cd localsets
pip install -e .
```

### Running Tests

```bash
python -m pytest tests/
```

### Building Package

```bash
python setup.py build
python setup.py sdist bdist_wheel
```

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## Acknowledgments

- RandBats data sourced from [pkmn/randbats](https://github.com/pkmn/randbats)
- Smogon data sourced from [pkmn/smogon](https://github.com/pkmn/smogon)
- Built with Python 3.8+ compatibility
- Uses Click for CLI and Rich for beautiful output 
