aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Conway <john.a.conway@gmail.com>2019-05-08 15:57:35 +0100
committerJohn Conway <john.a.conway@gmail.com>2019-05-08 15:57:35 +0100
commit01d296acb19c2f00d1868c2c74c2a3fd3a80fb53 (patch)
tree5b5727c8cda49d9375b543f444c7290fbaf589bb
parent1aed195f821ed1f087ff46e00e6b3b4320e0bdb9 (diff)
downloadfeed-nim-01d296acb19c2f00d1868c2c74c2a3fd3a80fb53.tar.gz
feed-nim-01d296acb19c2f00d1868c2c74c2a3fd3a80fb53.zip
[Atom] Writing tests, fixing bugs
-rw-r--r--src/feednim/atom.nim66
-rw-r--r--tests/__test1.nim (renamed from tests/test1.nim)2
-rwxr-xr-xtests/test_atombin0 -> 409560 bytes
-rw-r--r--tests/test_atom.nim15
-rw-r--r--tests/test_atom.xml74
5 files changed, 95 insertions, 62 deletions
diff --git a/src/feednim/atom.nim b/src/feednim/atom.nim
index 3699e20..9fce652 100644
--- a/src/feednim/atom.nim
+++ b/src/feednim/atom.nim
@@ -11,6 +11,8 @@ import xmltree
import streams
import sugar
+import marshal
+
type
Atom* = object
author: AtomAuthor # Sugar, not in Atom spec. Returns the first author.
@@ -18,7 +20,7 @@ type
title*: string # Required Atom field
updated*: string # Required Atom field
authors*: seq[AtomAuthor] # Pleuralised because the Atom spec allows more than one
- categories*: seq[string]
+ categories*: seq[AtomCategory]
contributors*: seq[AtomAuthor]
generator*: string
icon*: string
@@ -26,13 +28,18 @@ type
logo*: string
rights*: string
subtitle*: string
- entrys*: seq[AtomEntry]
+ entries*: seq[AtomEntry]
AtomAuthor* = object
name*: string # Required Atom field
uri*: string
email*: string
+ AtomCategory* = object
+ term*: string
+ label*: string
+ scheme*: string
+
AtomLink* = object
href*: string
rel*: string
@@ -47,7 +54,7 @@ type
updated*: string # Required Atom field
author: AtomAuthor # Sugar, not in Atom spec. Returns the first author.
authors*: seq[AtomAuthor] # Pleuralised because the Atom spec allows more than one
- categories*: seq[string]
+ categories*: seq[AtomCategory]
content*: string
contentSrc*: string
contentType*: string
@@ -61,7 +68,7 @@ type
AtomSource* = object
author: AtomAuthor # Sugar, not in Atom spec. Returns the first author.
authors: seq[AtomAuthor]
- categories*: seq[string]
+ categories*: seq[AtomCategory]
contributors*: seq[AtomAuthor]
generator*: string
icon*: string
@@ -82,19 +89,32 @@ proc parseAuthors ( node: XmlNode, mode="author") : seq[AtomAuthor] =
if athr_node.child("uri") != nil: author.uri = athr_node.child("uri").innerText
if athr_node.child("email") != nil: author.email = athr_node.child("email").innerText
authors.add(author)
-
+ if authors.len == 0: return @[]
return authors
+proc parseCategories ( node: XmlNode ) : seq[AtomCategory] =
+ var categories:seq[AtomCategory]
+ if node.child("category") != nil:
+ for cat_node in node.findAll("category"):
+ var category: AtomCategory = AtomCategory()
+ if cat_node.attr("term") != "": category.term = cat_node.attr("term")
+ if cat_node.attr("label") != "": category.label = cat_node.attr("label")
+ if cat_node.attr("scheme") != "": category.scheme = cat_node.attr("scheme")
+
+ categories.add(category)
+
+ if categories.len == 0: return @[]
+ return categories
+
proc parseLink ( node: XmlNode ): AtomLink =
var link: AtomLink = AtomLink()
if node.attrs != nil:
- if node.attr("href") != "": link.href = node.attr("href")
+ if node.attr("href") != "": link.href = node.attr("rel")
if node.attr("rel") != "": link.rel = node.attr("rel")
if node.attr("type") != "": link.linktype = node.attr("type")
- if node.attr("hreflang") != "": link.rel = node.attr("hreflang")
- if node.attr("title") != "": link.rel = node.attr("title")
- if node.attr("length") != "": link.rel = node.attr("length")
-
+ if node.attr("hreflang") != "": link.hreflang = node.attr("hreflang")
+ if node.attr("title") != "": link.title = node.attr("title")
+ if node.attr("length") != "": link.length = node.attr("length")
return link
proc parseEntry( node: XmlNode) : AtomEntry =
@@ -108,8 +128,7 @@ proc parseEntry( node: XmlNode) : AtomEntry =
# Fill the optinal fields
entry.authors = node.parseAuthors()
- if node.child("category") != nil:
- entry.categories = map(node.findAll("category"), (x: XmlNode) -> string => x.innerText)
+ if node.child("category") != nil: entry.categories = node.parseCategories()
if node.child("content") != nil:
entry.content = node.child("content").innerText
@@ -128,19 +147,21 @@ proc parseEntry( node: XmlNode) : AtomEntry =
if node.child("source") != nil:
let source = node.child("source")
- if node.child("author") != nil: entry.source.authors = source.parseAuthors()
- if node.child("category") != nil: entry.source.categories = map(source.findAll("category"), (x: XmlNode) -> string => x.innerText)
- if node.child("contributor") != nil: entry.source.contributors = source.parseAuthors(mode="contributor")
+ if source.child("author") != nil: entry.source.authors = source.parseAuthors()
+ if source.child("category") != nil: entry.source.categories = source.parseCategories()
+ if source.child("contributor") != nil: entry.source.contributors = source.parseAuthors(mode="contributor")
if source.child("generator") != nil: entry.source.generator = source.child("generator").innerText
- if source.child("icon") != nil: entry.source.generator = source.child("icon").innerText
+ if source.child("icon") != nil: entry.source.icon = source.child("icon").innerText
if source.child("id") != nil: entry.source.id = source.child("id").innerText
- if source.child("link") != nil: entry.source.link = parseLink( source )
+ if source.child("link") != nil: entry.source.link = source.child("link").parseLink()
if source.child("logo") != nil: entry.source.logo = source.child("logo").innerText
if source.child("rights") != nil: entry.source.rights = source.child("rights").innerText
if source.child("subtitle") != nil: entry.source.subtitle = source.child("subtitle").innerText
if source.child("title") != nil: entry.source.title = source.child("title").innerText
if source.child("updated") != nil: entry.source.updated = source.child("updated").innerText
+ entry.source.author = entry.source.authors[0]
+
if node.child("summary") != nil: entry.summary = node.child("summary").innerText
# SUGAR an easy way to access an author
@@ -168,8 +189,7 @@ proc parseAtom*(data: string): Atom =
# Fill in the optional fields
if node.child("author") != nil: atom.authors = node.parseAuthors()
- if node.child("category") != nil:
- atom.categories = map(node.findAll("category"), (x: XmlNode) -> string => x.innerText)
+ if node.child("category") != nil: atom.categories = node.parseCategories()
if node.child("contributor") != nil: atom.contributors = node.parseAuthors(mode="contributor")
@@ -190,14 +210,14 @@ proc parseAtom*(data: string): Atom =
else:
atom.author = AtomAuthor()
- # If there are no entrys:
+ # If there are no entries:
if node.child("entry") == nil:
- atom.entrys = @[]
+ atom.entries = @[]
return atom
- # Otherwise, add the entrys.
+ # Otherwise, add the entries.
if node.child("entry") != nil:
- atom.entrys = map( node.findAll("entry"), parseEntry )
+ atom.entries = map( node.findAll("entry"), parseEntry )
# Return the Atom data.
return atom
diff --git a/tests/test1.nim b/tests/__test1.nim
index 0ff07eb..185df0e 100644
--- a/tests/test1.nim
+++ b/tests/__test1.nim
@@ -7,6 +7,6 @@
import unittest
-import FeedNim
+import feednim
test "can add":
check add(5, 5) == 10
diff --git a/tests/test_atom b/tests/test_atom
new file mode 100755
index 0000000..991e0e6
--- /dev/null
+++ b/tests/test_atom
Binary files differ
diff --git a/tests/test_atom.nim b/tests/test_atom.nim
index 3d563da..c4c65f9 100644
--- a/tests/test_atom.nim
+++ b/tests/test_atom.nim
@@ -5,12 +5,19 @@
#
# To run these tests, simply execute `nimble test`.
+import unittest
+import marshal
+import feednim
+test "Read Valid Atom Feed":
+ let feed = "./tests/test_atom.xml".loadAtom()
-import unittest
+ echo $$feed
-import FeedNim
-test "can add":
- check add(5, 5) == 10
+ check feed.title != ""
+ check feed.generator != ""
+ check feed.authors[0].name == "Joe Bloggs"
+ check feed.authors[0].uri == "http://joe.bloggs"
+ check feed.authors[0].email == "mail@joe.bloggs" \ No newline at end of file
diff --git a/tests/test_atom.xml b/tests/test_atom.xml
index 64f443d..5ea44a2 100644
--- a/tests/test_atom.xml
+++ b/tests/test_atom.xml
@@ -3,30 +3,37 @@
<id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>
<title>Bloggs's Planes Trains and Automobiles</title>
<updated>2003-12-13T18:30:02Z</updated>
+
<author>
<name>Joe Bloggs</name>
<uri>http://joe.bloggs</uri>
<email>mail@joe.bloggs</email>
</author>
+
<contributor>
<name>Jane Bloggs</name>
</contributor>
- <category>Planes</category>
- <category>Trains</category>
- <category>Automobiles</category>
- <generator>nim<generator>
+
+ <category term="planes" label="Planes" scheme="http://awesomecategories.org"/>
+ <category term="trains" label="Trains" />
+ <category term="automobiles" label="Automobiles" />
+
+ <generator uri="https://github.com/dom96/jester">Jester</generator>
+
<icon>http://joe.bloggs/mug,jpg</icon>
+
<link
- href="http://joe.bloggs/american"
- rel="alternate"
- type="application/xml+rss"
- hreflang="en-US"
- title="Ye-ha"
+ href="http://joe.bloggs/atom"
+ rel="self"
+ type="application/xml+atom"
+ hreflang="en-GB"
+ title="Bloggs's Planes Trains and Automobiles"
length="1000000"
/>
- <logo>&copy; Joe and Jane Bloggs</logo>
- <rights>&copy; Joe and Jane Bloggs</rights>
- <subtitle></subtitle>
+
+ <logo>http://joe.bloggs/logo.jpeg</logo>
+ <rights>Copyright Joe and Jane Bloggs</rights>
+ <subtitle>About Trains, Planes, and Autonmobiles.</subtitle>
<entry>
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
@@ -34,38 +41,29 @@
<updated>2003-12-13T18:30:02Z</updated>
<author>
<name>Joe Bloggs</name>
- <url>http://joe.bloggs</url>
+ <uri>http://joe.bloggs</uri>
<email>mail@joe.bloggs</email>
</author>
- <category>planes</category>
- <content type="html">
- <b>Aero</b>- not air-, fools!
+ <category term="words" label="Words" scheme="http://awesomecategories.org" />
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <p><i>Aero</i>- not air-, fools!</p>
+ </div>
</content>
- <link
- href="http://planes.com"
- rel="reply"
- type="html"
- hreflang="en-US"
- title="Airplanes not Aeroplanes"
- length="1000000"
- />
<published>2003-12-13T18:30:02Z</published>
- <rights>&copy; Joe Bloggs</rights>
+ <rights>Copyright Joe Bloggs</rights>
<source>
- <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
+ <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6d</id>
<title>Aeroplane</title>
<subtitle>Aeroplanes</subtitle>
<updated>1755-04-15T18:30:00Z</updated>
<author>
<name>Samuel Johnson</name>
- <url>http://dictionary.com</url>
+ <uri>http://dictionary.com</uri>
<email>sjohnson@dictionary.com</email>
</author>
- <category>words</category>
- <rights>&copy; Samual Johnson</rights>
-
-
-
+ <category term="planes" label="Planes" scheme="http://awesomecategories.org" />
+ <rights>Copyright Samual Johnson</rights>
</source>
</entry>
@@ -76,10 +74,18 @@
<author>
<name>Jane Bloggs</name>
</author>
- <category>trains</category>
+ <category term="trains" label="Trains" />
<content src="http://trains.com"></content>
+ <link
+ href="http://joe.bloggs/trains-full"
+ rel="alternate"
+ type="text/html"
+ hreflang="en-GB"
+ title="Trains!"
+ length="1000000"
+ />
<published>2003-12-13T18:20:02Z</published>
- <rights>&copy; Jane Bloggs</rights>
+ <rights>Copyright Jane Bloggs</rights>
<summary>
Trains!
</summary>