class Oakdex::Pokedex::PokemonImporter

Handles Pokemon Import

Public Class Methods

new(custom_pokemon) click to toggle source
# File lib/oakdex/pokedex/pokemon_importer.rb, line 7
def initialize(custom_pokemon)
  pokemon_list = if custom_pokemon.is_a?(Array)
                   custom_pokemon
                 else
                   JSON.parse(custom_pokemon)
                 end
  @pokemon = pokemon_list.map do |p|
    p.is_a?(Hash) ? p : JSON.parse(p)
  end
end

Public Instance Methods

import!() click to toggle source
# File lib/oakdex/pokedex/pokemon_importer.rb, line 18
def import!
  validate!
  Oakdex::Pokedex::Pokemon.add_to_all(@pokemon)
end

Private Instance Methods

available_pokemon() click to toggle source
# File lib/oakdex/pokedex/pokemon_importer.rb, line 44
def available_pokemon
  Pokemon.all.keys + @pokemon.map { |p| pokemon_name(p) }.compact
end
pokemon_name(data) click to toggle source
# File lib/oakdex/pokedex/pokemon_importer.rb, line 48
def pokemon_name(data)
  data.dig('names', 'en') ? data['names']['en'] : nil
end
schema() click to toggle source
# File lib/oakdex/pokedex/pokemon_importer.rb, line 36
def schema
  @schema ||= JSON.parse(File.read(schema_path)).tap do |schema|
    schema['properties']['national_id']['minimum'] = 10_001
    schema['properties']['national_id'].delete('maximum')
    schema['definitions']['pokemon']['enum'] = [nil] + available_pokemon
  end
end
schema_path() click to toggle source
# File lib/oakdex/pokedex/pokemon_importer.rb, line 52
def schema_path
  "#{Oakdex::Pokedex.data_dir}/schemas/pokemon.json"
end
validate!() click to toggle source
# File lib/oakdex/pokedex/pokemon_importer.rb, line 25
def validate!
  @pokemon.each do |p|
    begin
      JSON::Validator.validate!(schema, p)
    rescue JSON::Schema::ValidationError => e
      pname = pokemon_name(p) || 'Unknown'
      raise InvalidPokemonError, "Invalid #{pname}: #{e.message}"
    end
  end
end