From bee03d50e5a6c083962d5d855cea5445bc015472 Mon Sep 17 00:00:00 2001 From: Oleg Broytman Date: Tue, 4 Jun 2024 17:56:41 +0300 Subject: [PATCH] Python 3 --- ChangeLog | 4 ++++ html/Makefile | 5 +++-- html/response.py | 42 +++++++++++++++++------------------ parser/parser.py | 26 +++++++++++----------- parser/test_parser.py | 51 +++++++++++++++++++++++++++---------------- search-tags.py | 23 ++++++++++++------- tags.py | 21 ++++++++++-------- 7 files changed, 100 insertions(+), 72 deletions(-) diff --git a/ChangeLog b/ChangeLog index 79857bb..d9dc455 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Version 0.8 (2024-06-04) + + Python 3. + Version 0.7 (2017-12-14) Use lark instead of parsley. diff --git a/html/Makefile b/html/Makefile index 63b6cca..9d43041 100644 --- a/html/Makefile +++ b/html/Makefile @@ -1,10 +1,11 @@ # Makefile. # # __author__ = "Oleg Broytman " -# __copyright__ = "Copyright (C) 2014 PhiloSoft Design" +# __copyright__ = "Copyright (C) 2014-2024 PhiloSoft Design" %.py: %.tmpl - cheetah compile --nobackup $< && compyle $@ + python3 -m Cheetah.CheetahWrapper compile --nobackup $< && \ + exec python3 -m compileall $@ .PHONY: all all: html.py redirect.py diff --git a/html/response.py b/html/response.py index 071c5df..adfea5e 100644 --- a/html/response.py +++ b/html/response.py @@ -1,28 +1,28 @@ - import sys + def response(title, body, status=None): - from .html import html - result = html() + from .html import html + result = html() + + result.title = title + result.body = body - result.title = title - result.body = body + if status: + print("Status:", status) + sys.stdout.write(str(result.cgiHeaders())) + sys.stdout.write(str(result)) - if status: - print "Status:", status - sys.stdout.write(str(result.cgiHeaders())) - #sys.stdout.write(str(result)) - sys.stdout.write(unicode(result).encode('latin1')) def redirect(url, parameters=None, status=None): - import urllib - from .redirect import redirect - result = redirect() - if parameters: - result.url = url + '?' + urllib.urlencode(parameters) - else: - result.url = url - if status: - print "Status:", status - sys.stdout.write(str(result.cgiHeaders())) - sys.stdout.write(str(result)) + import urllib + from .redirect import redirect + result = redirect() + if parameters: + result.url = url + '?' + urllib.urlencode(parameters) + else: + result.url = url + if status: + print("Status:", status) + sys.stdout.write(str(result.cgiHeaders())) + sys.stdout.write(str(result)) diff --git a/parser/parser.py b/parser/parser.py index dbd0549..0d9351b 100755 --- a/parser/parser.py +++ b/parser/parser.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 import os from lark import Lark, Transformer @@ -52,15 +52,15 @@ def parse(input): if __name__ == '__main__': - print '----------' - print parse('test') - print parse('!test') - print parse('not test') - print parse('foo or bar') - print parse('foo && bar') - print parse('foo && bar && baz') - print parse('!foo && bar && baz') - print parse('(test)') - print parse('(foo || bar)') - print parse('(foo and !bar)') - print '----------' + print('----------') + print(parse('test')) + print(parse('!test')) + print(parse('not test')) + print(parse('foo or bar')) + print(parse('foo && bar')) + print(parse('foo && bar && baz')) + print(parse('!foo && bar && baz')) + print(parse('(test)')) + print(parse('(foo || bar)')) + print(parse('(foo and !bar)')) + print('----------') diff --git a/parser/test_parser.py b/parser/test_parser.py index df24b06..cf053b8 100755 --- a/parser/test_parser.py +++ b/parser/test_parser.py @@ -1,9 +1,10 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 import unittest from lark import LexError, ParseError from parser import parse + class TestParser(unittest.TestCase): def _parse(self, input): return parse(input) @@ -15,55 +16,67 @@ class TestParser(unittest.TestCase): self.assertRaises(LexError, self._parse, 'XXX') def test_04_expression(self): - self.assertEqual(self._parse('!(xxx&yyy)'), + self.assertEqual( + self._parse('!(xxx&yyy)'), ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy')))) ) - self.assertEqual(self._parse('!(xxx & yyy)'), + self.assertEqual( + self._parse('!(xxx & yyy)'), ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy')))) ) - self.assertEqual(self._parse('!xxx&yyy&zzz|ooo'), + self.assertEqual( + self._parse('!xxx&yyy&zzz|ooo'), ('OR', ('AND', - ('NOT', ('NAME', 'xxx')), - ('AND', ('NAME', 'yyy'), ('NAME', 'zzz'))), - ('NAME', 'ooo')) + ('NOT', ('NAME', 'xxx')), + ('AND', ('NAME', 'yyy'), ('NAME', 'zzz'))), + ('NAME', 'ooo')) ) - self.assertEqual(self._parse('!(xxx && yyy)'), + self.assertEqual( + self._parse('!(xxx && yyy)'), ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy')))) ) - self.assertEqual(self._parse('!(xxx || yyy)'), + self.assertEqual( + self._parse('!(xxx || yyy)'), ('NOT', ('PARENS', ('OR', ('NAME', 'xxx'), ('NAME', 'yyy')))) ) - self.assertEqual(self._parse('xxx and yyy'), + self.assertEqual( + self._parse('xxx and yyy'), ('AND', ('NAME', 'xxx'), ('NAME', 'yyy')) ) - self.assertEqual(self._parse('xxx or yyy'), + self.assertEqual( + self._parse('xxx or yyy'), ('OR', ('NAME', 'xxx'), ('NAME', 'yyy')) ) - self.assertEqual(self._parse('xxx OR yyy'), + self.assertEqual( + self._parse('xxx OR yyy'), ('OR', ('NAME', 'xxx'), ('NAME', 'yyy')) ) - self.assertEqual(self._parse('not xxx'), + self.assertEqual( + self._parse('not xxx'), ('NOT', ('NAME', 'xxx')) ) - self.assertEqual(self._parse('NOT xxx'), + self.assertEqual( + self._parse('NOT xxx'), ('NOT', ('NAME', 'xxx')) ) - self.assertEqual(self._parse('NOT (xxx & yyy) AND zzz | ooo'), + self.assertEqual( + self._parse('NOT (xxx & yyy) AND zzz | ooo'), ('OR', ('AND', ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy')) - ) - ), + ) + ), ('NAME', 'zzz') - ), + ), ('NAME', 'ooo') - ) + ) ) def test_05_bad_expression(self): self.assertRaises(ParseError, self._parse, '!(xxx&yyy') + if __name__ == "__main__": unittest.main() diff --git a/search-tags.py b/search-tags.py index c2884fa..a844960 100755 --- a/search-tags.py +++ b/search-tags.py @@ -1,18 +1,21 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 # coding: koi8-r """Search tags CGI""" __author__ = "Oleg Broytman " -__copyright__ = "Copyright (C) 2014-2017 PhiloSoft Design" +__copyright__ = "Copyright (C) 2014-2024 PhiloSoft Design" __license__ = "GNU GPL" -import cgi, sys +import cgi +import sys + from lark import ParseError + from html.response import redirect, response from parser import parser form = cgi.FieldStorage() -if not form.has_key('q'): +if 'q' not in form: status = "400 Bad request" title = "Error!" body = "Required parameter is missing!" @@ -26,17 +29,18 @@ else: title = "Error!" body = "Bad query syntax!" else: - if tree[0] == 'NAME': # Single tag - just do redirect + if tree[0] == 'NAME': # Single tag - just do redirect tag = tree[1] assert isinstance(tag, str) from tags import tag_exists if tag_exists(tag): - redirect("/Russian/blog/tags/%s.html" % tag, status="301 Moved") + redirect( + "/Russian/blog/tags/%s.html" % tag, status="301 Moved") sys.exit() status = "404 Tag not found" title = "ïÛÉÂËÁ!" body = "ôÅÇ %s ÎÅ ÓÕÝÅÓÔ×ÕÅÔ!" % tag - else: # Process tree + else: # Process tree from tags import find_tags posts = find_tags(tree) status = None @@ -47,7 +51,10 @@ else:
    """] for year, month, day, suburl, _title in posts: - _posts.append('
  • %s-%s-%s %s
  • \n' % (year, month, day, suburl, _title)) + _posts.append( + '
  • %s-%s-%s ' + '%s
  • \n' + % (year, month, day, suburl, _title)) _posts .append("""\

