sec 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +0 -1
- data/README.rdoc +2 -0
- data/Rakefile +13 -0
- data/lib/sec/connection.rb +14 -7
- data/lib/sec/reader.rb +12 -13
- data/lib/sec/version.rb +1 -1
- data/spec/connection_spec.rb +27 -2
- data/spec/reader_spec.rb +27 -12
- data/spec/support/request_library/reader.yml +18 -15
- metadata +4 -4
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -1 +1,14 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
|
4
|
+
# https://github.com/mongoid/mongoid/blob/master/Rakefile
|
5
|
+
RSpec::Core::RakeTask.new("spec") do |spec|
|
6
|
+
spec.pattern = "spec/**/*_spec.rb"
|
7
|
+
end
|
8
|
+
|
9
|
+
RSpec::Core::RakeTask.new('spec:progress') do |spec|
|
10
|
+
spec.rspec_opts = %w(--format progress)
|
11
|
+
spec.pattern = "spec/**/*_spec.rb"
|
12
|
+
end
|
13
|
+
|
14
|
+
task :default => :spec
|
data/lib/sec/connection.rb
CHANGED
@@ -1,25 +1,32 @@
|
|
1
1
|
module Sec
|
2
2
|
class Connection
|
3
|
+
class Error < StandardError; end
|
3
4
|
|
4
5
|
require 'patron'
|
5
6
|
|
6
|
-
|
7
|
+
BASE_URL = 'http://www.sec.gov'
|
8
|
+
CONNECT_TIMEOUT = 30
|
9
|
+
SUCCESSFUL_RESPONSE = 200
|
10
|
+
TIMEOUT = 120
|
7
11
|
|
8
|
-
|
12
|
+
attr_accessor :session
|
9
13
|
|
10
14
|
DEFAULT_SESSION_ATTRIBUTES = {
|
11
|
-
:base_url =>
|
12
|
-
:connect_timeout =>
|
13
|
-
:timeout =>
|
15
|
+
:base_url => BASE_URL,
|
16
|
+
:connect_timeout => CONNECT_TIMEOUT,
|
17
|
+
:timeout => TIMEOUT
|
14
18
|
}
|
15
19
|
|
16
20
|
def initialize(attrs={})
|
17
|
-
|
21
|
+
self.session = Patron::Session.new
|
18
22
|
configure_session(attrs)
|
19
23
|
end
|
20
24
|
|
21
25
|
def get(uri)
|
22
|
-
|
26
|
+
response = session.get(uri)
|
27
|
+
response.body if response.respond_to?(:body)
|
28
|
+
rescue Patron::Error => error
|
29
|
+
raise Error, error.message
|
23
30
|
end
|
24
31
|
|
25
32
|
private
|
data/lib/sec/reader.rb
CHANGED
@@ -6,6 +6,8 @@ module Sec
|
|
6
6
|
|
7
7
|
MONTHLY_PATH = %q{/Archives/edgar/monthly/xbrlrss-%{year}-%{month}.xml}
|
8
8
|
|
9
|
+
attr_accessor :connection
|
10
|
+
|
9
11
|
def self.get_monthly_index(year, month)
|
10
12
|
reader = Reader.new
|
11
13
|
reader.get_monthly_index(year, month)
|
@@ -16,25 +18,22 @@ module Sec
|
|
16
18
|
reader.get_xbrl_file(url)
|
17
19
|
end
|
18
20
|
|
21
|
+
def initialize(attrs={})
|
22
|
+
self.connection = Connection.new(attrs)
|
23
|
+
end
|
24
|
+
|
19
25
|
def get_monthly_index(year, month)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
else
|
25
|
-
nil
|
26
|
-
end
|
26
|
+
response = connection.get(monthly_query_uri(year, month))
|
27
|
+
Crack::XML.parse(response)
|
28
|
+
rescue => error
|
29
|
+
raise Error, error.message
|
27
30
|
end
|
28
31
|
|
29
32
|
def get_xbrl_file(url)
|
30
|
-
|
33
|
+
connection.get(uri_path(url))
|
31
34
|
end
|
32
35
|
|
33
36
|
private
|
34
|
-
def connection(attrs={})
|
35
|
-
Connection.new
|
36
|
-
end
|
37
|
-
|
38
37
|
def prepend_zero(month)
|
39
38
|
month = month.to_s
|
40
39
|
month.prepend("0") if month.size == 1
|
@@ -45,7 +44,7 @@ module Sec
|
|
45
44
|
end
|
46
45
|
|
47
46
|
def uri_path(url)
|
48
|
-
url.gsub(
|
47
|
+
url.gsub(/http:\/\/www\.sec\.gov/, '')
|
49
48
|
end
|
50
49
|
end
|
51
50
|
end
|
data/lib/sec/version.rb
CHANGED
data/spec/connection_spec.rb
CHANGED
@@ -10,11 +10,29 @@ module Sec
|
|
10
10
|
expect(session).to be_kind_of(Patron::Session)
|
11
11
|
end
|
12
12
|
|
13
|
-
it 'should use the SEC
|
14
|
-
expected =
|
13
|
+
it 'should use the SEC BASE_URL value' do
|
14
|
+
expected = Sec::Connection::BASE_URL
|
15
15
|
|
16
16
|
expect(session.base_url).to eq(expected)
|
17
17
|
end
|
18
|
+
|
19
|
+
it 'sets the default connect timeout to CONNECT_TIMEOUT value' do
|
20
|
+
expected = Sec::Connection::CONNECT_TIMEOUT
|
21
|
+
|
22
|
+
expect(session.connect_timeout).to eq(expected)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'sets the default timeout to TIMEOUT value' do
|
26
|
+
expected = Sec::Connection::TIMEOUT
|
27
|
+
|
28
|
+
expect(session.timeout).to eq(expected)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'sets custom attributes' do
|
32
|
+
connection = Connection.new({ :timeout => 600 })
|
33
|
+
|
34
|
+
expect(connection.session.timeout).to eq(600)
|
35
|
+
end
|
18
36
|
end
|
19
37
|
|
20
38
|
describe '.get' do
|
@@ -23,6 +41,13 @@ module Sec
|
|
23
41
|
|
24
42
|
connection.get('/some_path')
|
25
43
|
end
|
44
|
+
|
45
|
+
it 'raises a Connection::Error when there is a Patron error' do
|
46
|
+
error = Patron::Error.new
|
47
|
+
session.stub(:get).and_raise(error)
|
48
|
+
|
49
|
+
expect { connection.get('/some_path') }.to raise_error(Connection::Error)
|
50
|
+
end
|
26
51
|
end
|
27
52
|
end
|
28
53
|
end
|
data/spec/reader_spec.rb
CHANGED
@@ -4,34 +4,49 @@ module Sec
|
|
4
4
|
describe Reader do
|
5
5
|
use_vcr_cassette 'reader'
|
6
6
|
|
7
|
-
let(:
|
8
|
-
let(:reader) { Reader.new }
|
7
|
+
let(:monthly_index) { Reader.get_monthly_index(2012, 1) }
|
9
8
|
|
10
9
|
describe '.get_monthly_index' do
|
11
|
-
|
10
|
+
# TODO: figure out why this doesnt work
|
11
|
+
xit 'send a GET to Connection' do
|
12
|
+
connection = Connection.new
|
13
|
+
Connection.stub(:new).and_return(connection)
|
14
|
+
connection.should_receive(:get).with("/Archives/edgar/monthly/xbrlrss-2012-01.xml")
|
15
|
+
|
16
|
+
Reader.get_monthly_index(2012, 1)
|
17
|
+
end
|
12
18
|
|
13
19
|
it 'returns a hash' do
|
14
|
-
expect(
|
20
|
+
expect(monthly_index).to be_kind_of(Hash)
|
15
21
|
end
|
16
22
|
|
17
|
-
it '
|
18
|
-
expect(
|
23
|
+
it 'returns the correct top level key' do
|
24
|
+
expect(monthly_index.keys).to eq(['rss'])
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'raises an error when the response isnt valid' do
|
28
|
+
Crack::XML.stub(:parse).and_raise(StandardError)
|
29
|
+
|
30
|
+
expect { Reader.get_monthly_index(2012, 1) }.to raise_error(Reader::Error)
|
19
31
|
end
|
20
32
|
end
|
21
33
|
|
22
34
|
describe '.get_xbrl_file' do
|
23
35
|
url = "http://www.sec.gov/Archives/edgar/data/840715/000084071512000011/clro-20111231_pre.xml"
|
24
|
-
let(:
|
25
|
-
|
26
|
-
it 'should receive a 200 response code' do
|
27
|
-
expect(response.status).to eq(200)
|
28
|
-
end
|
36
|
+
let(:xbrl_file) { Reader.get_xbrl_file(url) }
|
29
37
|
|
30
38
|
# multiple file types, we'll test one
|
31
39
|
# I want a more consistent return between the two,
|
32
40
|
# one of the TODOs as I use this gem more
|
33
41
|
it 'should return an XML string' do
|
34
|
-
expect(
|
42
|
+
expect(xbrl_file).to match(/xml\sversion/)
|
43
|
+
end
|
44
|
+
|
45
|
+
xit 'raises an error when the respone isnt valid' do
|
46
|
+
error = Connection::Error.new
|
47
|
+
Connection.stub(:get).and_raise(error)
|
48
|
+
|
49
|
+
expect { Reader.get_xbrl_file(url) }.to raise_error(Connection::Error)
|
35
50
|
end
|
36
51
|
end
|
37
52
|
end
|
@@ -20,10 +20,10 @@ http_interactions:
|
|
20
20
|
U0VD
|
21
21
|
!binary "TGFzdC1Nb2RpZmllZA==":
|
22
22
|
- !binary |-
|
23
|
-
|
23
|
+
U3VuLCAyMiBBcHIgMjAxMiAxNjozMjo0OCBHTVQ=
|
24
24
|
!binary "RXRhZw==":
|
25
25
|
- !binary |-
|
26
|
-
|
26
|
+
IjRiZTQ3MTI2ZTBjMDAi
|
27
27
|
!binary "Q29udGVudC1UeXBl":
|
28
28
|
- !binary |-
|
29
29
|
YXBwbGljYXRpb24veG1s
|
@@ -32,10 +32,10 @@ http_interactions:
|
|
32
32
|
bWF4LWFnZT0w
|
33
33
|
!binary "RXhwaXJlcw==":
|
34
34
|
- !binary |-
|
35
|
-
|
35
|
+
TW9uLCAyOCBKYW4gMjAxMyAyMjozNTo0NSBHTVQ=
|
36
36
|
!binary "RGF0ZQ==":
|
37
37
|
- !binary |-
|
38
|
-
|
38
|
+
TW9uLCAyOCBKYW4gMjAxMyAyMjozNTo0NSBHTVQ=
|
39
39
|
!binary "VHJhbnNmZXItRW5jb2Rpbmc=":
|
40
40
|
- !binary |-
|
41
41
|
Y2h1bmtlZA==
|
@@ -60,9 +60,9 @@ http_interactions:
|
|
60
60
|
b3JnLzIwMDUvQXRvbSIvPgogICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSBs
|
61
61
|
aXN0IGFsbCBvZiB0aGUgZmlsaW5ncyBjb250YWluaW5nIFhCUkwgZm9yIDIw
|
62
62
|
MTItMDE8L2Rlc2NyaXB0aW9uPgogICAgPGxhbmd1YWdlPmVuLXVzPC9sYW5n
|
63
|
-
|
63
|
+
dWFnZT4KICAgIDxwdWJEYXRlPlN1biwgMjIgQXByIDIwMTIgMTI6MzE6NTYg
|
64
64
|
RURUPC9wdWJEYXRlPgogICAgPGxhc3RCdWlsZERhdGU+U3VuLCAyMiBBcHIg
|
65
|
-
|
65
|
+
MjAxMiAxMjozMTo1NiBFRFQ8L2xhc3RCdWlsZERhdGU+CiAgICA8aXRlbT4K
|
66
66
|
ICAgICAgPHRpdGxlPkFNQVpPTiBDT00gSU5DICgwMDAxMDE4NzI0KSAoRmls
|
67
67
|
ZXIpPC90aXRsZT4KICAgICAgPGxpbms+aHR0cDovL3d3dy5zZWMuZ292L0Fy
|
68
68
|
Y2hpdmVzL2VkZ2FyL2RhdGEvMTAxODcyNC8wMDAxMTkzMTI1MTIwMzI4NDYv
|
@@ -94292,7 +94292,7 @@ http_interactions:
|
|
94292
94292
|
ICAgPC9lZGdhcjp4YnJsRmlsZXM+CiAgICAgIDwvZWRnYXI6eGJybEZpbGlu
|
94293
94293
|
Zz4KICAgIDwvaXRlbT4KICA8L2NoYW5uZWw+CjwvcnNzPgo=
|
94294
94294
|
http_version:
|
94295
|
-
recorded_at:
|
94295
|
+
recorded_at: Mon, 28 Jan 2013 22:36:22 GMT
|
94296
94296
|
- request:
|
94297
94297
|
method: get
|
94298
94298
|
uri: http://www.sec.gov/Archives/edgar/data/840715/000084071512000011/clro-20111231_pre.xml
|
@@ -94308,15 +94308,15 @@ http_interactions:
|
|
94308
94308
|
message: !binary |-
|
94309
94309
|
T0s=
|
94310
94310
|
headers:
|
94311
|
-
!binary "U2VydmVy":
|
94312
|
-
- !binary |-
|
94313
|
-
U0VD
|
94314
94311
|
!binary "TGFzdC1Nb2RpZmllZA==":
|
94315
94312
|
- !binary |-
|
94316
|
-
|
94313
|
+
TW9uLCAwMiBBcHIgMjAxMiAxMDoxMDowNCBHTVQ=
|
94317
94314
|
!binary "RXRhZw==":
|
94318
94315
|
- !binary |-
|
94319
|
-
|
94316
|
+
IjRiY2FmNjRkN2I3MDAi
|
94317
|
+
!binary "U2VydmVy":
|
94318
|
+
- !binary |-
|
94319
|
+
U0VD
|
94320
94320
|
!binary "Q29udGVudC1UeXBl":
|
94321
94321
|
- !binary |-
|
94322
94322
|
YXBwbGljYXRpb24veG1s
|
@@ -94325,10 +94325,10 @@ http_interactions:
|
|
94325
94325
|
bWF4LWFnZT0w
|
94326
94326
|
!binary "RXhwaXJlcw==":
|
94327
94327
|
- !binary |-
|
94328
|
-
|
94328
|
+
TW9uLCAyOCBKYW4gMjAxMyAyMjo1MzowOCBHTVQ=
|
94329
94329
|
!binary "RGF0ZQ==":
|
94330
94330
|
- !binary |-
|
94331
|
-
|
94331
|
+
TW9uLCAyOCBKYW4gMjAxMyAyMjo1MzowOCBHTVQ=
|
94332
94332
|
!binary "VHJhbnNmZXItRW5jb2Rpbmc=":
|
94333
94333
|
- !binary |-
|
94334
94334
|
Y2h1bmtlZA==
|
@@ -94337,6 +94337,9 @@ http_interactions:
|
|
94337
94337
|
VHJhbnNmZXItRW5jb2Rpbmc=
|
94338
94338
|
- !binary |-
|
94339
94339
|
a2VlcC1hbGl2ZQ==
|
94340
|
+
!binary "U2V0LUNvb2tpZQ==":
|
94341
|
+
- !binary |-
|
94342
|
+
ZGF0YWNlbnRlcj1kYzIgOyBQYXRoPS8=
|
94340
94343
|
body:
|
94341
94344
|
encoding: ASCII-8BIT
|
94342
94345
|
string: !binary |-
|
@@ -96115,5 +96118,5 @@ http_interactions:
|
|
96115
96118
|
ZGVyPScxLjAnLz4KCTwvbGluazpwcmVzZW50YXRpb25MaW5rPgo8L2xpbms6
|
96116
96119
|
bGlua2Jhc2U+Cg==
|
96117
96120
|
http_version:
|
96118
|
-
recorded_at: Mon,
|
96121
|
+
recorded_at: Mon, 28 Jan 2013 22:53:13 GMT
|
96119
96122
|
recorded_with: VCR 2.3.0
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: crack
|
@@ -161,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
161
161
|
version: '0'
|
162
162
|
segments:
|
163
163
|
- 0
|
164
|
-
hash:
|
164
|
+
hash: -3634642483232780340
|
165
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
166
|
none: false
|
167
167
|
requirements:
|
@@ -170,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
170
170
|
version: '0'
|
171
171
|
segments:
|
172
172
|
- 0
|
173
|
-
hash:
|
173
|
+
hash: -3634642483232780340
|
174
174
|
requirements: []
|
175
175
|
rubyforge_project:
|
176
176
|
rubygems_version: 1.8.23
|