AtomGen converts a list (or iterable) of dictionaries into Apple Newsstand Atom Feed 1.2
Setups the Apple NewsStand Atom feed object (Newsstand Atomfeed v1.2 Specifications). Note that this is different than normal Atom Feed: Specification
Atomgen is tested and used in production on Python 2.7 Atomgen is compatible with Python 3.3 but has not been used in production.
The following parameters are ONLY used if you want to use other names for your dictionary elements than the default ones. Don’t touch these parameters to keep the default settings.
Each dictionary item contains the elements of an individual newsstand issue. And it should include the following items:
Parameters: | id : string, optional
updated : datetime, optional
published : datetime, optional
end_date : datetime, optional
summary : string, optional
icon : string, optional
|
---|---|
Returns: | AtomGen Object that is ready to parse a list of dictionaries : |
Methods
Creates the Atom feed from the list (or iterable) of dictionaries
Parameters: | infeed : list or iterable
update_time : datetime object, optional
validate_image : Boolean, optional
|
---|
Examples
>>> from atomgen import AtomGen
>>> a=[{'id':'1','updated':datetime.datetime(2013, 12, 10, 1, 9, 53, 977342),
... 'published':datetime.datetime(2013, 12, 10, 1, 10, 53, 977342),
... 'summary':"This is the summary 1",'icon':"http://ccc.com/img.png"},
... {'id':2,'updated':datetime.datetime(2013, 12, 9, 1, 9, 53, 977342),
... 'published':datetime.datetime(2013, 12, 10, 1, 7, 53, 977342),
... 'summary':"This is the summary 2",'icon':"http://ccc2.com/img2.png"}]
>>> my_atom = AtomGen()
>>> print (my_atom.run(a, update_time=datetime.datetime(2013, 12, 10, 1, 9, 53, 977342)) )
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:news="http://itunes.apple.com/2011/Newsstand"><updated>2013-12-10T01:09:53Z</updated><entry><id>1</id><updated>2013-12-10T01:09:53Z</updated><published>2013-12-10T01:10:53Z</published><summary>This is the summary 1</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://ccc.com/img.png" /></news:cover_art_icons></entry><entry><id>2</id><updated>2013-12-09T01:09:53Z</updated><published>2013-12-10T01:07:53Z</published><summary>This is the summary 2</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://ccc2.com/img2.png" /></news:cover_art_icons></entry></feed>
>>> b=[{'my_id':'1','when_updated':datetime.datetime(2013, 12, 10, 1, 9, 53, 977342),
... 'when_published':datetime.datetime(2013, 12, 10, 1, 10, 53, 977342),
... 'the_summary':"This is the summary 1",'myicon':"http://ccc.com/img.png"},
... {'my_id':2,'when_updated':datetime.datetime(2013, 12, 9, 1, 9, 53, 977342),
... 'when_published':datetime.datetime(2013, 12, 10, 1, 7, 53, 977342),
... 'the_summary':"This is the summary 2",'myicon':"http://ccc2.com/img2.png"}]
>>> my_atom2 = AtomGen(id="my_id",published="when_published",updated="when_updated",
... summary="the_summary",icon="myicon")
>>> print (my_atom2.run(b, update_time=datetime.datetime(2013, 12, 10, 1, 9, 53, 977342)) )
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:news="http://itunes.apple.com/2011/Newsstand"><updated>2013-12-10T01:09:53Z</updated><entry><id>1</id><updated>2013-12-10T01:09:53Z</updated><published>2013-12-10T01:10:53Z</published><summary>This is the summary 1</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://ccc.com/img.png" /></news:cover_art_icons></entry><entry><id>2</id><updated>2013-12-09T01:09:53Z</updated><published>2013-12-10T01:07:53Z</published><summary>This is the summary 2</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://ccc2.com/img2.png" /></news:cover_art_icons></entry></feed>
>>> c={1:{'updated':datetime.datetime(2013, 12, 10, 1, 9, 53, 977342),
... 'published':datetime.datetime(2013, 12, 10, 1, 10, 53, 977342),
... 'summary':"This is the summary 1",'icon':"http://ccc.com/img.png"},
... 2:{'updated':datetime.datetime(2013, 12, 9, 1, 9, 53, 977342),
... 'published':datetime.datetime(2013, 12, 10, 1, 7, 53, 977342),
... 'summary':"This is the summary 2",'icon':"http://ccc2.com/img2.png"},}
>>> print (my_atom.run(c, update_time=datetime.datetime(2013, 12, 10, 1, 9, 53, 977342)) )
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:news="http://itunes.apple.com/2011/Newsstand"><updated>2013-12-10T01:09:53Z</updated><entry><id>1</id><updated>2013-12-10T01:09:53Z</updated><published>2013-12-10T01:10:53Z</published><summary>This is the summary 1</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://ccc.com/img.png" /></news:cover_art_icons></entry><entry><id>2</id><updated>2013-12-09T01:09:53Z</updated><published>2013-12-10T01:07:53Z</published><summary>This is the summary 2</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://ccc2.com/img2.png" /></news:cover_art_icons></entry></feed>
>>> d={'1':{'when_updated':datetime.datetime(2013, 12, 10, 1, 9, 53, 977342),
... 'when_published':datetime.datetime(2013, 12, 10, 1, 10, 53, 977342),
... 'the_summary':"This is the summary 1",'myicon':"http://ccc.com/img.png"},
... 2:{'when_updated':datetime.datetime(2013, 12, 9, 1, 9, 53, 977342),
... 'when_published':datetime.datetime(2013, 12, 10, 1, 7, 53, 977342),
... 'the_summary':"This is the summary 2",'myicon':"http://ccc2.com/img2.png"},}
>>> my_atom2 = AtomGen(id="my_id",published="when_published",updated="when_updated",
... summary="the_summary",icon="myicon")
>>> print (my_atom2.run(d, update_time=datetime.datetime(2013, 12, 10, 1, 9, 53, 977342)) )
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:news="http://itunes.apple.com/2011/Newsstand"><updated>2013-12-10T01:09:53Z</updated><entry><id>1</id><updated>2013-12-10T01:09:53Z</updated><published>2013-12-10T01:10:53Z</published><summary>This is the summary 1</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://ccc.com/img.png" /></news:cover_art_icons></entry><entry><id>2</id><updated>2013-12-09T01:09:53Z</updated><published>2013-12-10T01:07:53Z</published><summary>This is the summary 2</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://ccc2.com/img2.png" /></news:cover_art_icons></entry></feed>
As you can see it generates exactly the same Atom feed in the end. But it gives you the flexibility of modifying your own dictionary keys with the names you like.
Automatic Validation of images of the feed
It validates the remote images for their existance, their type to be PNG and aspect ratio to be .5 to 2 as defined in Apple Newsstand Atomfeed specifications. You need to turn validate_image=True
>>> d={'1':{'when_updated':datetime.datetime(2013, 12, 10, 1, 9, 53, 977342),
... 'when_published':datetime.datetime(2013, 12, 10, 1, 10, 53, 977342),
... 'the_summary':"This is the summary 1",'myicon':"http://cdn.tennis.com/uploads/magazine/test_material/img_1024_600.png"},
... 2:{'when_updated':datetime.datetime(2013, 12, 9, 1, 9, 53, 977342),
... 'when_published':datetime.datetime(2013, 12, 10, 1, 7, 53, 977342),
... 'the_summary':"This is the summary 2",'myicon':"http://cdn.tennis.com/uploads/magazine/test_material/img_1024_600.png"},}
>>> my_atom2 = AtomGen(id="my_id",published="when_published",updated="when_updated",
... summary="the_summary",icon="myicon")
>>> print (my_atom2.run(d, update_time=datetime.datetime(2013, 12, 10, 1, 9, 53, 977342), validate_image=True) )
http://cdn.tennis.com/uploads/magazine/test_material/img_1024_600.png validated
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:news="http://itunes.apple.com/2011/Newsstand"><updated>2013-12-10T01:09:53Z</updated><entry><id>1</id><updated>2013-12-10T01:09:53Z</updated><published>2013-12-10T01:10:53Z</published><summary>This is the summary 1</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://cdn.tennis.com/uploads/magazine/test_material/img_1024_600.png" /></news:cover_art_icons></entry><entry><id>2</id><updated>2013-12-09T01:09:53Z</updated><published>2013-12-10T01:07:53Z</published><summary>This is the summary 2</summary><news:cover_art_icons><news:cover_art_icon size="SOURCE" src="http://cdn.tennis.com/uploads/magazine/test_material/img_1024_600.png" /></news:cover_art_icons></entry></feed>
Note that for automatic image validation, turn validate_image=True in atomgen.AtomGen.run
checks a local image for Apple Newsstand feed specifications v1.2
checks a remote image for existance and Apple Newsstand feed specifications v1.2 example:
>>> from atomgen.validate_img import validate_img_on_web
>>> validate_img_on_web("http://cdn.tennis.com/uploads/magazine/test_material/img_1200_500.png")