Skip to content

Commit

Permalink
Begin working on new core Fred class
Browse files Browse the repository at this point in the history
  • Loading branch information
zachwill committed Apr 16, 2012
1 parent ed2ea08 commit 8d108e4
Show file tree
Hide file tree
Showing 8 changed files with 124 additions and 198 deletions.
4 changes: 1 addition & 3 deletions fred/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
from fred import Fred

__all__ = [Fred]
from core import Fred
7 changes: 7 additions & 0 deletions fred/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
Simplified functions for using the Fred API.
"""

from .core import Fred


def key(api_key):
os.environ['FRED_API_KEY'] = api_key


#####################
# Category
#####################
Expand Down
116 changes: 116 additions & 0 deletions fred/core.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
"""
FRED API documentation: http://api.stlouisfed.org/docs/fred/
Core functionality for interacting with the FRED API.
"""

import os
from itertools import ifilter

import requests
from relaxml import xml


class Fred(object):
"""An easy-to-use Python wrapper over the St. Louis FRED API."""

def __init__(self, api_key='', xml_output=False):
if 'FRED_API_KEY' in os.environ:
self.api_key = os.environ['FRED_API_KEY']
else:
self.api_key = api_key
self.xml = xml_output
self.endpoint = 'http://api.stlouisfed.org/fred/'

def _create_path(self, *args):
"""Create the URL path with the Fred endpoint and given arguments."""
args = ifilter(None, args)
path = self.endpoint + '/'.join(args)
return path

def get(self, *args, **kwargs):
"""Perform a GET request againt the Fred API endpoint."""
location = args[0]
params = self._get_keywords(location, kwargs)
url = self._create_path(args)
request = requests.get(url, params=params)
content = request.content
self._request = request
return self._output(content)

def _get_keywords(self, location, keywords):
"""Format GET request's parameters from keywords."""
if 'xml' in keywords:
keywords.pop('xml')
self.xml = True
if 'id' in keywords:
if location != 'series':
location = location.rstrip('s')
key = '%s_id' % location
value = keywords.pop('id')
keywords[key] = value
if 'start' in keywords:
time = keywords.pop('start')
keywords['realtime_start'] = time
if 'end' in keywords:
time = keywords.pop('end')
keywords['realtime_end'] = time
if 'sort' in keywords:
order = keywords.pop('sort')
keywords['sort_order'] = order
keywords['api_key'] = self.api_key
return keywords

def _output(self, content):
"""Return the output from a given GET request."""
if self.xml:
return content
return xml(content)

def category(self, child=None, **kwargs):
"""
Get a specific category.
>>> Fred().category(category_id=125)
"""
return self.get('category', child, **kwargs)

def releases(self, child=None, **kwargs):
"""
Get all releases of economic data.
>>> Fred().releases('dates', limit=10)
"""
return self.get('releases', child, **kwargs)

def release(self, child=None, **kwargs):
"""
Get a release of economic data.
>>> Fred().release('series', release_id=51)
"""
return self.get('release', child, **kwargs)

def series(self, child=None, **kwargs):
"""
Get economic series of data.
>>> Fred().series('search', search_text="money stock")
"""
return self.get('series', child, **kwargs)

def sources(self, child=None, **kwargs):
"""
Get all of FRED's sources of economic data.
>>> Fred().sources()
"""
return self.get('sources', child, **kwargs)

def source(self, child=None, **kwargs):
"""
Get a single source of economic data.
>>> Fred().source(source_id=51)
"""
return self.get('source', child, **kwargs)
File renamed without changes.
4 changes: 0 additions & 4 deletions fred/xml2dict/README

This file was deleted.

21 changes: 0 additions & 21 deletions fred/xml2dict/__init__.py

This file was deleted.

45 changes: 0 additions & 45 deletions fred/xml2dict/object_dict.py

This file was deleted.

125 changes: 0 additions & 125 deletions fred/xml2dict/xml2dict.py

This file was deleted.

0 comments on commit 8d108e4

Please sign in to comment.