edgar 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +15 -0
  2. data/lib/edgar.rb +46 -29
  3. metadata +4 -8
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZjVhODBhODVkNWZiODk3ODkwZTc5NDU1Y2ZmYzFhMWExY2RjMTlhZg==
5
+ data.tar.gz: !binary |-
6
+ YjQyYWE5MTU0MWI2YjhmNTNiNjc2NTIyOWM4ZjYwZjNiYTkyYWYxNQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NmFhOTVlMzM5YzIwN2QwMjRiNjI1ODYzMDM4ZTkxMmIwZDNiY2JmZGE4YmJj
10
+ NjUzZWZlMTgxNWUxNDA2NDhlYjZlMWU0ZDNjNTBmYjJlM2Q1MDUwMzYxZmYx
11
+ ODIxYzBiYzBkZmFjMTQwNWRlYjEyYWIzYjcxNGNkZDBhMzY1OWY=
12
+ data.tar.gz: !binary |-
13
+ NWI0NzhkMjQ2MjI0YjA0Yjg3M2E4MmI3NGIxZDhjOTgwMzQ3Mjg1NDQyMGU3
14
+ NzUyNDk2Yjc2ZjlkZDQ3N2Y2NDI3YWJiYzA4ZmJiZjE0OWFiN2IzMjQ4ZWQ4
15
+ ZGIxZDY5OTcxNmQwYWFkMTJhNTRmZTM0YjM2YzVhMGM5ZmJjMDU=
@@ -4,13 +4,11 @@ require 'rubygems'
4
4
  require 'nokogiri'
5
5
  require 'open-uri'
6
6
 
7
-
8
7
  EdgarResult = Struct.new :title, :abstract, :url, :date
9
8
 
10
-
11
- class Edgar
9
+ class Edgar
12
10
  # API to Edgar search API
13
- #
11
+ #
14
12
  # Example:
15
13
  # >> Edgar.new('[Referer]').search('nano fibers')
16
14
  # => [ #<EdgarResult:...>, ... ]
@@ -19,48 +17,67 @@ class Edgar
19
17
  # referer: (String)
20
18
  # num_results: (Integer+)
21
19
 
22
- API_PATH = "https://searchwww.sec.gov/EDGARFSClient/jsp/EDGAR_MainAccess.jsp"
20
+ API_PATH = 'https://searchwww.sec.gov/EDGARFSClient/jsp/EDGAR_MainAccess.jsp'
21
+ CSS_ATTRS = [
22
+ '#ifrm2 tr i.blue',
23
+ '#ifrm2 tr a.filing',
24
+ '#ifrm2 tr i.small'
25
+ ]
26
+ CSS_TYPES = {
27
+ :date => 0,
28
+ :title_url => 1,
29
+ :abstract => 2
30
+ }
23
31
 
24
32
  attr_accessor :referer, :num_results
25
33
 
26
- def initialize(referer='', num_results=100)
34
+ def initialize(referer = '', num_results = 100)
27
35
  @referer = referer
28
36
  @num_results = num_results
29
37
  end
30
-
38
+
31
39
  def search(query)
32
- params = "?search_text=#{CGI.escape(query)}&sort=Date&formType=1&isAdv=true&stemming=true&numResults=#{@num_results}&numResults=#{@num_results}"
33
- response = open(API_PATH + params, { 'Referer' => @referer })
40
+ params = "?search_text=#{CGI.escape(query)}&sort=Date&formType=1&isAdv=true&stemming=true&numResults=#{@num_results}"
41
+ response = open(API_PATH + params, 'Referer' => @referer)
34
42
  return nil if response.class.superclass == Net::HTTPServerError
35
43
  doc = Nokogiri::HTML(response)
36
44
  # check that results were returned
37
45
  no_results = doc.css('#ifrm2 font.normalbold')[0]
38
- return [] if no_results and no_results.content == 'No Results were Found.'
46
+ return [] if no_results && no_results.content == 'No Results were Found.'
39
47
  # fetch number of results so we slice properly
40
48
  num_returned = doc.css('#header td:first > font.normalbold')[0]
41
- return [] if num_returned == nil
49
+ return [] if num_returned.nil?
42
50
  num_returned = num_returned.content.match(/- (\d+)/)[1].to_i
43
- css_types = {
44
- :date => 0,
45
- :title_url => 1,
46
- :abstract => 2
47
- }
48
- css_attrs = [
49
- '#ifrm2 tr i.blue',
50
- '#ifrm2 tr a.filing',
51
- '#ifrm2 tr i.small'
52
- ]
53
- tag_sets = doc.css(css_attrs.join(', ')).each_slice(num_returned).map do |el|
54
- el
55
- end.transpose
51
+ build_results(doc, num_returned)
52
+ end
53
+
54
+ private
55
+
56
+ def build_results(doc, num_returned)
57
+ tag_sets = doc.css(CSS_ATTRS.join(', ')).each_slice(num_returned)
58
+ tag_sets = safe_transpose(tag_sets)
56
59
  tag_sets.map do |tag_set|
57
60
  EdgarResult.new(
58
- tag_set[css_types[:title_url]].content,
59
- tag_set[css_types[:abstract]].content,
60
- tag_set[css_types[:title_url]]['href'].match(/'([^']+)'/)[1],
61
- tag_set[css_types[:date]].content
61
+ get_tag(tag_set, :title_url),
62
+ get_tag(tag_set, :abstract),
63
+ get_url(tag_set),
64
+ get_tag(tag_set, :date)
62
65
  )
63
66
  end
64
67
  end
65
- end
66
68
 
69
+ def get_url(tag_set)
70
+ node = tag_set[CSS_TYPES[:title_url]]
71
+ node && node['href'].match(/'([^']+)'/)[1]
72
+ end
73
+
74
+ def get_tag(tag_set, key)
75
+ node = tag_set[CSS_TYPES[key]]
76
+ node && node.content
77
+ end
78
+
79
+ def safe_transpose(a)
80
+ max_size = a.map(&:size).max
81
+ a.dup.map { |r| r << nil while r.size < max_size; r}.transpose
82
+ end
83
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edgar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
5
- prerelease:
4
+ version: 0.0.8
6
5
  platform: ruby
7
6
  authors:
8
7
  - Peter Lubell-Doughtie
@@ -14,7 +13,6 @@ dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: nokogiri
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -36,26 +33,25 @@ files:
36
33
  - lib/edgar.rb
37
34
  homepage: http://www.helioid.com/
38
35
  licenses: []
36
+ metadata: {}
39
37
  post_install_message:
40
38
  rdoc_options: []
41
39
  require_paths:
42
40
  - lib
43
41
  required_ruby_version: !ruby/object:Gem::Requirement
44
- none: false
45
42
  requirements:
46
43
  - - ! '>='
47
44
  - !ruby/object:Gem::Version
48
45
  version: '0'
49
46
  required_rubygems_version: !ruby/object:Gem::Requirement
50
- none: false
51
47
  requirements:
52
48
  - - ! '>='
53
49
  - !ruby/object:Gem::Version
54
50
  version: '0'
55
51
  requirements: []
56
52
  rubyforge_project:
57
- rubygems_version: 1.8.23
53
+ rubygems_version: 2.1.10
58
54
  signing_key:
59
- specification_version: 3
55
+ specification_version: 4
60
56
  summary: API for SEC Edgar search
61
57
  test_files: []