diff --git a/tags.py b/tags.py index 44f1a07..3fe860b 100644 --- a/tags.py +++ b/tags.py @@ -1,29 +1,30 @@ blog_filename = "blog_dict.pickle" try: - import cPickle as pickle + import cPickle as pickle except ImportError: - import pickle + import pickle try: - blog_file = open('../../../../phdru.name/ru/' + blog_filename, "rb") + blog_file = open('../../../../phdru.name/ru/' + blog_filename, "rb") except IOError: - blog_dict = {} + blog_dict = {} else: - blog_dict = pickle.load(blog_file) - blog_file.close() + blog_dict = pickle.load(blog_file) + blog_file.close() # blog_dict is a mapping # (year, month, day) => [list of (file, title, lead, tags)] def tag_exists(tag): - for posts in blog_dict.itervalues(): + for posts in blog_dict.values(): for _file, _title, _lead, _tags in posts: if tag in _tags: return True return False + def _test_post(post, tree): """Test if the list of tags in the post satisfies condition @@ -50,6 +51,7 @@ def _test_post(post, tree): else: raise ValueError("Cannot get there") + def find_tags(tree): """Test every blog post against parsed expression @@ -57,12 +59,13 @@ def find_tags(tree): """ _posts = [] - for (year, month, day), posts in blog_dict.iteritems(): + for (year, month, day), posts in blog_dict.items(): for post in posts: if _test_post(post, tree): _posts.append(( year, month, day, - '/'.join((year, month, day, post[0][:-len("tmpl")] + "html")), + '/'.join( + (year, month, day, post[0][:-len("tmpl")] + "html")), post[1])) _posts.sort(reverse=True) return _posts -- 2.39.2