Skip to content

Commit

Permalink
Added parsing press release feed
Browse files Browse the repository at this point in the history
  • Loading branch information
joeychilson committed Jul 12, 2023
1 parent 915589a commit 4b6d128
Show file tree
Hide file tree
Showing 7 changed files with 339 additions and 4 deletions.
21 changes: 21 additions & 0 deletions lib/edgar.ex
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,27 @@ defmodule EDGAR do
"""
def parse_company_feed(xml), do: EDGAR.Native.parse_company_feed(xml)

@doc """
Fetches the press release feed
"""
def press_release_feed do
url = "https://www.sec.gov/news/pressreleases.rss"

with {:ok, body} <- get(url),
result <- parse_press_release_feed(body) do
result
end
end

@doc """
Parses the press release feed
## Required
* `xml` - The RSS feed xml to parse
"""
def parse_press_release_feed(xml), do: EDGAR.Native.parse_press_release_feed(xml)

@doc false
defp get_json(url) do
SimpleRateLimiter.wait_and_proceed(fn ->
Expand Down
5 changes: 3 additions & 2 deletions lib/edgar/native.ex
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@ defmodule EDGAR.Native do
mode: mode,
force_build: System.get_env("EDGAR_CLIENT_BUILD") in ["1", "true"]

def parse_current_feed(_xml), do: :erlang.nif_error(:nif_not_loaded)
def parse_company_feed(_xml), do: :erlang.nif_error(:nif_not_loaded)
def parse_13f_document(_xml), do: :erlang.nif_error(:nif_not_loaded)
def parse_13f_table(_xml), do: :erlang.nif_error(:nif_not_loaded)
def parse_current_feed(_xml), do: :erlang.nif_error(:nif_not_loaded)
def parse_company_feed(_xml), do: :erlang.nif_error(:nif_not_loaded)
def parse_ownership_form(_xml), do: :erlang.nif_error(:nif_not_loaded)
def parse_press_release_feed(_xml), do: :erlang.nif_error(:nif_not_loaded)
def parse_xbrl(_xml), do: :erlang.nif_error(:nif_not_loaded)
end
7 changes: 5 additions & 2 deletions native/edgar_parser/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,23 +1,26 @@
mod company_feed;
mod current_feed;
mod ownership;
mod press_release_feed;
mod thirteenf;
mod xbrl;

use company_feed::parse_company_feed;
use current_feed::parse_current_feed;
use ownership::parse_ownership_form;
use press_release_feed::parse_press_release_feed;
use thirteenf::{parse_13f_document, parse_13f_table};
use xbrl::parse_xbrl;

rustler::init!(
"Elixir.EDGAR.Native",
[
parse_13f_document,
parse_13f_table,
parse_company_feed,
parse_current_feed,
parse_ownership_form,
parse_13f_document,
parse_13f_table,
parse_press_release_feed,
parse_xbrl,
]
);
Expand Down
57 changes: 57 additions & 0 deletions native/edgar_parser/src/press_release_feed.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
use crate::get_string;
use roxmltree::Document as XMLDoc;
use rustler::NifMap;

#[derive(NifMap)]
pub struct Feed {
title: Option<String>,
link: Option<String>,
description: Option<String>,
language: Option<String>,
items: Vec<Item>,
}

#[derive(NifMap)]
pub struct Item {
title: Option<String>,
link: Option<String>,
description: Option<String>,
pub_date: Option<String>,
}

#[rustler::nif]
pub fn parse_press_release_feed(xml: &str) -> Result<Feed, String> {
let doc = XMLDoc::parse(xml).map_err(|e| e.to_string())?;
let root_node = doc.root_element().first_element_child().unwrap();

let title = get_string(&root_node, "title");
let link = get_string(&root_node, "link");
let description = get_string(&root_node, "description");
let language = get_string(&root_node, "language");

let items = root_node
.children()
.filter(|n| n.has_tag_name("item"))
.map(|item_node| {
let title = get_string(&item_node, "title");
let link = get_string(&item_node, "link");
let description = get_string(&item_node, "description");
let pub_date = get_string(&item_node, "pubDate");

Ok::<Item, String>(Item {
title,
link,
description,
pub_date,
})
})
.collect::<Result<Vec<Item>, String>>()?;

Ok(Feed {
title,
link,
description,
language,
items,
})
}
6 changes: 6 additions & 0 deletions test/edgar_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,12 @@ defmodule EDGARTest do
assert current_feed.author.name == "Webmaster"
end

test "parsing press release feed" do
press_release_feed = EDGAR.press_release_feed()
assert {:ok, press_release_feed} = press_release_feed
assert press_release_feed.title == "Press Releases"
end

test "parsing xbrl" do
xbrl =
EDGAR.parse_xbrl_from_url(
Expand Down
6 changes: 6 additions & 0 deletions test/parser_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,10 @@ defmodule EDGARTest.Parser do
{:ok, feed} = EDGAR.Native.parse_company_feed(file)
assert feed.id == "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000789019"
end

test "parsing press_release_feed" do
{:ok, file} = File.read("test/test_data/press_release_feed.xml")
{:ok, feed} = EDGAR.Native.parse_press_release_feed(file)
assert feed.title == "Press Releases"
end
end
Loading

0 comments on commit 4b6d128

Please sign in to comment.