edgar 0.0.7 → 0.0.8

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.
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: []