Skip to content

Commit ada79c1

Browse files
committed
push along
1 parent d0a199e commit ada79c1

4 files changed

Lines changed: 97 additions & 95 deletions

File tree

code/planet-cache.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77

88
import configparser
9-
import dbm
9+
import shelve
1010
import os
1111
import sys
1212
import time
@@ -114,9 +114,9 @@ def fit_str(string, length):
114114

115115
# Open the cache file directly to get the URL it represents
116116
try:
117-
with dbm.open(cache_file, "r") as db:
117+
with shelve.open(cache_file, "r") as db:
118118
url = db[b"url"].decode("utf-8")
119-
except dbm.error as e:
119+
except shelve.error as e:
120120
print(f"{cache_file}: {e!s}", file=sys.stderr)
121121
sys.exit(1)
122122
except KeyError:

code/planet/__init__.py

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
__license__ = "Python"
1212

1313
# Modules available without separate import
14-
import dbm
14+
import shelve
1515
import os
1616
import re
1717
import 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

Comments
 (0)