1111__license__ = "Python"
1212
1313# Modules available without separate import
14- import dbm
14+ import shelve
1515import os
1616import re
1717import sys
@@ -198,7 +198,7 @@ def gather_items_info(self, channels, template_file="Planet", channel_list=None)
198198 item_info ["new_date" ] = time .strftime (new_date_format , newsitem .date )
199199
200200 # Check for the start of a new channel
201- if item_info . has_key ( "new_date" ) or prev_channel != newsitem ._channel :
201+ if "new_date" in item_info or prev_channel != newsitem ._channel :
202202 prev_channel = newsitem ._channel
203203 item_info ["new_channel" ] = newsitem ._channel .url
204204
@@ -310,7 +310,7 @@ def channels(self, hidden=0, sorted=1):
310310 """Return the list of channels."""
311311 channels = []
312312 for channel in self ._channels :
313- if hidden or not channel . has_key ( "hidden" ) :
313+ if hidden or "hidden" not in channel :
314314 channels .append ((channel .name , channel ))
315315
316316 if sorted :
@@ -368,7 +368,7 @@ def items(self, hidden=0, sorted=1, max_items=0, max_days=0, channels=None):
368368 channels = self .channels (hidden = hidden , sorted = 0 )
369369 for channel in channels :
370370 for item in channel ._items .values ():
371- if hidden or not item . has_key ( "hidden" ) :
371+ if hidden or "hidden" not in item :
372372 channel_filter_re = None
373373 if channel .filter :
374374 channel_filter_re = re .compile (channel .filter , re .IGNORECASE )
@@ -377,7 +377,7 @@ def items(self, hidden=0, sorted=1, max_items=0, max_days=0, channels=None):
377377 channel_exclude_re = re .compile (channel .exclude , re .IGNORECASE )
378378 if planet_filter_re or planet_exclude_re or channel_filter_re or channel_exclude_re :
379379 title = ""
380- if item . has_key ( "title" ) :
380+ if "title" in item :
381381 title = item .title
382382 content = item .get_content ("content" )
383383
@@ -397,7 +397,7 @@ def items(self, hidden=0, sorted=1, max_items=0, max_days=0, channels=None):
397397 if channel_exclude_re .search (title ) or channel_exclude_re .search (content ):
398398 continue
399399
400- if not seen_guids . has_key ( item .id ) :
400+ if item .id not in seen_guids :
401401 seen_guids [item .id ] = 1
402402 items .append ((time .mktime (item .date ), item .order , item ))
403403
@@ -495,7 +495,7 @@ def __init__(self, planet, url):
495495 if not os .path .isdir (planet .cache_directory ):
496496 os .makedirs (planet .cache_directory )
497497 cache_filename = cache .filename (planet .cache_directory , url )
498- cache_file = dbm .open (cache_filename , "c" , 0o666 )
498+ cache_file = shelve .open (cache_filename , "c" )
499499
500500 cache .CachedInfo .__init__ (self , cache_file , url , root = 1 )
501501
@@ -524,7 +524,7 @@ def __init__(self, planet, url):
524524
525525 def has_item (self , id_ ):
526526 """Check whether the item exists in the channel."""
527- return self ._items . has_key ( id_ )
527+ return id_ in self ._items
528528
529529 def get_item (self , id_ ):
530530 """Return the item from the channel."""
@@ -537,7 +537,7 @@ def items(self, hidden=0, sorted=0):
537537 """Return the item list."""
538538 items = []
539539 for item in self ._items .values ():
540- if hidden or not item . has_key ( "hidden" ) :
540+ if hidden or "hidden" not in item :
541541 items .append ((time .mktime (item .date ), item .order , item ))
542542
543543 if sorted :
@@ -556,7 +556,7 @@ def cache_read_entries(self):
556556 for key in keys :
557557 if key .find (" " ) != - 1 :
558558 continue
559- if self . has_key ( key ) :
559+ if key in self :
560560 continue
561561
562562 item = NewsItem (self , key )
@@ -610,7 +610,7 @@ def update(self):
610610 else :
611611 self .url_status = "500"
612612
613- if self .url_status == "301" and (info . has_key ( "entries" ) and len (info .entries ) > 0 ):
613+ if self .url_status == "301" and ("entries" in info and len (info .entries ) > 0 ):
614614 log .warning ("Feed has moved from <%s> to <%s>" , self .url , info .url )
615615 try :
616616 os .link (
@@ -636,8 +636,8 @@ def update(self):
636636 else :
637637 log .info ("Updating feed %s" , self .feed_information ())
638638
639- self .url_etag = info . has_key ( "etag" ) and info .etag or None
640- self .url_modified = info . has_key ( "modified" ) and info .modified or None
639+ self .url_etag = "etag" in info and info .etag or None
640+ self .url_modified = "modified" in info and info .modified or None
641641 if self .url_etag is not None :
642642 log .debug ("E-Tag: %s" , self .url_etag )
643643 if self .url_modified is not None :
@@ -658,14 +658,14 @@ def update_info(self, feed):
658658 if key in self .IGNORE_KEYS or key + "_parsed" in self .IGNORE_KEYS :
659659 # Ignored fields
660660 pass
661- elif feed . has_key ( key + "_parsed" ) :
661+ elif key + "_parsed" in feed :
662662 # Ignore unparsed date fields
663663 pass
664664 elif key .endswith ("_detail" ):
665665 # retain name and email sub-fields
666- if feed [key ]. has_key ( "name" ) and feed [key ].name :
666+ if "name" in feed [key ] and feed [key ].name :
667667 self .set_as_string (key .replace ("_detail" , "_name" ), feed [key ].name )
668- if feed [key ]. has_key ( "email" ) and feed [key ].email :
668+ if "email" in feed [key ] and feed [key ].email :
669669 self .set_as_string (key .replace ("_detail" , "_email" ), feed [key ].email )
670670 elif key == "items" :
671671 # Ignore items field
@@ -676,21 +676,21 @@ def update_info(self, feed):
676676 self .set_as_date (key [: - len ("_parsed" )], feed [key ])
677677 elif key == "image" :
678678 # Image field: save all the information
679- if feed [key ]. has_key ( "url" ) :
679+ if "url" in feed [key ]:
680680 self .set_as_string (key + "_url" , feed [key ].url )
681- if feed [key ]. has_key ( "link" ) :
681+ if "link" in feed [key ]:
682682 self .set_as_string (key + "_link" , feed [key ].link )
683- if feed [key ]. has_key ( "title" ) :
683+ if "title" in feed [key ]:
684684 self .set_as_string (key + "_title" , feed [key ].title )
685- if feed [key ]. has_key ( "width" ) :
685+ if "width" in feed [key ]:
686686 self .set_as_string (key + "_width" , str (feed [key ].width ))
687- if feed [key ]. has_key ( "height" ) :
687+ if "height" in feed [key ]:
688688 self .set_as_string (key + "_height" , str (feed [key ].height ))
689689 elif isinstance (feed [key ], str ):
690690 # String fields
691691 try :
692692 detail = key + "_detail"
693- if feed . has_key ( detail ) and feed [detail ]. has_key ( "type" ) :
693+ if detail in feed and "type" in feed [detail ]:
694694 if feed [detail ].type == "text/html" :
695695 feed [key ] = sanitize .HTML (feed [key ])
696696 elif feed [detail ].type == "text/plain" :
@@ -726,13 +726,13 @@ def update_entries(self, entries):
726726 feed_items = []
727727 for entry in entries :
728728 # Try really hard to find some kind of unique identifier
729- if entry . has_key ( "id" ) :
729+ if "id" in entry :
730730 entry_id = cache .utf8 (entry .id )
731- elif entry . has_key ( "link" ) :
731+ elif "link" in entry :
732732 entry_id = cache .utf8 (entry .link )
733- elif entry . has_key ( "title" ) :
733+ elif "title" in entry :
734734 entry_id = self .url + "/" + md5 .new (cache .utf8 (entry .title )).hexdigest ()
735- elif entry . has_key ( "summary" ) :
735+ elif "summary" in entry :
736736 entry_id = self .url + "/" + md5 .new (cache .utf8 (entry .summary )).hexdigest ()
737737 else :
738738 log .error ("Unable to find or generate id, entry ignored" )
@@ -778,7 +778,7 @@ def update_entries(self, entries):
778778 def get_name (self , key ):
779779 """Return the key containing the name."""
780780 for key in ("name" , "title" ):
781- if self . has_key ( key ) and self .key_type (key ) != self .NULL :
781+ if key in self and self .key_type (key ) != self .NULL :
782782 return self .get_as_string (key )
783783
784784 return ""
@@ -830,7 +830,7 @@ def __init__(self, channel, id_):
830830
831831 self ._channel = channel
832832 self .id = id_
833- self .id_hash = md5 . new (id_ ).hexdigest ()
833+ self .id_hash = md5 (id_ . encode () ).hexdigest ()
834834 self .date = None
835835 self .order = None
836836 self .content = None
@@ -842,19 +842,19 @@ def update(self, entry):
842842 if key in self .IGNORE_KEYS or key + "_parsed" in self .IGNORE_KEYS :
843843 # Ignored fields
844844 pass
845- elif entry . has_key ( key + "_parsed" ) :
845+ elif key + "_parsed" in entry :
846846 # Ignore unparsed date fields
847847 pass
848848 elif key .endswith ("_detail" ):
849849 # retain name, email, and language sub-fields
850- if entry [key ]. has_key ( "name" ) and entry [key ].name :
850+ if "name" in entry [key ] and entry [key ].name :
851851 self .set_as_string (key .replace ("_detail" , "_name" ), entry [key ].name )
852- if entry [key ]. has_key ( "email" ) and entry [key ].email :
852+ if "email" in entry [key ] and entry [key ].email :
853853 self .set_as_string (key .replace ("_detail" , "_email" ), entry [key ].email )
854854 if (
855- entry [key ]. has_key ( "language" )
855+ "language" in entry [key ]
856856 and entry [key ].language
857- and (not self ._channel . has_key ( "language" ) or entry [key ].language != self ._channel .language )
857+ and ("language" not in self ._channel or entry [key ].language != self ._channel .language )
858858 ):
859859 self .set_as_string (key .replace ("_detail" , "_language" ), entry [key ].language )
860860 elif key .endswith ("_parsed" ):
@@ -863,9 +863,9 @@ def update(self, entry):
863863 self .set_as_date (key [: - len ("_parsed" )], entry [key ])
864864 elif key == "source" :
865865 # Source field: save both url and value
866- if entry [key ]. has_key ( "value" ) :
866+ if "value" in entry [key ]:
867867 self .set_as_string (key + "_name" , entry [key ].value )
868- if entry [key ]. has_key ( "url" ) :
868+ if "url" in entry [key ]:
869869 self .set_as_string (key + "_link" , entry [key ].url )
870870 elif key == "content" :
871871 # Content field: concatenate the values
@@ -876,9 +876,9 @@ def update(self, entry):
876876 elif item .type == "text/plain" :
877877 item .value = escape (item .value )
878878 if (
879- item . has_key ( "language" )
879+ "language" in item
880880 and item .language
881- and (not self ._channel . has_key ( "language" ) or item .language != self ._channel .language )
881+ and ("language" not in self ._channel or item .language != self ._channel .language )
882882 ):
883883 self .set_as_string (key + "_language" , item .language )
884884 value += cache .utf8 (item .value )
@@ -887,8 +887,8 @@ def update(self, entry):
887887 # String fields
888888 try :
889889 detail = key + "_detail"
890- if entry . has_key ( detail ) :
891- if entry [detail ]. has_key ( "type" ) :
890+ if detail in entry :
891+ if "type" in entry [detail ]:
892892 if entry [detail ].type == "text/html" :
893893 entry [key ] = sanitize .HTML (entry [key ])
894894 elif entry [detail ].type == "text/plain" :
@@ -916,7 +916,7 @@ def get_date(self, key):
916916 added in previous updates and don't creep into the next one.
917917 """
918918 for other_key in ("updated" , "modified" , "published" , "issued" , "created" ):
919- if self . has_key ( other_key ) :
919+ if other_key in self :
920920 date = self .get_as_date (other_key )
921921 break
922922 else :
@@ -927,7 +927,7 @@ def get_date(self, key):
927927 date = self ._channel .updated
928928 # elif date < self._channel.last_updated:
929929 # date = self._channel.updated
930- elif self . has_key ( key ) and self .key_type (key ) != self .NULL :
930+ elif key in self and self .key_type (key ) != self .NULL :
931931 return self .get_as_date (key )
932932 else :
933933 date = self ._channel .updated
@@ -938,7 +938,7 @@ def get_date(self, key):
938938 def get_content (self , key ):
939939 """Return the key containing the content."""
940940 for key in ("content" , "tagline" , "summary" ):
941- if self . has_key ( key ) and self .key_type (key ) != self .NULL :
941+ if key in self and self .key_type (key ) != self .NULL :
942942 return self .get_as_string (key )
943943
944944 return ""
0 commit comments