diff options
| author | John Conway <john.a.conway@gmail.com> | 2019-05-08 15:57:35 +0100 |
|---|---|---|
| committer | John Conway <john.a.conway@gmail.com> | 2019-05-08 15:57:35 +0100 |
| commit | 01d296acb19c2f00d1868c2c74c2a3fd3a80fb53 (patch) | |
| tree | 5b5727c8cda49d9375b543f444c7290fbaf589bb | |
| parent | 1aed195f821ed1f087ff46e00e6b3b4320e0bdb9 (diff) | |
| download | feed-nim-01d296acb19c2f00d1868c2c74c2a3fd3a80fb53.tar.gz feed-nim-01d296acb19c2f00d1868c2c74c2a3fd3a80fb53.zip | |
[Atom] Writing tests, fixing bugs
| -rw-r--r-- | src/feednim/atom.nim | 66 | ||||
| -rw-r--r-- | tests/__test1.nim (renamed from tests/test1.nim) | 2 | ||||
| -rwxr-xr-x | tests/test_atom | bin | 0 -> 409560 bytes | |||
| -rw-r--r-- | tests/test_atom.nim | 15 | ||||
| -rw-r--r-- | tests/test_atom.xml | 74 |
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 Binary files differnew file mode 100755 index 0000000..991e0e6 --- /dev/null +++ b/tests/test_atom 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>© Joe and Jane Bloggs</logo> - <rights>© 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>© 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>© 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>© Jane Bloggs</rights> + <rights>Copyright Jane Bloggs</rights> <summary> Trains! </summary> |
