Class: FaaAdip::Service

Inherits:
Object
  • Object
show all
Defined in:
lib/faa_adip/service.rb

Overview

Service to interact with FAA’s Airport Data & Information Portal (ADIP) API external-api.faa.gov/adip

This service provides access to FAA’s ADIP API, which contains information about airports, including facilities, runways, and other airport data.

Constant Summary collapse

BASE_URL =
"https://external-api.faa.gov/adip/v1"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client_id = nil, client_secret = nil) ⇒ Service

Initialize the service with FAA API credentials

Parameters:

  • client_id (String) (defaults to: nil)

    FAA API client ID

  • client_secret (String) (defaults to: nil)

    FAA API client secret

Raises:

  • (ArgumentError)


21
22
23
24
25
26
27
# File 'lib/faa_adip/service.rb', line 21

def initialize(client_id = nil, client_secret = nil)
  @client_id = client_id || ENV['FAA_ADIP_CLIENT_ID']
  @client_secret = client_secret || ENV['FAA_ADIP_CLIENT_SECRET']
  
  raise ArgumentError, "FAA ADIP client_id is required" unless @client_id
  raise ArgumentError, "FAA ADIP client_secret is required" unless @client_secret
end

Instance Attribute Details

#client_idObject (readonly)

Returns the value of attribute client_id.



16
17
18
# File 'lib/faa_adip/service.rb', line 16

def client_id
  @client_id
end

#client_secretObject (readonly)

Returns the value of attribute client_secret.



16
17
18
# File 'lib/faa_adip/service.rb', line 16

def client_secret
  @client_secret
end

Instance Method Details

#get_airport(airport_id) ⇒ Hash

Get detailed information for a specific airport by its ID

Parameters:

  • airport_id (String)

    Airport identifier (e.g., ‘KIAD’)

Returns:

  • (Hash)

    Detailed airport information



96
97
98
# File 'lib/faa_adip/service.rb', line 96

def get_airport(airport_id)
  get("/airports/#{URI.encode_www_form_component(airport_id)}")
end

#get_facilities(airport_id) ⇒ Hash

Get facility information for a specific airport

Parameters:

  • airport_id (String)

    Airport identifier (e.g., ‘KIAD’)

Returns:

  • (Hash)

    Facility information for the airport



144
145
146
# File 'lib/faa_adip/service.rb', line 144

def get_facilities(airport_id)
  get("/airports/#{URI.encode_www_form_component(airport_id)}/facilities")
end

#get_metar(airport_id) ⇒ Hash

Get METAR (Meteorological Aerodrome Report) data for a specific airport

Parameters:

  • airport_id (String)

    Airport identifier (e.g., ‘KIAD’)

Returns:

  • (Hash)

    METAR data for the airport



126
127
128
# File 'lib/faa_adip/service.rb', line 126

def get_metar(airport_id)
  get("/airports/#{URI.encode_www_form_component(airport_id)}/weather/metar")
end

#get_nearby_airports(airport_id, radius = 20, options = {}) ⇒ Hash

Get nearby airports within a specified radius

Parameters:

  • airport_id (String)

    Airport identifier (e.g., ‘KIAD’)

  • radius (Float) (defaults to: 20)

    Search radius in nautical miles (default: 20, max: 100)

  • options (Hash) (defaults to: {})

    Additional filter options

Options Hash (options):

  • :facility_use (String)

    Filter by facility use (‘PUBLIC’, ‘PRIVATE’, ‘MILITARY’)

Returns:

  • (Hash)

    List of nearby airports



154
155
156
157
158
159
160
161
162
# File 'lib/faa_adip/service.rb', line 154

def get_nearby_airports(airport_id, radius = 20, options = {})
  params = { radius: validate_range(radius, 0.1, 100, 'radius') }
  
  if options[:facility_use]
    params[:facilityUse] = validate_enum(options[:facility_use], %w[PUBLIC PRIVATE MILITARY], 'facility_use')
  end
  
  get("/airports/#{URI.encode_www_form_component(airport_id)}/nearby", params)
end

#get_runway(airport_id, runway_id) ⇒ Hash

Get detailed information for a specific runway

Parameters:

  • airport_id (String)

    Airport identifier (e.g., ‘KIAD’)

  • runway_id (String)

    Runway identifier (e.g., ‘01/19’)

Returns:

  • (Hash)

    Detailed runway information



115
116
117
# File 'lib/faa_adip/service.rb', line 115

def get_runway(airport_id, runway_id)
  get("/airports/#{URI.encode_www_form_component(airport_id)}/runways/#{URI.encode_www_form_component(runway_id)}")
end

#get_runways(airport_id) ⇒ Hash

Get runway information for a specific airport

Parameters:

  • airport_id (String)

    Airport identifier (e.g., ‘KIAD’)

Returns:

  • (Hash)

    Runway information for the airport



107
108
109
# File 'lib/faa_adip/service.rb', line 107

def get_runways(airport_id)
  get("/airports/#{URI.encode_www_form_component(airport_id)}/runways")
end

#get_taf(airport_id) ⇒ Hash

Get TAF (Terminal Aerodrome Forecast) data for a specific airport

Parameters:

  • airport_id (String)

    Airport identifier (e.g., ‘KIAD’)

Returns:

  • (Hash)

    TAF data for the airport



133
134
135
# File 'lib/faa_adip/service.rb', line 133

def get_taf(airport_id)
  get("/airports/#{URI.encode_www_form_component(airport_id)}/weather/taf")
end

#search_airports(options = {}) ⇒ Hash

Search for airports based on various criteria

Parameters:

  • options (Hash) (defaults to: {})

    Search criteria parameters

Options Hash (options):

  • :airport_id (String)

    Airport identifier (e.g., ‘KIAD’)

  • :site_number (String)

    FAA site number

  • :loc_id (String)

    Location identifier

  • :state (String)

    Two-letter state code

  • :city (String)

    City name

  • :county (String)

    County name

  • :facility_name (String)

    Airport name or partial name

  • :facility_use (String)

    ‘PUBLIC’, ‘PRIVATE’, or ‘MILITARY’

  • :latitude (Float)

    Latitude coordinate

  • :longitude (Float)

    Longitude coordinate

  • :radius (Float)

    Search radius in nautical miles (when used with lat/lon)

  • :page_size (Integer)

    Number of results per page (default: 20, max: 100)

  • :page_num (Integer)

    Page number (default: 1)

Returns:

  • (Hash)

    Airport search results



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/faa_adip/service.rb', line 49

def search_airports(options = {})
  params = {}
  
  # Map option keys to API parameter names
  param_mapping = {
    airport_id: :airportId,
    site_number: :siteNumber,
    loc_id: :locId,
    state: :state,
    city: :city,
    county: :county,
    facility_name: :facilityName,
    facility_use: :facilityUse,
    latitude: :latitude,
    longitude: :longitude,
    radius: :radius,
    page_size: :pageSize,
    page_num: :pageNum
  }
  
  # Process each option
  param_mapping.each do |option_key, param_key|
    if options.key?(option_key)
      # Special validation for parameters
      value = case option_key
      when :facility_use
        validate_enum(options[option_key], %w[PUBLIC PRIVATE MILITARY], 'facility_use')
      when :radius
        validate_range(options[option_key], 0.1, 100, 'radius')
      when :page_size
        validate_range(options[option_key], 1, 100, 'page_size').to_i
      when :page_num
        validate_range(options[option_key], 1, nil, 'page_num').to_i
      else
        options[option_key]
      end
      
      params[param_key] = value
    end
  end
  
  get("/airports", params)
end