Skip to content

Commit

Permalink
working basic channels and items retrieval
Browse files Browse the repository at this point in the history
  • Loading branch information
zaphar committed Jan 5, 2009
1 parent 46edd41 commit 37c3af3
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 44 deletions.
42 changes: 42 additions & 0 deletions include/rss.hrl
@@ -0,0 +1,42 @@
%% @type channel() = #channel{
%% uri=string(), title=string(), desc=string(),
%% items=Items,
%% language=string(), copyright=string(),
%% managing_editor=string(), web_master=string(),
%% pub_date=string(), last_build_date=string(), category=rss_cat(),
%% generator=string(),
%% docs=string(), cloud=rss_cloud(), ttl=number(),
%% image=rss_image(), rating=string(), text_input=rss_text_input(),
%% skip_hours=rss_number_series(), skip_days=rss_number_series()}
%% Items = [ rssitem() ].

%% @type rssitem() = #rssitem{
%% uri=string(), title=string(), desc=string(), author=string(),
%% pub_date=string(), enclosure=Enclosure, comments=string(),
%% category=Category, guid=Guid, source=Source}
%% Enclosure = rss_enclosure()
%% Category = rss_cat()
%% Guid = rss_guid().

%% @type rss_enclosure() = #rssenclosure{url=string(), length=string(), type=string()}.

%% @type rss_cat() = #rsscategory{domain=string(), value=string()}.

%% @type rss_guid() = #rssguid{isPermaLink=bool(), value=string()}.

%% @type rss_number_series() = [number()].

-record(channel, { %% required elements
uri, title, desc, items,
%% optional elements
language, copyright, managing_editor, web_master,
pub_date, last_build_date, category, generator,
docs, cloud, ttl, image, rating, text_input,
skip_hours, skip_days}).

-record(rssitem, { %% required elements
uri, title, desc,
%% optional elements
author, category, comments,
enclosure, guid, pub_date, source}).

55 changes: 12 additions & 43 deletions src/rss.erl
Expand Up @@ -7,54 +7,23 @@

-include_lib("xmerl/include/xmerl.hrl").

-export([process_rss/1, parse_rss_channels/1]).
-include("rss.hrl").

%% @type channel() = #channel{
%% uri=string(), title=string(), desc=string(),
%% items=Items,
%% language=string(), copyright=string(),
%% managing_editor=string(), web_master=string(),
%% pub_date=string(), last_build_date=string(), category=rss_cat(),
%% generator=string(),
%% docs=string(), cloud=rss_cloud(), ttl=number(),
%% image=rss_image(), rating=string(), text_input=rss_text_input(),
%% skip_hours=rss_number_series(), skip_days=rss_number_series()}
%% Items = [ rssitem() ].

%% @type rssitem() = #rssitem{
%% uri=string(), title=string(), desc=string(), author=string(),
%% pub_date=string(), enclosure=Enclosure, comments=string(),
%% category=Category, guid=Guid, source=Source}
%% Enclosure = rss_enclosure()
%% Category = rss_cat()
%% Guid = rss_guid().

%% @type rss_enclosure() = #rssenclosure{url=string(), length=string(), type=string()}.

%% @type rss_cat() = #rsscategory{domain=string(), value=string()}.

%% @type rss_guid() = #rssguid{isPermaLink=bool(), value=string()}.

%% @type rss_number_series() = [number()].

-record(channel, { %% required elements
uri, title, desc, items,
%% optional elements
language, copyright, managing_editor, web_master,
pub_date, last_build_date, category, generator,
docs, cloud, ttl, image, rating, text_input,
skip_hours, skip_days}).

-record(rssitem, { %% required elements
uri, title, desc,
%% optional elements
author, category, comments,
enclosure, guid, pub_date, source}).
-export([process_rss/1, process_rss/2]).

%% @doc parse out an rss feed
%% @spec process_rss(S::string()) -> [I]
%% @spec process_rss(S) -> [I]
%% S = list() | binary()
%% I = rssitem()
process_rss(S) when is_list(S) ->
process_rss(S, channels).

process_rss(S, Type) when is_binary(S) ->
process_rss(binary_to_list(S), Type);
process_rss(S, channels) when is_list(S) ->
Doc = xml_doc(S),
lists:flatten([ parse_rss_channels(I) || I <- xmerl_xpath:string("//channel", Doc) ]);
process_rss(S, items) when is_list(S) ->
Doc = xml_doc(S),
lists:flatten([ parse_rss_item(I) || I <- xmerl_xpath:string("//item", Doc) ]).

Expand Down
33 changes: 32 additions & 1 deletion t/rss_module_test.erl
Expand Up @@ -5,9 +5,40 @@
-import(etap, [plan/1, ok/2, is/3]).
-import(etap_can, [can_ok/3, loaded_ok/2]).

-include("rss.hrl").

start() ->
plan(3),
loaded_ok(rss, "the rss module has loaded ok"),
can_ok(rss, process_rss, 1),
can_ok(rss, parse_rss_channels, 1),
can_ok(rss, process_rss, 2),
test_channels(),
test_items(),
etap:end_tests().

test_channels() ->
C = rss:process_rss(rss_fixture(2), channels),
ok(is_list(C), "we got back a list"),
is(length(C), 1, "there is only one element in the list"),
[I | T] = C,
ok(is_record(I, channel), "the element is an channel").

test_items() ->
I = rss:process_rss(rss_fixture(2), items),
ok(is_list(I), "we got back another list"),
is(length(I), 4, "there were 4 elements in the list"),
ok(lists:all(fun(Item) -> is_record(Item, rssitem) end, I),
"all the items were rssitem records").

rss_fixture(Vsn) ->
case Vsn of
2 ->
{ok, Result} = file:read_file("../priv/sample-rss-2.xml");
0.92 ->
{ok, Result} = file:read_file("../priv/sample-rss-092.xml");
0.91 ->
{ok, Result} = file:read_file("../priv/sample-rss-091.xml")
end,
Result.


0 comments on commit 37c3af3

Please sign in to comment.