├── lib ├── we-call.rb └── we │ ├── call │ ├── version.rb │ ├── middleware.rb │ ├── middleware │ │ ├── server.rb │ │ └── server │ │ │ └── log_user_agent.rb │ ├── configuration.rb │ └── connection.rb │ └── call.rb ├── .coveralls.yml ├── .rspec ├── Gemfile ├── Rakefile ├── script ├── cibuild └── publish_gem ├── bin ├── setup └── console ├── .gitignore ├── spec ├── spec_helper.rb ├── unit │ └── we │ │ ├── call_spec.rb │ │ └── call │ │ ├── middleware │ │ └── server │ │ │ └── log_user_agent_spec.rb │ │ ├── configuration_spec.rb │ │ └── connection_spec.rb ├── integration │ └── we │ │ └── call │ │ └── connection_spec.rb └── cassettes │ └── vileplume.yml ├── .github └── workflows │ └── build.yml ├── .travis.yml ├── Appraisals ├── .circleci └── config.yml ├── LICENSE ├── we-call.gemspec ├── CHANGELOG.md └── README.md /lib/we-call.rb: -------------------------------------------------------------------------------- 1 | require 'we/call' 2 | -------------------------------------------------------------------------------- /.coveralls.yml: -------------------------------------------------------------------------------- 1 | service_name: circleci 2 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --format documentation 2 | --color 3 | -------------------------------------------------------------------------------- /lib/we/call/version.rb: -------------------------------------------------------------------------------- 1 | module We 2 | module Call 3 | VERSION = "0.12.1" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | ruby '~> 2.2' 4 | 5 | # Specify your gem's dependencies in we-call.gemspec 6 | gemspec 7 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | require "rspec/core/rake_task" 3 | 4 | RSpec::Core::RakeTask.new(:spec) 5 | 6 | task :default => :spec 7 | -------------------------------------------------------------------------------- /script/cibuild: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | cd "$(dirname "$0")/.." 4 | 5 | bundle install 6 | bundle exec appraisal install 7 | bundle exec appraisal rspec 8 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | IFS=$'\n\t' 4 | set -vx 5 | 6 | bundle install 7 | 8 | # Do any other automated setup that you need to do here 9 | -------------------------------------------------------------------------------- /lib/we/call/middleware.rb: -------------------------------------------------------------------------------- 1 | module We 2 | module Call 3 | module Middleware 4 | autoload :Server, 'we/call/middleware/server' 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.idea 3 | /.yardoc 4 | /Gemfile.lock 5 | /_yardoc/ 6 | /coverage/ 7 | /doc/ 8 | /gemfiles/ 9 | /pkg/ 10 | /spec/reports/ 11 | /tmp/ 12 | .byebug_history 13 | we-call-*.gem 14 | -------------------------------------------------------------------------------- /lib/we/call/middleware/server.rb: -------------------------------------------------------------------------------- 1 | module We 2 | module Call 3 | module Middleware 4 | module Server 5 | autoload :LogUserAgent, 'we/call/middleware/server/log_user_agent' 6 | end 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "bundler/setup" 4 | require "we/call" 5 | 6 | # You can add fixtures and/or initialization code here to make experimenting 7 | # with your gem easier. You can also use a different console, if you like. 8 | 9 | # (If you use this, don't forget to add pry to your Gemfile!) 10 | # require "pry" 11 | # Pry.start 12 | 13 | require "irb" 14 | IRB.start 15 | -------------------------------------------------------------------------------- /lib/we/call/configuration.rb: -------------------------------------------------------------------------------- 1 | require 'faraday' 2 | require 'faraday_middleware' 3 | 4 | module We 5 | module Call 6 | class Configuration 7 | attr_accessor :app_env, :app_env_header, :app_name, :app_name_header, :detect_deprecations, 8 | :retry, :retry_options 9 | 10 | def initialize 11 | @app_env_header = 'X-App-Env' 12 | @app_name_header = 'X-App-Name' 13 | @retry = true 14 | @retry_options = {} 15 | end 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) 2 | 3 | require 'coveralls' 4 | require 'simplecov' 5 | 6 | SimpleCov.formatters = [ 7 | SimpleCov::Formatter::HTMLFormatter, 8 | Coveralls::SimpleCov::Formatter 9 | ] 10 | SimpleCov.start do 11 | add_group 'lib', 'lib' 12 | end 13 | 14 | require 'vcr' 15 | VCR.configure do |config| 16 | config.cassette_library_dir = 'spec/cassettes' 17 | config.hook_into :faraday 18 | config.configure_rspec_metadata! 19 | end 20 | 21 | require 'rails' 22 | require 'we/call' 23 | -------------------------------------------------------------------------------- /script/publish_gem: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -eox pipefail 3 | 4 | mkdir -p ~/.gem 5 | echo :rubygems_api_key: $RUBYGEMS_APIKEY > ~/.gem/credentials 6 | chmod 0600 ~/.gem/credentials 7 | 8 | VERSION_FILE="lib/we/call/version.rb" 9 | if [[ -n $CIRCLE_TAG ]]; then 10 | # Determine the version from the tag; remove the leading v "v3.3.0" -> "3.3.0" 11 | VERSION=$(echo "${CIRCLE_TAG}" | sed 's/^v//') 12 | # Replace the version for the gemspec with the tag version 13 | sed -i.bak -E "s/VERSION = .*/VERSION = '$VERSION'/" $VERSION_FILE 14 | fi 15 | 16 | gem build *.gemspec 17 | 18 | gem push *.gem 19 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Ruby 2 | 3 | on: 4 | push: 5 | branches: [ $default-branch ] 6 | pull_request: 7 | branches: [ $default-branch ] 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - name: Set up Ruby 15 | uses: ruby/setup-ruby@v1 16 | with: 17 | ruby-version: 2.6 18 | - name: Install dependencies 19 | run: bundle install 20 | - name: Generate gemfiles 21 | run: bundle exec appraisal install 22 | - name: Run tests 23 | run: bundle exec appraisal rspec 24 | -------------------------------------------------------------------------------- /spec/unit/we/call_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | describe We::Call do 4 | it "has a version number" do 5 | expect(We::Call::VERSION).to be_a(String) 6 | end 7 | 8 | describe "#configure" do 9 | before do 10 | We::Call.configure do |config| 11 | config.app_name_header = 'X-Some-Other-Thing' 12 | end 13 | end 14 | 15 | it 'contains X-Some-Other-Thing header' do 16 | conn = We::Call::Connection.new(host: 'http://foo.com', app: 'pokedex', env: '123', timeout: 5) 17 | expect(conn.headers['X-Some-Other-Thing']).to eql('pokedex') 18 | end 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | before_install: 3 | - gem install bundler 4 | before_script: 5 | - appraisal install 6 | script: 7 | - bundle exec appraisal rspec 8 | gemfiles: 9 | - faraday_0.10.gemfile 10 | - faraday_0.11.gemfile 11 | - faraday_0.12.gemfile 12 | - faraday_0.13.gemfile 13 | - faraday_0.15.gemfile 14 | - faraday_0.14.gemfile 15 | - rails_4.2.gemfile 16 | - rails_5.0.gemfile 17 | - rails_5.1.gemfile 18 | - rails_5.2.gemfile 19 | rvm: 20 | - 2.2 21 | - 2.3 22 | - 2.4 23 | - 2.5 24 | - ruby-head 25 | matrix: 26 | allow_failures: 27 | - rvm: ruby-head 28 | fast_finish: true 29 | -------------------------------------------------------------------------------- /lib/we/call.rb: -------------------------------------------------------------------------------- 1 | require 'faraday' 2 | require 'faraday_middleware' 3 | require 'faraday-sunset' 4 | require 'typhoeus' 5 | 6 | module We 7 | module Call 8 | autoload :Connection, "we/call/connection" 9 | autoload :Configuration, "we/call/configuration" 10 | autoload :Middleware, "we/call/middleware" 11 | autoload :VERSION, "we/call/version" 12 | 13 | class << self 14 | attr_accessor :configuration 15 | end 16 | 17 | def self.configuration 18 | @configuration ||= Configuration.new 19 | end 20 | 21 | def self.configure 22 | yield(configuration) 23 | end 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /Appraisals: -------------------------------------------------------------------------------- 1 | appraise "faraday-0.15" do 2 | gem "faraday", "~> 0.15.0" 3 | end 4 | 5 | appraise "faraday-0.14" do 6 | gem "faraday", "~> 0.14.0" 7 | end 8 | 9 | appraise "faraday-0.13" do 10 | gem "faraday", "~> 0.13.0" 11 | end 12 | 13 | appraise "faraday-0.12" do 14 | gem "faraday", "~> 0.12.0" 15 | end 16 | 17 | appraise "faraday-0.11" do 18 | gem "faraday", "~> 0.11.0" 19 | end 20 | 21 | appraise "faraday-0.10" do 22 | gem "faraday", "~> 0.10.0" 23 | end 24 | 25 | appraise "rails-6.1" do 26 | gem "rails", "~> 6.1.0" 27 | end 28 | 29 | appraise "rails-6.0" do 30 | gem "rails", "~> 6.0.0" 31 | end 32 | 33 | appraise "rails-5.2" do 34 | gem "rails", "~> 5.2.0" 35 | end 36 | 37 | appraise "rails-5.1" do 38 | gem "rails", "~> 5.1.0" 39 | end 40 | 41 | appraise "rails-5.0" do 42 | gem "rails", "~> 5.0.0" 43 | end 44 | 45 | appraise "rails-4.2" do 46 | gem "rails", "~> 4.2.0" 47 | end 48 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | x-shared: &x-shared 4 | docker: 5 | - image: circleci/ruby:2.6.3-stretch-node 6 | 7 | jobs: 8 | build: 9 | <<: *x-shared 10 | steps: 11 | - checkout 12 | - run: 13 | name: Build 14 | command: ./script/cibuild 15 | - persist_to_workspace: 16 | root: . 17 | paths: . 18 | publish-gem: 19 | <<: *x-shared 20 | steps: 21 | - attach_workspace: 22 | at: ~/project # circleci default working directory 23 | - run: 24 | name: Publish Gem 25 | command: ./script/publish_gem 26 | workflows: 27 | version: 2 28 | build: 29 | jobs: 30 | - build: 31 | filters: 32 | tags: 33 | only: /v[0-9]+(\.[0-9]+)+/ 34 | - publish-gem: 35 | requires: 36 | - build 37 | filters: 38 | branches: 39 | ignore: 40 | - /.*/ 41 | tags: 42 | only: /v[0-9]+(\.[0-9]+)+/ 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 WeWork Projects 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/we/call/middleware/server/log_user_agent.rb: -------------------------------------------------------------------------------- 1 | module We 2 | module Call 3 | module Middleware 4 | module Server 5 | class LogUserAgent 6 | def initialize app 7 | @app = app 8 | end 9 | 10 | def call(env) 11 | line = "user_agent=#{env['HTTP_USER_AGENT']};" 12 | line += " app_name=#{env[incoming_app_name_header]};" if env[incoming_app_name_header] 13 | line += " app_env=#{env[incoming_app_env_header]};" if env[incoming_app_env_header] 14 | output(line) 15 | @app.call(env) 16 | end 17 | 18 | private 19 | 20 | def output(line) 21 | puts line 22 | end 23 | 24 | def config 25 | We::Call.configuration 26 | end 27 | 28 | def incoming_app_env_header 29 | @incoming_app_env_header ||= "HTTP_#{config.app_env_header.upcase.gsub!(/-/, '_')}" 30 | end 31 | 32 | def incoming_app_name_header 33 | @incoming_app_name_header ||= "HTTP_#{config.app_name_header.upcase.gsub!(/-/, '_')}" 34 | end 35 | end 36 | end 37 | end 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /spec/integration/we/call/connection_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | RSpec.describe We::Call::Connection do 4 | 5 | describe '#initialize', vcr: { cassette_name: 'vileplume' } do 6 | context 'without middlewares registered' do 7 | subject do 8 | described_class.new(host: 'http://pokeapi.co/api/v2/', app: 'pokedex', env: 'test', timeout: 5) 9 | end 10 | 11 | it 'has a string body' do 12 | response = subject.get('pokemon/45/') 13 | expect(response.body).to be_a String 14 | end 15 | 16 | it 'is JSON' do 17 | response = subject.get('pokemon/45/') 18 | expect(response.body).to match(/\"name\":\"vileplume\"/) 19 | end 20 | end 21 | 22 | context 'with json and hashie middlewares registered' do 23 | subject do 24 | described_class.new(host: 'http://pokeapi.co/api/v2/', app: 'pokedex', env: 'test', timeout: 5) do |conn| 25 | conn.response :mashify 26 | conn.response :json, content_type: /\bjson$/ 27 | end 28 | end 29 | 30 | it 'has a hash for a body' do 31 | response = subject.get('pokemon/45/') 32 | expect(response.body).to be_a Hash 33 | end 34 | 35 | it 'can access properties' do 36 | response = subject.get('pokemon/45/') 37 | expect(response.body).to include(name: 'vileplume') 38 | end 39 | end 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /spec/unit/we/call/middleware/server/log_user_agent_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | RSpec.describe We::Call::Middleware::Server::LogUserAgent do 4 | describe '#call' do 5 | let(:app_double) { double } 6 | let(:env) { { 'HTTP_USER_AGENT' => 'pokedex' } } 7 | 8 | subject { described_class.new(app_double) } 9 | 10 | before { allow(app_double).to receive(:call) } 11 | 12 | it 'will log user_agent' do 13 | expect(subject).to receive(:output).with("user_agent=pokedex;") 14 | subject.call(env) 15 | end 16 | 17 | context 'when X-App-Name provided' do 18 | let(:env_with_wework_app) { env.merge({ 'HTTP_X_APP_NAME' => 'pokedex' }) } 19 | 20 | it 'will log user_agent' do 21 | expect(subject).to receive(:output).with("user_agent=pokedex; app_name=pokedex;") 22 | subject.call(env_with_wework_app) 23 | end 24 | end 25 | 26 | context 'when X-App-Env provided' do 27 | let(:env_with_wework_env) { env.merge({ 'HTTP_X_APP_ENV' => 'test' }) } 28 | 29 | it 'will log user_agent' do 30 | expect(subject).to receive(:output).with("user_agent=pokedex; app_env=test;") 31 | subject.call(env_with_wework_env) 32 | end 33 | end 34 | 35 | context 'when X-App-Name and X-App-Env provided' do 36 | let(:env_with_wework_both) { env.merge({ 'HTTP_X_APP_NAME' => 'pokedex', 'HTTP_X_APP_ENV' => 'test' }) } 37 | 38 | it 'will log user_agent' do 39 | expect(subject).to receive(:output).with("user_agent=pokedex; app_name=pokedex; app_env=test;") 40 | subject.call(env_with_wework_both) 41 | end 42 | end 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /we-call.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path('../lib', __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require 'we/call/version' 5 | 6 | Gem::Specification.new do |spec| 7 | spec.name = "we-call" 8 | spec.version = We::Call::VERSION 9 | spec.authors = ["WeWork Engineering"] 10 | spec.email = ["engineering@wework.com"] 11 | 12 | spec.summary = "Making healthy, happy HTTP calls" 13 | spec.description = "Handles conventions of making calls to other services, with required metadata for tracking calls between services, deprecations of endpoints, trace IDs, throttling, etc." 14 | spec.homepage = "https://github.com/wework/we-call-gem" 15 | spec.licenses = ['MIT'] 16 | 17 | spec.files = `git ls-files -z`.split("\x0").reject do |f| 18 | f.match(%r{^(spec)/}) 19 | end 20 | spec.bindir = "bin" 21 | spec.require_paths = ["lib"] 22 | 23 | spec.add_dependency "typhoeus", "~> 1.3" 24 | spec.add_dependency "faraday", ">= 0.9.0", "< 1" 25 | spec.add_dependency "faraday_middleware", '~> 0.10' 26 | spec.add_dependency "faraday-sunset", '~> 0.2' 27 | 28 | spec.add_development_dependency "appraisal", "~> 2.0" 29 | spec.add_development_dependency "coveralls_reborn", '~> 0.13' 30 | spec.add_development_dependency "bundler", "~> 1.14" 31 | spec.add_development_dependency "rake", "~> 12.0" 32 | spec.add_development_dependency "rails", ">= 4.2" 33 | spec.add_development_dependency "rspec", "~> 3.5" 34 | spec.add_development_dependency "simplecov", '~> 0.15' 35 | spec.add_development_dependency "hashie", "~> 3.5" 36 | spec.add_development_dependency "vcr", '~> 4.0' 37 | end 38 | -------------------------------------------------------------------------------- /spec/unit/we/call/configuration_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | RSpec.describe We::Call::Configuration do 4 | 5 | describe "#app_env_header" do 6 | it "default value is X-App-Env" do 7 | expect(subject.app_env_header).to eql('X-App-Env') 8 | end 9 | end 10 | 11 | describe "#app_env_header=" do 12 | it "can set value" do 13 | subject.app_env_header = 'Some-Env-Header-Name' 14 | expect(subject.app_env_header).to eq('Some-Env-Header-Name') 15 | end 16 | end 17 | 18 | describe "#app_env=" do 19 | it "can set value" do 20 | subject.app_env = 'manual-env' 21 | expect(subject.app_env).to eq('manual-env') 22 | end 23 | end 24 | 25 | describe "#app_name=" do 26 | it "can set value" do 27 | subject.app_name = 'configured app name' 28 | expect(subject.app_name).to eq('configured app name') 29 | end 30 | end 31 | 32 | describe "#app_name_header" do 33 | it "default value is X-App-Name" do 34 | expect(subject.app_name_header).to eql('X-App-Name') 35 | end 36 | end 37 | 38 | describe "#app_name_header=" do 39 | it "can set value" do 40 | subject.app_name_header = 'Some-Header-Name' 41 | expect(subject.app_name_header).to eq('Some-Header-Name') 42 | end 43 | end 44 | 45 | describe "#detect_deprecations" do 46 | it "default value is nil" do 47 | expect(subject.detect_deprecations).to be_nil 48 | end 49 | end 50 | 51 | describe "#detect_deprecations=" do 52 | it "can set value" do 53 | subject.detect_deprecations = true 54 | expect(subject.detect_deprecations).to be true 55 | end 56 | end 57 | 58 | describe "#retry" do 59 | it "can set value" do 60 | subject.retry = true 61 | expect(subject.retry).to be true 62 | end 63 | end 64 | 65 | describe "#retry_options=" do 66 | it "can set value" do 67 | subject.retry_options = { max: 5 } 68 | expect(subject.retry_options).to eq({ max: 5 }) 69 | end 70 | end 71 | end 72 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](http://keepachangelog.com/) 6 | and this project adheres to [Semantic Versioning](http://semver.org/). 7 | 8 | ## [v0.12.1] - 2021-06-11 9 | ### Fixed 10 | - Change the method to guess `rails_app_name` to work correctly across different Rails versions 11 | 12 | ## [v0.12.0] - 2020-12-17 13 | ### Added 14 | - Bump version to fix incorrect tag 15 | 16 | ## [v0.11.0] - 2020-12-08 17 | ### Added 18 | - Allow to set retry options on a connection([#36]) 19 | 20 | 21 | ## [v0.9.1] - 2020-11-20 22 | ### Added 23 | - Automatically retry on network errors([#31]) 24 | 25 | [activesupport]: https://github.com/rails/rails/tree/master/activesupport 26 | [#31]: https://github.com/wework/we-call-gem/pull/31 27 | 28 | ## [v0.9.0] - 2018-09-18 29 | ### Added 30 | - Automatically reports deprecations to ActiveSupport if [activesupport] gem exists ([#21]) 31 | - Defaults detect_deprecations to nil instead of :active_support 32 | 33 | [activesupport]: https://github.com/rails/rails/tree/master/activesupport 34 | [#21]: https://github.com/wework/we-call-gem/pull/21 35 | 36 | ## [v0.8.0] - 2018-08-27 37 | ### Added 38 | - Support for Ruby v2.5 39 | - Support for Rails v5.2 40 | - Support for Faraday v0.14 and v0.15 41 | - Automatically reports deprecations to Rollbar if [rollbar] gem exists ([#17]) 42 | 43 | [rollbar]: https://github.com/rollbar/rollbar-gem 44 | [#17]: https://github.com/wework/we-call-gem/pull/17 45 | 46 | ### Breaking 47 | - Dropped support for Faraday v0.9 (may still work but its no longer tested or recommended) 48 | 49 | ## [v0.7.1] - 2018-02-20 50 | ### Fixed 51 | - Call the gzip middleware to handle gzipped responses, which have been broken since v0.7 for typhoeus users 52 | 53 | ## [v0.7.0] - 2017-10-07 54 | ### Breaking Changes 55 | - Removed `We::Call::Deprecated` and `We::Call::Annotations`. Deprecation logic is now handled by [rails-sunset] instead. I fully understand the irony of removing deprecation logic without deprecation 56 | 57 | [rails-sunset]: https://github.com/wework/rails-sunset 58 | 59 | ## [v0.6.1] - 2017-10-03 60 | ### Fixed 61 | - Required typhoeus in We::Call instead of connection, which loads it early enough for NewRelic tracing to kick in if you use that 62 | 63 | ### Changed 64 | - Reduced open timeout default to 1 second 65 | 66 | ## [v0.6.0] 67 | ### Changed 68 | - Use typhoeus instead of NetHTTP for a [series of reasons] 69 | 70 | [typhoeus]: https://github.com/typhoeus/typhoeus 71 | [series of reasons]: https://github.com/wework/we-call-gem/pull/7 72 | 73 | ## [v0.5.4] 74 | ### Fixed 75 | - Connection checks `Rails.env` instead of `ENV['RAILS_ENV']` as most people dont have RAILS_ENV in their `.env` file 76 | 77 | ## [v0.5.3] 78 | 79 | ### Fixed 80 | - Deprecations were calling a private method and failing 81 | 82 | ## [v0.5.2] 83 | 84 | ### Fixed 85 | - Made Annotations require "ruby_decorators" 86 | 87 | ## [v0.5.1] 88 | 89 | ### Changed 90 | - Switched `config.detect_deprecations` from bool to expect `:active_support` or logger instance 91 | - Moved `We::Call::Middleware::Client::DetectDeprecations` into its own [faraday-sunset] gem (no BC breaks) 92 | 93 | [faraday-sunset]: https://github.com/wework/faraday-sunset 94 | 95 | ## [v0.5.0] 96 | 97 | ### Added 98 | - Configurable `We::Call.configure` which accepts a config block 99 | - Config option `config.app_name` to avoid providing `app:` in every connection initializer 100 | - Added the concept of Annotations. Simply `extend We::Call::Annotations` in a base controller to get cool stuff 101 | - First annotation: `We::Call::Deprecated` added to mark controller methods as deprecated 102 | - Added `We::Call::Middleware::Client::DetectDeprecations` that automatically registers as a faraday response middleware to report deprecated endpoints 103 | 104 | ### Changed 105 | - Defaults to setting `X-App-Name` instead of `X-WeWork-App` (override with config.app_name_header) 106 | - Defaults to setting `X-App-Env` instead of `X-WeWork-Env` (override with config.app_env_header) 107 | 108 | ### Fixed 109 | - Switched from manually requiring to using module autoload to reduce memory footprint 110 | 111 | ## [v0.4.2] 112 | 113 | ### Fixed 114 | - Manually setting `conn.adapter` would result in double adapters (two requests made!) 115 | 116 | ## [v0.4.1] 117 | 118 | ### Fixed 119 | - Improved support for Faraday 0.8 - 0.9. 120 | 121 | ## [v0.4.0] 122 | 123 | ### Added 124 | - `We::Call::Connection.new` requires `timeout: 1` where 1 is seconds. 125 | - `We::Call::Connection.new` accepts `open_timeout: 1` where 1 is seconds. 126 | -------------------------------------------------------------------------------- /lib/we/call/connection.rb: -------------------------------------------------------------------------------- 1 | require 'typhoeus/adapters/faraday' 2 | 3 | module We 4 | module Call 5 | module Connection 6 | extend self 7 | 8 | # If your network isn't stable enough to get a sign of life in 1s then you should look into that 9 | # Or override this default on creating the connection. 10 | OPEN_TIMEOUT = 1 11 | 12 | # We use typhoeus instead of default NetHTTP so we can control how many retries are made 13 | # https://github.com/lostisland/faraday/issues/612 14 | DEFAULT_ADAPTER_CLASS = Faraday::Adapter::Typhoeus 15 | DEFAULT_ADAPTER = :typhoeus 16 | 17 | DEFAULT_RETRY_OPTIONS = { 18 | max: 3, 19 | interval: 1, 20 | exceptions: [Faraday::ConnectionFailed, Faraday::TimeoutError] 21 | } 22 | 23 | class MissingApp < ArgumentError; end 24 | class MissingEnv < ArgumentError; end 25 | class MissingTimeout < ArgumentError; end 26 | class MissingOpenTimeout < ArgumentError; end 27 | 28 | QueryableBuilder = Class.new(Faraday::RackBuilder) do 29 | def adapter? 30 | @adapter || false 31 | end 32 | 33 | def adapter(key, *args, &block) 34 | super 35 | @adapter = key 36 | end 37 | 38 | def get_adapter 39 | @adapter || DEFAULT_ADAPTER 40 | end 41 | end 42 | 43 | # @param [Object] host 44 | # @param [Integer] timeout 45 | # @param [Integer] open_timeout 46 | # @param [String] app 47 | # @param [String] env 48 | # @yieldparam [Faraday::Connection] Faraday connection object is yielded to a block 49 | def new(host:, timeout: nil, open_timeout: OPEN_TIMEOUT, app: guess_app, env: guess_env, retry_options: {}, &block) 50 | @host = host 51 | @retry_options = retry_options 52 | @app = app or raise_missing_app! 53 | @env = env or raise_missing_env! 54 | @timeout = timeout or raise_missing_timeout! 55 | @open_timeout = open_timeout or raise_missing_open_timeout! 56 | create(&block) 57 | end 58 | 59 | private 60 | 61 | attr_reader :app, :env, :host, :timeout, :open_timeout, :retry_options 62 | 63 | # @return [Faraday::Connection] Preconfigured Faraday Connection object, for hitting get, post, etc. 64 | def create 65 | builder = QueryableBuilder.new(&Proc.new { |_| }) 66 | 67 | headers = { 68 | 'User-Agent' => app, 69 | config.app_name_header => app, 70 | config.app_env_header => env, 71 | } 72 | 73 | request = { 74 | timeout: timeout, 75 | open_timeout: open_timeout 76 | } 77 | 78 | Faraday.new(host, builder: builder, headers: headers, request: request) do |faraday| 79 | if config.detect_deprecations 80 | faraday.response :sunset, setup_sunset_middleware(faraday) 81 | end 82 | if should_retry? 83 | faraday.request :retry, fetch_retry_options 84 | end 85 | 86 | yield faraday if block_given? 87 | 88 | unless adapter_handles_gzip?(faraday.builder.get_adapter) 89 | faraday.use :gzip 90 | end 91 | 92 | faraday.adapter DEFAULT_ADAPTER unless faraday.builder.adapter? 93 | end 94 | end 95 | 96 | def config 97 | We::Call.configuration 98 | end 99 | 100 | def raise_missing_app! 101 | raise MissingApp, 'app must be set, e.g: pokedex' 102 | end 103 | 104 | def raise_missing_env! 105 | raise MissingEnv, 'env must be set, e.g: staging' 106 | end 107 | 108 | def raise_missing_timeout! 109 | raise MissingTimeout, 'timeout must be set, maybe 5 (seconds) would be a good value. This is the open & read timeout, a.k.a max response time.' 110 | end 111 | 112 | def raise_missing_open_timeout! 113 | raise MissingOpenTimeout, 'open_timeout must be set, and defaults to 1 second. This is the time until a connection is established with another server, and after 1 sec it\'s probably not there.' 114 | end 115 | 116 | # @return [Boolean] Does the adapter handle gzip automatically or not 117 | # https://github.com/lostisland/faraday_middleware/blob/master/lib/faraday_middleware/gzip.rb#L9 118 | def adapter_handles_gzip?(adapter) 119 | [:em_http, :net_http, :net_http_persistent].include?(adapter) 120 | end 121 | 122 | def setup_sunset_middleware(faraday) 123 | options = { rollbar: :auto, active_support: :auto } 124 | # Pass something that might be a logger or anything with a warn method 125 | if config.detect_deprecations.respond_to?(:warn) 126 | options = options.merge({ logger: config.detect_deprecations }) 127 | end 128 | options 129 | end 130 | 131 | def should_retry? 132 | retry_options.any? || config.retry 133 | end 134 | 135 | def fetch_retry_options 136 | client_options = retry_options.any? ? retry_options : config.retry_options 137 | 138 | DEFAULT_RETRY_OPTIONS.merge(client_options) do |key, default_val, new_val| 139 | if key == :exceptions 140 | default_val + Array(new_val) 141 | else 142 | new_val 143 | end 144 | end 145 | end 146 | 147 | # @return [String] Environment (usually 'development', 'staging', 'production', etc.) 148 | def guess_env 149 | return config.app_env if config.app_env 150 | ENV['RACK_ENV'] || rails_app_env 151 | end 152 | 153 | # @return [String] Check for config.app_name, or detect name from Rails application 154 | def guess_app 155 | return config.app_name if config.app_name 156 | ENV['APP_NAME'] || rails_app_name 157 | end 158 | 159 | def rails_app_env 160 | ::Rails.env if (defined? ::Rails) 161 | end 162 | 163 | def rails_app_name 164 | if (defined? ::Rails) && !::Rails.application.nil? 165 | ::Rails.application.class.name.deconstantize.underscore.dasherize 166 | end 167 | end 168 | end 169 | end 170 | end 171 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # We::Call 2 | 3 | [![Build Status][ci-image]][ci-url] 4 | [![Coverage Status][coveralls-image]][coveralls-url] 5 | [![MIT License][license-image]][license-url] 6 | 7 | ![Call me Maybe](https://cloud.githubusercontent.com/assets/67381/25590846/0c3145ea-2e80-11e7-9166-76448e0134a8.jpeg) 8 | 9 | Requires metadata and offers client/server middleware to help debug HTTP calls, raise warnings for deprecations, supporting trace IDs, etc. 10 | 11 | It aims to arm API developers and users with tools to make their calls more robust, and enforces Good Ideas™ with sane defaults whenever possible. 12 | 13 | ## Goals 14 | 15 | - Work just like Faraday out of the box 16 | - Remove some of the guesswork that comes with HTTP service orientated architecures 17 | - Provide sane defaults whenever possible, but ask for more information if required 18 | - Facilitate [HTTP Evolution](https://www.mnot.net/blog/2012/12/04/api-evolution.html) 19 | 20 | ## Usage 21 | 22 | 23 | ```ruby 24 | gem 'we-call' 25 | ``` 26 | 27 | ```ruby 28 | # config/initializers/we-call.rb 29 | 30 | We::Call.configure do |config| 31 | config.app_name = 'service-a' # default nil (Connection class falls back to APP_NAME or Rails name) 32 | config.app_env = 'staging' # default nil (Connection class back to RACK_ENV || RAILS_ENV) 33 | config.detect_deprecations = false # default true 34 | end 35 | ``` 36 | 37 | As this is a Faraday wrapper, the only thing that will change from normal Faraday usage is initialization. 38 | 39 | ```ruby 40 | connection = We::Call::Connection.new(host: 'https://some-service.example.com/', timeout: 2) 41 | 42 | # or with a Faraday connection block 43 | connection = We::Call::Connection.new(host: 'https://some-service.example.com/', timeout: 2) do |conn| 44 | conn.token_auth('abc123token') 45 | conn.headers['Foo'] = 'bar' 46 | end 47 | ``` 48 | 49 | See more connection block options in the [Faraday documentation](https://github.com/lostisland/faraday). 50 | 51 | ### Provide an App 52 | 53 | An application should provide its own name in the user agent when calling other services. This is important in case this app busts a local cache, causing it to stampeding herd other service(s). 54 | 55 | Other services need to know which server is causing the problem, so no connections are allowed through `We::Call` without an app being set. 56 | 57 | ```ruby 58 | # Provided at config 59 | connection = We::Call.configure do |config| 60 | config.app_name = 'Service A' 61 | end 62 | 63 | # Provided at initialization 64 | connection = We::Call::Connection.new(host: 'https://service-b.example.com/', app: 'Service A', timeout: 2) 65 | ``` 66 | 67 | _Ofc services could lie about this, so do not use App Name for any sort of security. For that you need to use tokens assigned to applications. This is essentially just forcing a user agent._ 68 | 69 | ### Provide an Env 70 | 71 | ```ruby 72 | # Provided at config 73 | connection = We::Call.configure do |config| 74 | config.app_env = 'staging' 75 | end 76 | 77 | # Provided at initialization 78 | connection = We::Call::Connection.new(host: 'https://service-b.example.com/', env: 'staging', timeout: 2) 79 | ``` 80 | 81 | Not only is knowing the app name important, but knowing the env is necessary too. Sometimes people configure stuff wrong, and Service A (staging) will hit Service B (production) 😨. 82 | 83 | If you are using Rack or Rails, you should not need to do this, as it'll use RACK_ENV or RAILS_ENV by default. 84 | 85 | ### Timeouts 86 | 87 | By default Faraday will let HTTP calls go on forever. In reality this is often 30 seconds for e.g: a Heroku app. Asking developers to make a choice about how long they're willing to wait on this call gives them a chance to consider an acceptable timeout. 88 | 89 | The lower this number can be the better, as it reduces time web threads spend waiting for calls that are unlikely to respond anyway. 90 | 91 | ```ruby 92 | # Provided at initialization 93 | connection = We::Call::Connection.new(host: 'https://service-b.example.com/', timeout: 2) 94 | ``` 95 | 96 | Timeouts can only be provided at initialization of a connection, as they should be different for each service. This is down to the sad reality that some internal services are more performant than others, and various third-parties will have different SLAs. 97 | 98 | As well as `timeout: num_seconds` which can set the entire open/read (essentially the total response time of the server), another optional argument exists for `open_timeout: numseconds`. This is how long We::Call should spend waiting for a vague sign of life from the server, which by default is 1. 99 | 100 | 101 | ## Middleware 102 | 103 | ### Client 104 | 105 | **Retry** 106 | 107 | Automatically enabled, the retry middleware will retry the request in case of network errors. By default, the middleware will retry up to 3 times, waiting 1 second between the retries. 108 | 109 | Disable the middleware: 110 | 111 | ```ruby 112 | We::Call.configure do |config| 113 | config.retry = false 114 | end 115 | 116 | # Provided at initialization 117 | connection = We::Call::Connection.new(retry_options: false) 118 | ``` 119 | 120 | Adjust the middleware: 121 | 122 | ```ruby 123 | We::Call.configure do |config| 124 | config.retry_options = { interval: 0.5 } 125 | end 126 | 127 | # Provided at initialization 128 | connection = We::Call::Connection.new(retry_options: { interval: 0.5 }) 129 | ``` 130 | 131 | The gem smartly merges the options passed, so you can specify your own list of exceptions without being afraid to override the default ones: 132 | 133 | ```ruby 134 | We::Call.configure do |config| 135 | config.retry_options = { exceptions: [Faraday::ResourceNotFound] } 136 | end 137 | ``` 138 | 139 | Check [Faraday's Retry Docs](https://github.com/lostisland/faraday/blob/master/docs/middleware/request/retry.md) for a list of available options. 140 | 141 | **DetectDeprecations** 142 | 143 | Automatically enabled, the faraday-sunset middleware will watch for the [Sunset header](https://tools.ietf.org/html/draft-wilde-sunset-header-03) and send warning to `ActiveSupport::Deprecation` if enabled, or to whatever is in `ENV['rake.logger']`. 144 | 145 | [faraday-sunset]: https://github.com/wework/faraday-sunset 146 | 147 | ### Server 148 | 149 | **LogUserAgent** 150 | 151 | _(Optional)_ Log the User Agent, which might just be browser information (merely kinda handy), or could be an app name, like the one `We::Call::Connection` asks you for. 152 | 153 | ```ruby 154 | config.middleware.insert_after Rails::Rack::Logger, We::Call::Middleware::Server::LogUserAgent 155 | ``` 156 | 157 | Easy! Check your logs for `user_agent=service-name; app_name=service-name;` The `app_name` will only show up if this was called by `We::Call::Connection` (as this is the only thing setting the `X-App-Name` header.) 158 | 159 | ## Requirements 160 | 161 | - **Ruby:** v2.2 - v2.5 162 | - **Faraday:** v0.10 - v0.15 163 | 164 | _**Note:** Other versions of Faraday may work, but we can't test against all of them forever._ 165 | 166 | ## TODO 167 | 168 | - [x] Split DetectDeprecations into standalone [faraday-sunset] gem 169 | - [ ] Work on sane defaults for retries and error raising 170 | 171 | 172 | ## Testing 173 | 174 | To run tests and modify locally, you'll want to `bundle install` in this directory. 175 | 176 | ``` 177 | bundle exec appraisal rspec 178 | ``` 179 | 180 | ## Development 181 | 182 | If you want to test this gem within an application, update your Gemfile to have something like this: `gem 'we-call', github: 'wework/we-call-gem', branch: 'BRANCHNAME'` and set your local config: `bundle config --local local.we-call path/to/we-call-gem` 183 | 184 | Simply revert the Gemfile change (updating the version as necessary!) and remove the config with `bundle config --delete local.we-call`. 185 | 186 | References: [Blog Post](https://rossta.net/blog/how-to-specify-local-ruby-gems-in-your-gemfile.html) and [Bundle Documentation](https://bundler.io/v1.2/git.html#local) 187 | 188 | ## Contributing 189 | 190 | Bug reports and pull requests are welcome on GitHub at [wework/we-call](https://github.com/wework/we-call). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. 191 | 192 | 193 | [coveralls-image]:https://coveralls.io/repos/github/wework/we-call-gem/badge.svg?branch=master 194 | [coveralls-url]:https://coveralls.io/github/wework/we-call-gem?branch=main 195 | 196 | [ci-url]:https://app.circleci.com/pipelines/github/wework/we-call-gem 197 | [ci-image]:https://circleci.com/gh/wework/we-call-gem.svg?style=shield 198 | 199 | [license-url]: LICENSE 200 | [license-image]: http://img.shields.io/badge/license-MIT-000000.svg?style=flat-square 201 | -------------------------------------------------------------------------------- /spec/unit/we/call/connection_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | RSpec.describe We::Call::Connection do 4 | DEFAULT_MIDDLEWARES = [FaradayMiddleware::Gzip, Faraday::Sunset, Faraday::Request::Retry] 5 | 6 | describe '#initialize' do 7 | context 'when host is missing' do 8 | it 'raises ArgumentError' do 9 | expect { subject.new }.to raise_error(ArgumentError) 10 | end 11 | end 12 | 13 | context 'when app is missing' do 14 | subject { described_class.new(host: 'http://foo.com') } 15 | 16 | it 'raises We::Call::Connection::MissingApp' do 17 | expect { subject }.to raise_error(We::Call::Connection::MissingApp) 18 | end 19 | end 20 | 21 | context 'when timeout is missing' do 22 | subject { described_class.new(host: 'http://foo.com', app: 'foo', env: 'test') } 23 | 24 | it 'raises We::Call::Connection::MissingTimeout' do 25 | expect { subject }.to raise_error(We::Call::Connection::MissingTimeout) 26 | end 27 | end 28 | 29 | context 'when open_timeout is nilled somehow' do 30 | subject { described_class.new(host: 'http://foo.com', app: 'foo', env: 'test', timeout: 5, open_timeout: nil) } 31 | 32 | it 'raises We::Call::Connection::MissingOpenTimeout' do 33 | expect { subject }.to raise_error(We::Call::Connection::MissingOpenTimeout) 34 | end 35 | end 36 | 37 | context 'when all arguments are set other than env' do 38 | subject { described_class.new(host: 'http://foo.com', app: 'pokedex', timeout: 5) } 39 | 40 | context 'and it is guessable' do 41 | before { allow_any_instance_of(described_class).to receive(:guess_env) { 'test' } } 42 | 43 | it { is_expected.to be } 44 | end 45 | 46 | context 'and it is NOT guessable' do 47 | before { allow_any_instance_of(described_class).to receive(:guess_env) { nil } } 48 | 49 | it 'raises We::Call::Connection::MissingEnv' do 50 | expect { subject }.to raise_error(We::Call::Connection::MissingEnv) 51 | end 52 | end 53 | end 54 | end 55 | 56 | context 'when valid arguments are provided' do 57 | let(:valid_arguments) { { host: 'http://foo.com', app: 'pokedex', env: 'test', timeout: 5 } } 58 | 59 | subject { described_class.new(**valid_arguments) } 60 | 61 | it { is_expected.to be } 62 | 63 | it 'contains User-Agent header' do 64 | expect(subject.headers['User-Agent']).to eql('pokedex') 65 | end 66 | 67 | it 'contains X-App-Name header' do 68 | expect(subject.headers['X-App-Name']).to eql('pokedex') 69 | end 70 | 71 | it 'contains X-App-Env header' do 72 | expect(subject.headers['X-App-Env']).to eql('test') 73 | end 74 | 75 | it 'contains timeout option' do 76 | expect(subject.options[:timeout]).to eql(valid_arguments[:timeout]) 77 | end 78 | 79 | it 'contains open_timeout option' do 80 | expect(subject.options[:open_timeout]).to eql(described_class::OPEN_TIMEOUT) 81 | end 82 | 83 | context 'when open_timeout is passed' do 84 | let(:valid_arguments_with_open_timeout) { valid_arguments.merge(open_timeout: 2) } 85 | 86 | subject { described_class.new(**valid_arguments_with_open_timeout) } 87 | 88 | it 'contains open_timeout option' do 89 | expect(subject.options[:open_timeout]).to eql(valid_arguments_with_open_timeout[:open_timeout]) 90 | end 91 | end 92 | 93 | context 'when app needs to be guessed' do 94 | before do 95 | allow(Rails).to receive(:application).and_return(app_class.new) 96 | end 97 | 98 | let(:valid_arguments_without_app) { valid_arguments.tap { |h| h.delete(:app) } } 99 | let(:app_class) { stub_const('WeCallTest::Application', Class.new) } 100 | 101 | subject { described_class.new(**valid_arguments_without_app) } 102 | 103 | it 'contains X-App-Name header' do 104 | expect(subject.headers['X-App-Name']).to eql('we-call-test') 105 | end 106 | 107 | context 'when app has only one segment' do 108 | let(:app_class) { stub_const('Test::Application', Class.new) } 109 | 110 | it 'contains X-App-Name header' do 111 | expect(subject.headers['X-App-Name']).to eql('test') 112 | end 113 | end 114 | end 115 | 116 | context 'with custom block' do 117 | subject do 118 | described_class.new(**valid_arguments) do |faraday| 119 | faraday.headers['Foo'] = 'bar' 120 | end 121 | end 122 | 123 | it 'sets custom headers' do 124 | expect(subject.headers).to include('Foo' => 'bar') 125 | end 126 | end 127 | 128 | context 'adapter configuration' do 129 | let(:handlers) { subject.builder.handlers.map(&:klass) } 130 | 131 | context 'when no adapter is specified' do 132 | 133 | before do 134 | We::Call::configuration.detect_deprecations = true 135 | end 136 | 137 | subject do 138 | described_class.new(host: 'http://pokeapi.co/api/v2/', app: 'pokedex', env: 'test', timeout: 5) 139 | end 140 | 141 | it 'should have the default adapter' do 142 | expect(handlers).to match_array( 143 | [described_class::DEFAULT_ADAPTER_CLASS].concat(DEFAULT_MIDDLEWARES) 144 | ) 145 | end 146 | end 147 | 148 | context 'when default adapter is specified' do 149 | subject do 150 | described_class.new(host: 'http://pokeapi.co/api/v2/', app: 'pokedex', env: 'test', timeout: 5) do |conn| 151 | conn.adapter described_class::DEFAULT_ADAPTER 152 | end 153 | end 154 | 155 | it 'is not repeated adapter handler' do 156 | expect(handlers).to match_array( 157 | [described_class::DEFAULT_ADAPTER_CLASS].concat(DEFAULT_MIDDLEWARES) 158 | ) 159 | end 160 | end 161 | 162 | context 'when :net_http adapter is specified' do 163 | subject do 164 | described_class.new(host: 'http://pokeapi.co/api/v2/', app: 'pokedex', env: 'test', timeout: 5) do |conn| 165 | conn.adapter :net_http 166 | end 167 | end 168 | 169 | it 'specifies NetHttp adapter handler' do 170 | expect(handlers).to include(Faraday::Adapter::NetHttp) 171 | end 172 | 173 | it 'skips FaradayMiddleware::Gzip' do 174 | expect(handlers).to_not include(FaradayMiddleware::Gzip) 175 | end 176 | end 177 | 178 | context 'when :net_http_persistent adapter is specified' do 179 | subject do 180 | described_class.new(host: 'http://pokeapi.co/api/v2/', app: 'pokedex', env: 'test', timeout: 5) do |conn| 181 | conn.adapter :net_http_persistent 182 | end 183 | end 184 | 185 | it 'specifies NetHttpPersistent adapter handler' do 186 | expect(handlers).to include(Faraday::Adapter::NetHttpPersistent) 187 | end 188 | 189 | it 'skips FaradayMiddleware::Gzip' do 190 | expect(handlers).to_not include(FaradayMiddleware::Gzip) 191 | end 192 | end 193 | 194 | context 'when detect deprecations is truthy' do 195 | let(:builder_spy) { spy('QueryableBuilder') } 196 | 197 | before do 198 | We::Call::configuration.detect_deprecations = true 199 | allow(We::Call::Connection::QueryableBuilder).to receive(:new) { builder_spy } 200 | allow(builder_spy).to receive(:use) 201 | allow(builder_spy).to receive(:response) 202 | end 203 | 204 | context 'and config.detect_deprecations is left to default' do 205 | it 'register middleware with { active_support: :auto }' do 206 | subject 207 | expect(builder_spy).to have_received(:response).with( 208 | :sunset, 209 | active_support: :auto, 210 | rollbar: :auto 211 | ) 212 | end 213 | end 214 | 215 | context 'and config.detect_deprecations is set to :logger' do 216 | let(:logger) { spy('Logger') } 217 | 218 | before do 219 | @orig_detect_deprecations = We::Call::configuration.detect_deprecations 220 | We::Call::configuration.detect_deprecations = logger 221 | end 222 | 223 | after do 224 | We::Call::configuration.detect_deprecations = @orig_detect_deprecations 225 | end 226 | 227 | it 'register middleware with { logger: logger }' do 228 | subject 229 | expect(builder_spy).to have_received(:response).with( 230 | :sunset, 231 | logger: logger, 232 | rollbar: :auto, 233 | active_support: :auto 234 | ) 235 | end 236 | end 237 | end 238 | 239 | context 'when retry is disabled' do 240 | before do 241 | We::Call::configuration.retry = false 242 | end 243 | 244 | after do 245 | We::Call::configuration.retry = true 246 | end 247 | 248 | it 'does not register retry middleware' do 249 | expect(handlers).not_to include(Faraday::Request::Retry) 250 | end 251 | end 252 | 253 | context 'when retry is enabled' do 254 | let(:builder_spy) { spy('QueryableBuilder') } 255 | 256 | before do 257 | allow(We::Call::Connection::QueryableBuilder).to receive(:new) { builder_spy } 258 | allow(builder_spy).to receive(:use) 259 | allow(builder_spy).to receive(:response) 260 | end 261 | 262 | context 'when retry is used with default options' do 263 | it 'registers the middleware with the correct options' do 264 | subject 265 | expect(builder_spy).to have_received(:request).with( 266 | :retry, 267 | We::Call::Connection::DEFAULT_RETRY_OPTIONS 268 | ) 269 | end 270 | 271 | context 'when options are overriden' do 272 | let(:options) { { max: 5, backoff_factor: 2 } } 273 | 274 | around do |example| 275 | We::Call::configuration.retry_options = options 276 | example.run 277 | We::Call::configuration.retry_options = {} 278 | end 279 | 280 | it 'registers the middleware with the correct options' do 281 | subject 282 | expect(builder_spy).to have_received(:request).with( 283 | :retry, 284 | We::Call::Connection::DEFAULT_RETRY_OPTIONS.merge(options) 285 | ) 286 | end 287 | 288 | context 'when retry options are set on a connection' do 289 | let(:options) { { max: 3, backoff_factor: 2 } } 290 | let(:valid_arguments) { super().merge(retry_options: options) } 291 | 292 | it 'registers the middleware with the correct options' do 293 | subject 294 | expect(builder_spy).to have_received(:request).with( 295 | :retry, 296 | We::Call::Connection::DEFAULT_RETRY_OPTIONS.merge(options) 297 | ) 298 | end 299 | end 300 | end 301 | 302 | context 'when exceptions are overriden' do 303 | let(:options) { { exceptions: [Faraday::ResourceNotFound] } } 304 | 305 | around do |example| 306 | We::Call::configuration.retry_options = options 307 | example.run 308 | We::Call::configuration.retry_options = {} 309 | end 310 | 311 | it 'registers the middleware with the correct options' do 312 | expected_options = We::Call::Connection::DEFAULT_RETRY_OPTIONS.dup 313 | expected_options[:exceptions] += options[:exceptions] 314 | 315 | subject 316 | expect(builder_spy).to have_received(:request).with( 317 | :retry, 318 | expected_options 319 | ) 320 | end 321 | end 322 | end 323 | end 324 | end 325 | end 326 | end 327 | -------------------------------------------------------------------------------- /spec/cassettes/vileplume.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: http://pokeapi.co/api/v2/pokemon/45/ 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | User-Agent: 11 | - pokedex 12 | X-WeWork-App: 13 | - pokedex 14 | X-WeWork-Env: 15 | - test 16 | response: 17 | status: 18 | code: 200 19 | message: 20 | headers: 21 | date: 22 | - Fri, 28 Apr 2017 18:07:52 GMT 23 | content-type: 24 | - application/json 25 | transfer-encoding: 26 | - chunked 27 | connection: 28 | - close 29 | set-cookie: 30 | - __cfduid=d8cb48b8b63492165e8d9bfff111837951493402868; expires=Sat, 28-Apr-18 31 | 18:07:48 GMT; path=/; domain=.pokeapi.co; HttpOnly 32 | vary: 33 | - Accept-Encoding, Cookie 34 | x-frame-options: 35 | - SAMEORIGIN 36 | allow: 37 | - GET, HEAD, OPTIONS 38 | x-xss-protection: 39 | - 1; mode=block 40 | server: 41 | - cloudflare-nginx 42 | cf-ray: 43 | - 356bf698247d1870-EWR 44 | body: 45 | encoding: ASCII-8BIT 46 | string: '{"forms":[{"url":"http:\/\/pokeapi.co\/api\/v2\/pokemon-form\/45\/","name":"vileplume"}],"abilities":[{"slot":3,"is_hidden":true,"ability":{"url":"http:\/\/pokeapi.co\/api\/v2\/ability\/27\/","name":"effect-spore"}},{"slot":1,"is_hidden":false,"ability":{"url":"http:\/\/pokeapi.co\/api\/v2\/ability\/34\/","name":"chlorophyll"}}],"stats":[{"stat":{"url":"http:\/\/pokeapi.co\/api\/v2\/stat\/6\/","name":"speed"},"effort":0,"base_stat":50},{"stat":{"url":"http:\/\/pokeapi.co\/api\/v2\/stat\/5\/","name":"special-defense"},"effort":0,"base_stat":90},{"stat":{"url":"http:\/\/pokeapi.co\/api\/v2\/stat\/4\/","name":"special-attack"},"effort":3,"base_stat":110},{"stat":{"url":"http:\/\/pokeapi.co\/api\/v2\/stat\/3\/","name":"defense"},"effort":0,"base_stat":85},{"stat":{"url":"http:\/\/pokeapi.co\/api\/v2\/stat\/2\/","name":"attack"},"effort":0,"base_stat":80},{"stat":{"url":"http:\/\/pokeapi.co\/api\/v2\/stat\/1\/","name":"hp"},"effort":0,"base_stat":75}],"name":"vileplume","weight":186,"moves":[{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/14\/","name":"swords-dance"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/15\/","name":"cut"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/34\/","name":"body-slam"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/36\/","name":"take-down"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/38\/","name":"double-edge"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/51\/","name":"acid"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/63\/","name":"hyper-beam"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/71\/","name":"absorb"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/72\/","name":"mega-drain"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":64,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":65,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":65,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":65,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":65,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":65,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":65,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/76\/","name":"solar-beam"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":15,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":15,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/77\/","name":"poison-powder"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":17,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":17,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/78\/","name":"stun-spore"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":19,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":19,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/79\/","name":"sleep-powder"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":59,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":53,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":44,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":44,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":53,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":53,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":53,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":53,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":44,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":44,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":44,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":53,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/80\/","name":"petal-dance"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/92\/","name":"toxic"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/99\/","name":"rage"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/102\/","name":"mimic"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/104\/","name":"double-team"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/115\/","name":"reflect"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/117\/","name":"bide"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/148\/","name":"flash"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/156\/","name":"rest"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/2\/","name":"yellow"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/1\/","name":"red-blue"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/164\/","name":"substitute"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/173\/","name":"snore"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/174\/","name":"curse"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/182\/","name":"protect"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/188\/","name":"sludge-bomb"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/202\/","name":"giga-drain"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/203\/","name":"endure"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/207\/","name":"swagger"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/213\/","name":"attract"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/214\/","name":"sleep-talk"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/216\/","name":"return"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/218\/","name":"frustration"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/219\/","name":"safeguard"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/230\/","name":"sweet-scent"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/235\/","name":"synthesis"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/237\/","name":"hidden-power"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/4\/","name":"crystal"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/3\/","name":"gold-silver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/241\/","name":"sunny-day"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/263\/","name":"facade"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/267\/","name":"nature-power"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/290\/","name":"secret-power"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":1,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/312\/","name":"aromatherapy"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/13\/","name":"xd"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/12\/","name":"colosseum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/7\/","name":"firered-leafgreen"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/6\/","name":"emerald"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/5\/","name":"ruby-sapphire"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/331\/","name":"bullet-seed"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/363\/","name":"natural-gift"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/374\/","name":"fling"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/380\/","name":"gastro-acid"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/388\/","name":"worry-seed"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/402\/","name":"seed-bomb"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/409\/","name":"drain-punch"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/412\/","name":"energy-ball"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/416\/","name":"giga-impact"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/445\/","name":"captivate"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/10\/","name":"heartgold-soulsilver"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/9\/","name":"platinum"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/8\/","name":"diamond-pearl"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/447\/","name":"grass-knot"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/474\/","name":"venoshock"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/3\/","name":"tutor"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/495\/","name":"after-you"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/11\/","name":"black-white"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/14\/","name":"black-2-white-2"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/496\/","name":"round"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":49,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/1\/","name":"level-up"},"level_learned_at":50,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/572\/","name":"petal-blizzard"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/590\/","name":"confide"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/605\/","name":"dazzling-gleam"}},{"version_group_details":[{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/16\/","name":"omega-ruby-alpha-sapphire"}},{"move_learn_method":{"url":"http:\/\/pokeapi.co\/api\/v2\/move-learn-method\/4\/","name":"machine"},"level_learned_at":0,"version_group":{"url":"http:\/\/pokeapi.co\/api\/v2\/version-group\/15\/","name":"x-y"}}],"move":{"url":"http:\/\/pokeapi.co\/api\/v2\/move\/611\/","name":"infestation"}}],"sprites":{"back_female":"https:\/\/raw.githubusercontent.com\/PokeAPI\/sprites\/master\/sprites\/pokemon\/back\/female\/45.png","back_shiny_female":"https:\/\/raw.githubusercontent.com\/PokeAPI\/sprites\/master\/sprites\/pokemon\/back\/shiny\/female\/45.png","back_default":"https:\/\/raw.githubusercontent.com\/PokeAPI\/sprites\/master\/sprites\/pokemon\/back\/45.png","front_female":"https:\/\/raw.githubusercontent.com\/PokeAPI\/sprites\/master\/sprites\/pokemon\/female\/45.png","front_shiny_female":"https:\/\/raw.githubusercontent.com\/PokeAPI\/sprites\/master\/sprites\/pokemon\/shiny\/female\/45.png","back_shiny":"https:\/\/raw.githubusercontent.com\/PokeAPI\/sprites\/master\/sprites\/pokemon\/back\/shiny\/45.png","front_default":"https:\/\/raw.githubusercontent.com\/PokeAPI\/sprites\/master\/sprites\/pokemon\/45.png","front_shiny":"https:\/\/raw.githubusercontent.com\/PokeAPI\/sprites\/master\/sprites\/pokemon\/shiny\/45.png"},"held_items":[],"location_area_encounters":"\/api\/v2\/pokemon\/45\/encounters","height":12,"is_default":true,"species":{"url":"http:\/\/pokeapi.co\/api\/v2\/pokemon-species\/45\/","name":"vileplume"},"id":45,"order":61,"game_indices":[{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/22\/","name":"white-2"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/21\/","name":"black-2"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/18\/","name":"white"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/17\/","name":"black"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/16\/","name":"soulsilver"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/15\/","name":"heartgold"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/14\/","name":"platinum"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/13\/","name":"pearl"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/12\/","name":"diamond"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/11\/","name":"leafgreen"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/10\/","name":"firered"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/9\/","name":"emerald"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/8\/","name":"sapphire"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/7\/","name":"ruby"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/6\/","name":"crystal"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/5\/","name":"silver"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/4\/","name":"gold"},"game_index":45},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/3\/","name":"yellow"},"game_index":187},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/2\/","name":"blue"},"game_index":187},{"version":{"url":"http:\/\/pokeapi.co\/api\/v2\/version\/1\/","name":"red"},"game_index":187}],"base_experience":221,"types":[{"slot":2,"type":{"url":"http:\/\/pokeapi.co\/api\/v2\/type\/4\/","name":"poison"}},{"slot":1,"type":{"url":"http:\/\/pokeapi.co\/api\/v2\/type\/12\/","name":"grass"}}]}' 47 | http_version: 48 | recorded_at: Fri, 28 Apr 2017 18:07:52 GMT 49 | recorded_with: VCR 3.0.3 50 | --------------------------------------------------------------------------------