bea_api 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/.gitignore +35 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +4 -0
- data/Rakefile +2 -0
- data/bea_api.gemspec +28 -0
- data/circle.yml +20 -0
- data/lib/bea_api.rb +3 -0
- data/lib/bea_api/client.rb +56 -0
- data/lib/bea_api/request.rb +111 -0
- data/lib/bea_api/version.rb +3 -0
- data/spec/api_key.rb.ci +1 -0
- data/spec/bea_api/client_spec.rb +276 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/vcr_setup.rb +9 -0
- metadata +178 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NTRiZTE3YTM1NzY0MjJlN2RkZGE4ZjE4Y2ZkMGNlNmY2OWI3NzI0Yw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MWFhMDUwODVhY2ZmOTU1NzZmNjI3ZWQzZDc5ZGNkNTVjYjBmZTI3NA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZmUzODAyYWMxMjkzOTA4ODNhODE2YWQ3MTY1YTQ0ZmI3MjVkOTU3NTA2Zjdh
|
10
|
+
OTcwMDM0MWY1OTZjZjE1OTk3NTIzMGVjZmNhYmY4ZDQxMjQ5NjIyZDU2MzEw
|
11
|
+
NTI0Y2JkZjIwMWExMzVkMGJlNTAwNmNlZWEyYmI2ZTExYzcxYzM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NmQ5ODcwZWEyZmE4Y2RlN2RkNjlkM2M4ZTE3NjliOTQ1M2E2ZTFlZTBkNzkz
|
14
|
+
M2QxMzJmNzljN2Q2NGIwZmM5MjZkNjY3NTYzODhiZDg4ODRjZDE5MzNmNDEy
|
15
|
+
OWYxMGI4NTZhNWEyMTZiMzJmOTE4YmVhYjk4ZDA5MjAzZmNjYWY=
|
data/.gitignore
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
*.rbc
|
2
|
+
capybara-*.html
|
3
|
+
.rspec
|
4
|
+
log
|
5
|
+
tmp
|
6
|
+
db/*.sqlite3
|
7
|
+
public/system
|
8
|
+
coverage/
|
9
|
+
spec/tmp
|
10
|
+
spec/vcr_cassettes
|
11
|
+
spec/vcr_cassettes/*
|
12
|
+
spec/api_key.rb
|
13
|
+
|
14
|
+
**.orig
|
15
|
+
rerun.txt
|
16
|
+
pickle-email-*.html
|
17
|
+
|
18
|
+
# TODO Comment out these rules if you are OK with secrets being uploaded to the repo
|
19
|
+
config/initializers/secret_token.rb
|
20
|
+
config/secrets.yml
|
21
|
+
|
22
|
+
## Environment normalisation:
|
23
|
+
.bundle
|
24
|
+
vendor/bundle
|
25
|
+
|
26
|
+
# these should all be checked in to normalise the environment:
|
27
|
+
# Gemfile.lock, .ruby-version, .ruby-gemset
|
28
|
+
|
29
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
30
|
+
.rvmrc
|
31
|
+
|
32
|
+
# if using bower-rails ignore default bower_components path bower.json files
|
33
|
+
vendor/assets/bower_components
|
34
|
+
*.bowerrc
|
35
|
+
bower.json
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Chad Hoersten
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
data/Rakefile
ADDED
data/bea_api.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'bea_api/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "bea_api"
|
8
|
+
spec.version = BeaApi::VERSION
|
9
|
+
spec.authors = ["Chad Hoersten"]
|
10
|
+
spec.summary = %q{Ruby wrapper for the US Bureau of Economic Analysis (BEA) API}
|
11
|
+
spec.description = %q{Ruby wrapper for the US Bureau of Economic Analysis (BEA) API at http://www.bea.gov/api/. This API is used to pull United States economic data by geography.}
|
12
|
+
spec.homepage = "https://github.com/hoersten/bea_api"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_runtime_dependency 'rest-client'
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'rspec-rails'
|
25
|
+
spec.add_development_dependency 'vcr'
|
26
|
+
spec.add_development_dependency 'webmock'
|
27
|
+
spec.add_development_dependency 'codeclimate-test-reporter'
|
28
|
+
end
|
data/circle.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
## Customize the test machine
|
2
|
+
machine:
|
3
|
+
|
4
|
+
timezone:
|
5
|
+
America/Chicago # Set the timezone
|
6
|
+
|
7
|
+
# Version of ruby to use
|
8
|
+
ruby:
|
9
|
+
version:
|
10
|
+
1.9.3-p0-falcon
|
11
|
+
|
12
|
+
## Customize checkout
|
13
|
+
checkout:
|
14
|
+
post:
|
15
|
+
- cp spec/api_key.rb.ci spec/api_key.rb
|
16
|
+
|
17
|
+
## Customize dependencies
|
18
|
+
dependencies:
|
19
|
+
pre:
|
20
|
+
- gem install bundler --pre
|
data/lib/bea_api.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
module BeaApi
|
2
|
+
# => BeaApi::Client
|
3
|
+
# client#initialize method takes an api_key
|
4
|
+
class Client
|
5
|
+
attr_reader :api_key
|
6
|
+
attr_reader :datasets
|
7
|
+
|
8
|
+
def datasets
|
9
|
+
[ :RegionalData, :NIPA, :NIUnderlyingDetail, :MNE, :FixedAssets, :ITA, :IIP, :GDPbyIndustry ]
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(api_key)
|
13
|
+
fail ArgumentError, 'You must set an api_key.' unless api_key
|
14
|
+
_validate_api_key(api_key)
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_datasets()
|
18
|
+
_method(nil, 'GetDataSetList', {})
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_parameters(dataset)
|
22
|
+
fail ArgumentError, 'Invalid dataset.' unless datasets.include?(dataset)
|
23
|
+
_method(dataset, 'GetParameterList', {})
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_parameter_values(dataset, parameter)
|
27
|
+
fail ArgumentError, 'Invalid dataset.' unless datasets.include?(dataset)
|
28
|
+
fail ArgumentError, 'Invalid parameter name.' unless parameter
|
29
|
+
_method(dataset, 'GetParameterValues', {parametername: parameter})
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_data(dataset, fields)
|
33
|
+
fail ArgumentError, 'Invalid dataset.' unless datasets.include?(dataset)
|
34
|
+
fail ArgumentError, 'Invalid fields.' unless fields.class == Hash && !fields.empty?
|
35
|
+
_method(dataset, 'GetData', fields)
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
def _validate_api_key(api_key)
|
40
|
+
@api_key = api_key
|
41
|
+
response = get_datasets()
|
42
|
+
if response.error_code == Request::InvalidKey
|
43
|
+
@api_key = nil
|
44
|
+
fail "'#{api_key}' is not a valid API key. Check your key for errors,
|
45
|
+
or request a new one at http://www.bea.gov/api/"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def _method(dataset, method, options)
|
50
|
+
fail ArgumentError, 'You must include a dataset.' unless dataset || method.downcase == 'getdatasetlist'
|
51
|
+
options.merge!(userid: @api_key, datasetname: dataset, method: method.downcase)
|
52
|
+
Request.find(options)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module BeaApi
|
2
|
+
# => BeaApi::Request
|
3
|
+
class Request
|
4
|
+
require 'restclient'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
attr_accessor :response, :error_code, :error_msg, :notes
|
8
|
+
Success = 0 # Sucess, no errors
|
9
|
+
InvalidKey = 3 # APIErrorCode 3: The BEA API UserID provided in the request does not exist.
|
10
|
+
MissingParams = 40 # APIErrorCode 40: The dataset requested requires parameters that were missing from the request
|
11
|
+
RetrivalError = 201 # APIErrorCode 201: Error retrieving NIPA/Fixed Assets data
|
12
|
+
GDPRetrivalError = 204 # APIErrorCode 204: Error retrieving GDP by Industry data
|
13
|
+
|
14
|
+
BEA_URL = 'http://www.bea.gov/api/data'
|
15
|
+
|
16
|
+
def self.find(options = {})
|
17
|
+
uri = "#{BEA_URL}?#{self.to_params(options)}"
|
18
|
+
response = Request.new(uri)
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(uri)
|
22
|
+
@error_code = Request::Success
|
23
|
+
@error_msg = ""
|
24
|
+
@response = RestClient.get(uri.to_s)
|
25
|
+
_parse_response
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def _parse_response
|
31
|
+
case @response.code
|
32
|
+
when 200
|
33
|
+
_response_html_success(@response)
|
34
|
+
else
|
35
|
+
_response_html_error(@response)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.to_params(options)
|
40
|
+
options.map { |k,v| "#{k}=#{v}" }.join("&")
|
41
|
+
end
|
42
|
+
|
43
|
+
def _response_html_success(response)
|
44
|
+
r = JSON.parse(response)
|
45
|
+
if (!r["BEAAPI"]["Error"].nil? || r["BEAAPI"]["Results"].first.first.to_s.downcase == 'error')
|
46
|
+
@response = _response_error(response, r)
|
47
|
+
else
|
48
|
+
@response = _response_success(r)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def _response_success(response)
|
53
|
+
h = []
|
54
|
+
if (response.length > 0)
|
55
|
+
h = _parse_data(response)
|
56
|
+
h = [h] unless (h.kind_of?(Array))
|
57
|
+
@notes = _parse_notes(response)
|
58
|
+
end
|
59
|
+
h
|
60
|
+
end
|
61
|
+
|
62
|
+
def _parse_data(response)
|
63
|
+
if (!response["BEAAPI"]["Results"]["Data"].nil?)
|
64
|
+
h = response["BEAAPI"]["Results"]["Data"]
|
65
|
+
elsif (!response["BEAAPI"]["Data"].nil?)
|
66
|
+
h = response["BEAAPI"]["Data"]
|
67
|
+
else
|
68
|
+
h = response["BEAAPI"]["Results"].first[1]
|
69
|
+
end
|
70
|
+
h
|
71
|
+
end
|
72
|
+
|
73
|
+
def _parse_notes(response)
|
74
|
+
if (!response["BEAAPI"]["Results"]["Notes"].nil?)
|
75
|
+
notes = response["BEAAPI"]["Results"]["Notes"]
|
76
|
+
elsif (!response["BEAAPI"]["Notes"].nil?)
|
77
|
+
notes = response["BEAAPI"]["Notes"]
|
78
|
+
end
|
79
|
+
notes
|
80
|
+
end
|
81
|
+
|
82
|
+
def _response_error(response, r)
|
83
|
+
_parse_error(r)
|
84
|
+
{
|
85
|
+
code: response.code,
|
86
|
+
location: response.headers[:location],
|
87
|
+
error_code: @error_code,
|
88
|
+
error_msg: @error_msg
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
def _parse_error(r)
|
93
|
+
if (!r["BEAAPI"]["Error"].nil?)
|
94
|
+
@error_code = r["BEAAPI"]["Error"]["APIErrorCode"].to_i
|
95
|
+
@error_msg = r["BEAAPI"]["Error"]["APIErrorDescription"]
|
96
|
+
else
|
97
|
+
@error_code = r["BEAAPI"]["Results"].first.last["APIErrorCode"].to_i
|
98
|
+
@error_msg = r["BEAAPI"]["Results"].first.last["APIErrorDescription"]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def _response_html_error(response)
|
103
|
+
{
|
104
|
+
code: response.code,
|
105
|
+
location: response.headers[:location],
|
106
|
+
body: response.body
|
107
|
+
}
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
data/spec/api_key.rb.ci
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
RSPEC_API_KEY = ENV["BEA_API_KEY"]
|
@@ -0,0 +1,276 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BeaApi::Client do
|
4
|
+
|
5
|
+
describe 'client initialization' do
|
6
|
+
|
7
|
+
it 'should not initialize without an api_key' do
|
8
|
+
expect { BeaApi::Client.new(nil) }.to raise_error(ArgumentError)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should not initialize with an invalid api_key' do
|
12
|
+
VCR.use_cassette('initialize_client_failure') do
|
13
|
+
expect { BeaApi::Client.new('XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX') }.to raise_error(/is not a valid API key/)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should initialize with an api_key' do
|
18
|
+
VCR.use_cassette('initialize_client') do
|
19
|
+
@client = BeaApi::Client.new(api_key)
|
20
|
+
expect(@client.api_key).to eq(api_key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'get datasets' do
|
26
|
+
|
27
|
+
it 'should get all the datasets' do
|
28
|
+
VCR.use_cassette('get_datasets') do
|
29
|
+
@client = BeaApi::Client.new(api_key)
|
30
|
+
@datasets = @client.get_datasets()
|
31
|
+
expect(@datasets.error_code).to eq(BeaApi::Request::Success)
|
32
|
+
expect(@datasets.response.count).to eq(@client.datasets.count)
|
33
|
+
@datasets.response.each do |r|
|
34
|
+
expect(@client.datasets).to include(r["DatasetName"].to_sym)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'get parameters' do
|
41
|
+
|
42
|
+
it 'should not get parameters for an invalid dataset' do
|
43
|
+
VCR.use_cassette('get invalid parameters') do
|
44
|
+
@client = BeaApi::Client.new(api_key)
|
45
|
+
expect {@client.get_parameters("InvalidDataset") }.to raise_error(ArgumentError)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should get parameters for each dataset' do
|
50
|
+
VCR.use_cassette('get_parmeters') do
|
51
|
+
@client = BeaApi::Client.new(api_key)
|
52
|
+
@client.datasets.each do |d|
|
53
|
+
p = @client.get_parameters(d)
|
54
|
+
expect(p.error_code).to eq(BeaApi::Request::Success)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'get parameter values' do
|
61
|
+
|
62
|
+
it 'should not get parameter values for an invalid dataset' do
|
63
|
+
VCR.use_cassette('get invalid parameter values') do
|
64
|
+
@client = BeaApi::Client.new(api_key)
|
65
|
+
expect {@client.get_parameter_values("InvalidDataset", '') }.to raise_error(ArgumentError)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should not get parameters values for an invalid parameter' do
|
70
|
+
VCR.use_cassette('get invalid parameter values') do
|
71
|
+
@client = BeaApi::Client.new(api_key)
|
72
|
+
expect {@client.get_parameters(@client.datasets.first, '') }.to raise_error(ArgumentError)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should get parameters values for each dataset' do
|
77
|
+
VCR.use_cassette('get_parmeter_values') do
|
78
|
+
@client = BeaApi::Client.new(api_key)
|
79
|
+
@client.datasets.each do |d|
|
80
|
+
p = @client.get_parameters(d)
|
81
|
+
expect(p.error_code).to eq(BeaApi::Request::Success)
|
82
|
+
r = p.response.first
|
83
|
+
n = @client.get_parameter_values(d, r['ParameterName'])
|
84
|
+
expect(n.error_code).to eq(BeaApi::Request::Success)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe 'get data' do
|
91
|
+
it 'should not get data for an invalid dataset' do
|
92
|
+
VCR.use_cassette('get invalid data dataset') do
|
93
|
+
@client = BeaApi::Client.new(api_key)
|
94
|
+
expect {@client.get_data("InvalidDataset", '') }.to raise_error(ArgumentError)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
it 'should not get data values for an invalid parameter' do
|
98
|
+
VCR.use_cassette('get invalid data options') do
|
99
|
+
@client = BeaApi::Client.new(api_key)
|
100
|
+
dataset = @client.datasets.first
|
101
|
+
expect {@client.get_data(dataset, {}) }.to raise_error(ArgumentError)
|
102
|
+
expect {@client.get_data(dataset, nil) }.to raise_error(ArgumentError)
|
103
|
+
expect {@client.get_data(dataset, "") }.to raise_error(ArgumentError)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe 'RegionalData' do
|
108
|
+
dataset = :RegionalData
|
109
|
+
it 'should not get data values for invalid parameters' do
|
110
|
+
VCR.use_cassette('get data for RegionalData with invalid parameters') do
|
111
|
+
@client = BeaApi::Client.new(api_key)
|
112
|
+
r = @client.get_data(dataset, { "KeyCode" => "PCPI_CI", "GeoFIPS" => "STATE:00000,01000,02000,04000", "Year" => 3009 } )
|
113
|
+
expect(r.error_code).not_to eq(BeaApi::Request::Success)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
it 'should get data values for valid parameters' do
|
117
|
+
VCR.use_cassette('get data for RegionalData with valid parameters') do
|
118
|
+
@client = BeaApi::Client.new(api_key)
|
119
|
+
r = @client.get_data(dataset, { "KeyCode" => "PCPI_CI", "GeoFIPS" => "STATE:00000,01000,02000,04000", "Year" => 2009 } )
|
120
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
121
|
+
expect(r.response.count).to eq(4)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe 'NIPA' do
|
127
|
+
dataset = :NIPA
|
128
|
+
it 'should not get data values for invalid parameters' do
|
129
|
+
VCR.use_cassette('get data for NIPA with invalid parameters') do
|
130
|
+
@client = BeaApi::Client.new(api_key)
|
131
|
+
r = @client.get_data(dataset, { "TableID" => 0, "Frequency" => "A", "Year" => 2009 } )
|
132
|
+
expect(r.error_code).to eq(BeaApi::Request::RetrivalError)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
it 'should get data values for valid parameters' do
|
136
|
+
VCR.use_cassette('get data for NIPA with valid parameters') do
|
137
|
+
@client = BeaApi::Client.new(api_key)
|
138
|
+
r = @client.get_data(dataset, { "TableID" => 1, "Frequency" => "A", "Year" => 2009 } )
|
139
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
140
|
+
expect(r.response.count).to eq(25)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe 'NI Underlying Detail' do
|
146
|
+
dataset = :NIUnderlyingDetail
|
147
|
+
it 'should not get data values for invalid parameters' do
|
148
|
+
VCR.use_cassette('get data for NI Underlying Detail with invalid parameters') do
|
149
|
+
@client = BeaApi::Client.new(api_key)
|
150
|
+
r = @client.get_data(dataset, { "TableID" => 1, "Frequency" => "A", "Year" => 2009 } )
|
151
|
+
expect(r.error_code).to eq(BeaApi::Request::RetrivalError)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
it 'should get data values for valid parameters' do
|
155
|
+
VCR.use_cassette('get data for NI Underlying Detail with valid parameters') do
|
156
|
+
@client = BeaApi::Client.new(api_key)
|
157
|
+
r = @client.get_data(dataset, { "TableID" => 79, "Frequency" => "A", "Year" => 2004 } )
|
158
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
159
|
+
expect(r.response.count).to eq(30)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
describe 'MNE' do
|
165
|
+
dataset = :MNE
|
166
|
+
it 'should not get data values for invalid parameters' do
|
167
|
+
VCR.use_cassette('get data for MNE with invalid parameters') do
|
168
|
+
@client = BeaApi::Client.new(api_key)
|
169
|
+
r = @client.get_data(dataset, { "DirectionOfInvestment" => 'inval', "Classification" => "", "Year" => 2009, "State" => "01" } )
|
170
|
+
#expect(r.error_code).not_to eq(BeaApi::Request::Success)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
it 'should get data values for valid parameters' do
|
174
|
+
VCR.use_cassette('get data for MNE with valid parameters') do
|
175
|
+
@client = BeaApi::Client.new(api_key)
|
176
|
+
r = @client.get_data(dataset, { "DirectionOfInvestment" => 'inward', "Classification" => "Country", "Year" => 2009, "State" => "01" } )
|
177
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
178
|
+
expect(r.response.count).to eq(1544)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
describe 'Fixed Assets' do
|
184
|
+
dataset = :FixedAssets
|
185
|
+
it 'should not get data values for invalid parameters' do
|
186
|
+
VCR.use_cassette('get data for FixedAssets with invalid parameters') do
|
187
|
+
@client = BeaApi::Client.new(api_key)
|
188
|
+
r = @client.get_data(dataset, { "TableID" => 0, "Year" => 2009 } )
|
189
|
+
expect(r.error_code).not_to eq(BeaApi::Request::Success)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
it 'should get data values for valid parameters' do
|
193
|
+
VCR.use_cassette('get data for FixedAssets with valid parameters') do
|
194
|
+
@client = BeaApi::Client.new(api_key)
|
195
|
+
r = @client.get_data(dataset, { "TableID" => 1, "Year" => 2009 } )
|
196
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
197
|
+
expect(r.response.count).to eq(24)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
describe 'ITA' do
|
203
|
+
dataset = :ITA
|
204
|
+
it 'should not get data values for invalid parameters' do
|
205
|
+
VCR.use_cassette('get data for ITA with invalid parameters') do
|
206
|
+
@client = BeaApi::Client.new(api_key)
|
207
|
+
r = @client.get_data(dataset, { "Frequency" => "A", "Year" => 2009 } )
|
208
|
+
expect(r.error_code).not_to eq(BeaApi::Request::Success)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
it 'should get data values for valid parameters' do
|
212
|
+
VCR.use_cassette('get data for ITA with valid parameters') do
|
213
|
+
@client = BeaApi::Client.new(api_key)
|
214
|
+
r = @client.get_data(dataset, { "Indicator" => "CurrAndDepLiabsFoa", "Frequency" => "A", "Year" => 2009 } )
|
215
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
216
|
+
expect(r.response.count).to eq(1)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
it 'should get data values for valid parameters' do
|
220
|
+
VCR.use_cassette('get data for ITA with 2 valid parameters') do
|
221
|
+
@client = BeaApi::Client.new(api_key)
|
222
|
+
r = @client.get_data(dataset, { "Indicator" => "CurrAndDepLiabsFoa", "Frequency" => "A", "Year" => "2009,2010" } )
|
223
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
224
|
+
expect(r.response.count).to eq(2)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
describe 'IIP' do
|
230
|
+
dataset = :IIP
|
231
|
+
it 'should not get data values for invalid parameters' do
|
232
|
+
VCR.use_cassette('get data for IIP with invalid parameters') do
|
233
|
+
@client = BeaApi::Client.new(api_key)
|
234
|
+
r = @client.get_data(dataset, { "Frequency" => "A" } )
|
235
|
+
expect(r.error_code).not_to eq(BeaApi::Request::Success)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
it 'should get data values for valid parameters' do
|
239
|
+
VCR.use_cassette('get data for IIP with valid parameters') do
|
240
|
+
@client = BeaApi::Client.new(api_key)
|
241
|
+
r = @client.get_data(dataset, { "Frequency" => "A", "Year" => 2009 } )
|
242
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
243
|
+
expect(r.response.count).to eq(450)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
describe 'GDPbyIndustry' do
|
249
|
+
dataset = :GDPbyIndustry
|
250
|
+
it 'should not get data values for invalid parameters' do
|
251
|
+
VCR.use_cassette('get data for GDP by Industy with invalid parameters') do
|
252
|
+
@client = BeaApi::Client.new(api_key)
|
253
|
+
r = @client.get_data(dataset, { "Industry" => "12" } )
|
254
|
+
expect(r.error_code).not_to eq(BeaApi::Request::Success)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
it 'should get data values for valid parameters' do
|
258
|
+
VCR.use_cassette('get data for GDP by Frequency with valid parameters') do
|
259
|
+
@client = BeaApi::Client.new(api_key)
|
260
|
+
r = @client.get_data(dataset, { "Industry" => "GDP", "TableID" => 1, "Frequency" => "A", "Year" => 2009 } )
|
261
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
262
|
+
expect(r.response.count).to eq(1)
|
263
|
+
end
|
264
|
+
end
|
265
|
+
it 'should get data values for valid parameters' do
|
266
|
+
VCR.use_cassette('get data for GDP by Frequency with valid parameters') do
|
267
|
+
@client = BeaApi::Client.new(api_key)
|
268
|
+
r = @client.get_data(dataset, { "Industry" => "GDP", "TableID" => 1, "Frequency" => "A", "Year" => "2009,2010" } )
|
269
|
+
expect(r.error_code).to eq(BeaApi::Request::Success)
|
270
|
+
expect(r.response.count).to eq(2)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
end
|
276
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/vcr_setup.rb
ADDED
metadata
ADDED
@@ -0,0 +1,178 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bea_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chad Hoersten
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rest-client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.7'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.7'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-rails
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: vcr
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: webmock
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: codeclimate-test-reporter
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: Ruby wrapper for the US Bureau of Economic Analysis (BEA) API at http://www.bea.gov/api/. This
|
126
|
+
API is used to pull United States economic data by geography.
|
127
|
+
email:
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- .gitignore
|
133
|
+
- Gemfile
|
134
|
+
- LICENSE.txt
|
135
|
+
- README.md
|
136
|
+
- Rakefile
|
137
|
+
- bea_api.gemspec
|
138
|
+
- circle.yml
|
139
|
+
- lib/bea_api.rb
|
140
|
+
- lib/bea_api/client.rb
|
141
|
+
- lib/bea_api/request.rb
|
142
|
+
- lib/bea_api/version.rb
|
143
|
+
- spec/api_key.rb
|
144
|
+
- spec/api_key.rb.ci
|
145
|
+
- spec/bea_api/client_spec.rb
|
146
|
+
- spec/spec_helper.rb
|
147
|
+
- spec/vcr_setup.rb
|
148
|
+
homepage: https://github.com/hoersten/bea_api
|
149
|
+
licenses:
|
150
|
+
- MIT
|
151
|
+
metadata: {}
|
152
|
+
post_install_message:
|
153
|
+
rdoc_options: []
|
154
|
+
require_paths:
|
155
|
+
- lib
|
156
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
requirements: []
|
167
|
+
rubyforge_project:
|
168
|
+
rubygems_version: 2.2.2
|
169
|
+
signing_key:
|
170
|
+
specification_version: 4
|
171
|
+
summary: Ruby wrapper for the US Bureau of Economic Analysis (BEA) API
|
172
|
+
test_files:
|
173
|
+
- spec/api_key.rb
|
174
|
+
- spec/api_key.rb.ci
|
175
|
+
- spec/bea_api/client_spec.rb
|
176
|
+
- spec/spec_helper.rb
|
177
|
+
- spec/vcr_setup.rb
|
178
|
+
has_rdoc:
|