quandl-api 0.1.0.0 → 0.2.0.0
raw patch · 4 files changed
+104/−1 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Quandl: SearchDoc :: Text -> Maybe Text -> Bool -> Text -> Text -> Day -> Text -> [Text] -> Text -> Text -> UTCTime -> Day -> Text -> SearchDoc
+ Data.Quandl: SearchPage :: Int -> Int -> Int -> [SearchSource] -> [SearchDoc] -> SearchPage
+ Data.Quandl: SearchSource :: Text -> Int -> Text -> Text -> Int -> Text -> SearchSource
+ Data.Quandl: data SearchDoc
+ Data.Quandl: data SearchPage
+ Data.Quandl: data SearchSource
+ Data.Quandl: instance Data SearchDoc
+ Data.Quandl: instance Data SearchPage
+ Data.Quandl: instance Data SearchSource
+ Data.Quandl: instance Eq SearchDoc
+ Data.Quandl: instance Eq SearchPage
+ Data.Quandl: instance Eq SearchSource
+ Data.Quandl: instance FromJSON SearchDoc
+ Data.Quandl: instance FromJSON SearchPage
+ Data.Quandl: instance FromJSON SearchSource
+ Data.Quandl: instance Show SearchDoc
+ Data.Quandl: instance Show SearchPage
+ Data.Quandl: instance Show SearchSource
+ Data.Quandl: instance Typeable SearchDoc
+ Data.Quandl: instance Typeable SearchPage
+ Data.Quandl: instance Typeable SearchSource
+ Data.Quandl: sdCode :: SearchDoc -> Text
+ Data.Quandl: sdColumnNames :: SearchDoc -> [Text]
+ Data.Quandl: sdDescription :: SearchDoc -> Text
+ Data.Quandl: sdDisplayUrl :: SearchDoc -> Maybe Text
+ Data.Quandl: sdFrequency :: SearchDoc -> Text
+ Data.Quandl: sdFromDate :: SearchDoc -> Day
+ Data.Quandl: sdName :: SearchDoc -> Text
+ Data.Quandl: sdPrivate :: SearchDoc -> Bool
+ Data.Quandl: sdSourceCode :: SearchDoc -> Text
+ Data.Quandl: sdSourceName :: SearchDoc -> Text
+ Data.Quandl: sdToDate :: SearchDoc -> Day
+ Data.Quandl: sdUpdatedAt :: SearchDoc -> UTCTime
+ Data.Quandl: sdUrlizeName :: SearchDoc -> Text
+ Data.Quandl: search :: [String] -> Maybe String -> Maybe Int -> Maybe Int -> IO (Maybe SearchPage)
+ Data.Quandl: spCurrentPage :: SearchPage -> Int
+ Data.Quandl: spDocs :: SearchPage -> [SearchDoc]
+ Data.Quandl: spPerPage :: SearchPage -> Int
+ Data.Quandl: spSources :: SearchPage -> [SearchSource]
+ Data.Quandl: spTotalCount :: SearchPage -> Int
+ Data.Quandl: ssCode :: SearchSource -> Text
+ Data.Quandl: ssDatasetsCount :: SearchSource -> Int
+ Data.Quandl: ssDescription :: SearchSource -> Text
+ Data.Quandl: ssHost :: SearchSource -> Text
+ Data.Quandl: ssId :: SearchSource -> Int
+ Data.Quandl: ssName :: SearchSource -> Text
Files
- CHANGELOG.md +8/−0
- Data/Quandl.hs +92/−0
- README.md +2/−0
- quandl-api.cabal +2/−1
+ CHANGELOG.md view
@@ -0,0 +1,8 @@+quandl-api changes+------------------++0.2.0.0++* Add a function to access the Quandl search API. + Contributed by mwm / fpcomplete.+
Data/Quandl.hs view
@@ -26,12 +26,18 @@ defaultOptions, getTableWith, + -- * Search for a table+ search,+ -- * Datatypes Options(..), Frequency(..), Transformation(..), Dataset(..), Metadata(..),+ SearchSource(..),+ SearchDoc(..),+ SearchPage(..), -- * Low-level functions downloadJSON,@@ -115,6 +121,40 @@ daFrequency :: T.Text -- ^ The frequency of the returned data (daily, monthly, etc) } deriving (Eq, Show, Data, Typeable) +-- | Results from Search calls.+data SearchSource = SearchSource {+ ssName :: T.Text, -- ^ Name of the source+ ssId :: Int, -- ^ Source ID+ ssDescription :: T.Text, -- ^ Description of source+ ssHost :: T.Text, -- ^ Source Host site+ ssDatasetsCount :: Int, -- ^ count of datasets on host+ ssCode :: T.Text -- ^ Code to use in API.+ } deriving (Eq, Show, Data, Typeable)++data SearchDoc = SearchDoc {+ sdSourceCode :: T.Text, -- ^ Source code to use in API.+ sdDisplayUrl :: Maybe T.Text, -- ^ URL to fetch original data from.+ sdPrivate :: Bool, -- ^ Whether or not data is private+ sdUrlizeName :: T.Text, -- ^ Url encoded doc name.+ sdName :: T.Text, -- ^ Doc name.+ sdFromDate :: Day, -- ^ First date in source.+ sdDescription :: T.Text, -- ^ Description of data.+ sdColumnNames :: [T.Text], -- ^ Names of columns in data.+ sdFrequency :: T.Text, -- ^ Frequency of updates.+ sdSourceName :: T.Text, -- ^ Name of source database.+ sdUpdatedAt :: UTCTime, -- ^ Time of most recent updated.+ sdToDate :: Day, -- ^ Last day data is available.+ sdCode :: T.Text -- ^ Doc code to use in API.+ } deriving (Show, Eq, Data, Typeable)++data SearchPage = SearchPage {+ spTotalCount :: Int, -- ^ Number of results available+ spCurrentPage :: Int, -- ^ Current page of results+ spPerPage :: Int, -- ^ Results per page+ spSources :: [SearchSource], -- ^ Metadata for sources.+ spDocs :: [SearchDoc] -- ^ Actual documents found.+ } deriving (Eq, Show, Data, Typeable)+ ------------------------------------------------------------------------------- -- JSON Parsers @@ -165,6 +205,42 @@ v .: "frequency" parseJSON _ = mzero +instance FromJSON SearchSource where+ parseJSON (Object v) = SearchSource <$>+ v .: "name" <*>+ v .: "id" <*>+ v .: "description" <*>+ v .: "host" <*>+ v .: "datasets_count" <*>+ v .: "code"+ parseJSON _ = mzero++instance FromJSON SearchDoc where+ parseJSON (Object v) = SearchDoc <$>+ v .: "source_code" <*>+ v .: "display_url" <*>+ v .: "private" <*>+ v .: "urlize_name" <*>+ v .: "name" <*>+ (asDay <$> v .:"from_date") <*>+ v .: "description" <*>+ v .: "column_names" <*>+ v .: "frequency" <*>+ v .: "source_name" <*>+ (asUTCTime <$> v .: "updated_at" ) <*>+ (asDay <$> v .: "to_date") <*>+ v .: "code"+ parseJSON _ = mzero++instance FromJSON SearchPage where+ parseJSON (Object v) = SearchPage <$>+ v .: "total_count" <*>+ v .: "current_page" <*>+ v .: "per_page" <*>+ v .: "sources" <*>+ v .: "docs"+ parseJSON _ = mzero+ ------------------------------------------------------------------------------- -- Public functions @@ -265,3 +341,19 @@ let toItem (source, table, column) = map toUpper source ++ "." ++ map toUpper table ++ (case column of { Nothing -> ""; Just c -> "." ++ show c }) in intercalate "," $ map toItem items +-- | Search for terms, returning given page+search :: [String] -- ^ List of search terms+ -> Maybe String -- ^ Auth Token+ -> Maybe Int -- ^ Number to display per page or Nothing+ -> Maybe Int -- ^ Page number to display or Nothing+ -> IO (Maybe SearchPage) -- ^ Search results from Quandl, or Nothing if parsing failed.+search terms token per_page page = decode' <$> simpleHttp makeUrl where+ query = concatMap param [Just ("query", intercalate "+" terms),+ fmap (\t -> ("auth_token", t)) token,+ fmap (\p -> ("page", show p)) page,+ fmap (\p -> ("per_page", show p)) per_page]+ param (Just (k, v)) = [(BC.pack k, Just $ BC.pack v)]+ param Nothing = []+ makeUrl = BC.unpack $ toByteString $+ fromByteString "http://www.quandl.com/api/v1/datasets.json" <>+ renderQueryBuilder True query
README.md view
@@ -12,10 +12,12 @@ The `getTable` function is all you need to download tables. To get all data points for the dataset FRED/GDP: + import Data.Quandl getTable "FRED" "GDP" Nothing Registered users should include their auth_token, like this: + import Data.Quandl getTable "FRED" "GDP" (Just "dsahFHUiewjjd") ## Advanced Usage
quandl-api.cabal view
@@ -1,5 +1,5 @@ name: quandl-api-version: 0.1.0.0+version: 0.2.0.0 copyright: (c) 2014 Peter van den Brand homepage: https://github.com/pvdbrand/quandl-api bug-reports: https://github.com/pvdbrand/quandl-api/issues@@ -16,6 +16,7 @@ extra-source-files: README.md+ CHANGELOG.md source-repository head type: git