]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/commitdiff
Python 3
authorOleg Broytman <phd@phdru.name>
Tue, 4 Jun 2024 14:56:41 +0000 (17:56 +0300)
committerOleg Broytman <phd@phdru.name>
Sat, 15 Jun 2024 23:09:31 +0000 (02:09 +0300)
ChangeLog
html/Makefile
html/response.py
parser/parser.py
parser/test_parser.py
search-tags.py
tags.py

index 79857bbb6b50f9e002e325551d6b0e50e9e39078..d9dc4552683c8f94de71a2c7552fd62375aa93de 100644 (file)
--- 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.
index 63b6ccaadae9adb22ce262e4fb33df969d7bbe7e..9d430413f731bb24870e8f0b62b267e30ee7466c 100644 (file)
@@ -1,10 +1,11 @@
 # Makefile.
 #
 # __author__ = "Oleg Broytman <phd@phdru.name>"
-# __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
index 071c5dfddc44af29791a0855f74a4d57bf47b5c3..adfea5e9afaaf2be20b52a57b70b568a5a9d48fc 100644 (file)
@@ -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))
index dbd054964820852fd530b4cfab0f1da2c8e79e30..0d9351bbfd6e66be8f31951972f5e8444b8c9750 100755 (executable)
@@ -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('----------')
index df24b06f648d1802da91be985e552556345c8d98..cf053b85f58393a93eb7e29ca676b8fd7dc1c070 100755 (executable)
@@ -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()
index c2884fab2942aeeeb7374451770cbd556d5c0581..a844960b2f4601016de12085a5b0d4cc9c82790a 100755 (executable)
@@ -1,18 +1,21 @@
-#! /usr/bin/env python
+#! /usr/bin/env python3
 # coding: koi8-r
 """Search tags CGI"""
 
 __author__ = "Oleg Broytman <phd@phdru.name>"
-__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:
     <ul>
     """]
                 for year, month, day, suburl, _title in posts:
-                    _posts.append('<li>%s-%s-%s <a href="../../../../Russian/blog/%s">%s</a></li>\n' % (year, month, day, suburl, _title))
+                    _posts.append(
+                        '<li>%s-%s-%s '
+                        '<a href="../../../../Russian/blog/%s">%s</a></li>\n'
+                        % (year, month, day, suburl, _title))
                 _posts .append("""\
     </ul>
     </p>
diff --git a/tags.py b/tags.py
index 44f1a070d02b08c02e9b1f265ba9ec8095bd5fb5..3fe860bdfab7fcfaa196726a11fc9bcae95ca7b0 100644 (file)
--- 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