Class: SecQuery::FilingDetail

Inherits:
Object
  • Object
show all
Defined in:
lib/sec_query/filing_detail.rb

Overview

> SecQuery::FilingDetail

SecQuery::FilingDetail requests and parses Filing Detail for any given SecQuery::Filing

Constant Summary collapse

COLUMNS =
[:link, :filing_date, :accepted_date, :period_of_report, :sec_access_number, :document_count, :format_files, :data_files]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filing_detail) ⇒ FilingDetail

Returns a new instance of FilingDetail.



11
12
13
14
15
# File 'lib/sec_query/filing_detail.rb', line 11

def initialize(filing_detail)
  COLUMNS.each do |column|
    instance_variable_set("@#{ column }", filing_detail[column])
  end
end

Class Method Details

.fetch(uri) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/sec_query/filing_detail.rb', line 17

def self.fetch(uri)
  response = RestClient::Request.execute(method: :get, url: uri.to_s.gsub('http:', 'https:'), timeout: 10)
  document = Nokogiri::HTML(response.body)
  filing_date = document.xpath('//*[@id="formDiv"]/div[2]/div[1]/div[2]').text
  accepted_date = document.xpath('//*[@id="formDiv"]/div[2]/div[1]/div[4]').text
  period_of_report = document.xpath('//*[@id="formDiv"]/div[2]/div[2]/div[2]').text
  sec_access_number = document.xpath('//*[@id="secNum"]/text()').text.strip
  document_count = document.xpath('//*[@id="formDiv"]/div[2]/div[1]/div[6]').text.to_i
  format_files_table = document.xpath("//table[@summary='Document Format Files']")
  data_files_table = document.xpath("//table[@summary='Data Files']")

  format_files = (parsed = parse_files(format_files_table)) && (parsed || [])
  data_files = (parsed = parse_files(data_files_table)) && (parsed || [])

  new({uri: uri,
       filing_date: filing_date,
       accepted_date: accepted_date,
       period_of_report: period_of_report,
       sec_access_number: sec_access_number,
       document_count: document_count,
       format_files: format_files,
       data_files: data_files})
end

.parse_files(format_files_table) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/sec_query/filing_detail.rb', line 41

def self.parse_files(format_files_table)
  # get table headers
  headers = []
  format_files_table.xpath('//th').each do |th|
    headers << th.text
  end

  # get table rows
  rows = []
  format_files_table.xpath('//tr').each_with_index do |row, i|
    rows[i] = {}
    row.xpath('td').each_with_index do |td, j|
      if td.children.first && td.children.first.name == 'a'
        relative_url = td.children.first.attributes.first[1].value
        rows[i][headers[j]] = {
            'link' => "https://www.sec.gov#{relative_url}",
            'text' => td.text.gsub(/\A\p{Space}*/, '')
        }
      else
        rows[i][headers[j]] = td.text.gsub(/\A\p{Space}*/, '')
      end
    end
  end

  rows.reject(&:empty?)
end