From 08b14b0406dc800de33f1bcc9adc2a2cfd655c10 Mon Sep 17 00:00:00 2001 From: Oleg Volchkov Date: Mon, 28 Jul 2025 18:14:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20sh?= =?UTF-8?q?-=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8E=20=D0=B3=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=D1=81=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=B0=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=9F=D0=B8=D1=82=D0=BE=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D1=81=D0=BA=D1=83=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Питоновская версия добавляет к классу еще и имя родительского класса. --- classes.md | 156 +++++++++++++++++++++++++------------------------- classes.sh | 7 +-- p3_classes.py | 86 ++++++++++++++++++++++++++++ ut/classes.md | 59 ++++++++++--------- ut/classes.sh | 7 +-- 5 files changed, 198 insertions(+), 117 deletions(-) create mode 100755 p3_classes.py diff --git a/classes.md b/classes.md index 8998107..a3390a6 100644 --- a/classes.md +++ b/classes.md @@ -2,32 +2,31 @@ =================== [autogenerated] - ### [./lib/api/archives/zip.p](./lib/api/archives/zip.p) -* pfZipArchiver +* pfZipArchiver <- pfClass ### [./lib/api/mobile/sms/zagruzka.p](./lib/api/mobile/sms/zagruzka.p) -* pfZagruzkaSMSGate +* pfZagruzkaSMSGate <- pfClass ### [./lib/api/office/excel.p](./lib/api/office/excel.p) -* pfTableToXLS +* pfTableToXLS <- pfClass ### [./lib/api/pdf/pdfkit.p](./lib/api/pdf/pdfkit.p) -* pfPDFKit +* pfPDFKit <- pfClass ### [./lib/api/qiwi/wallet.p](./lib/api/qiwi/wallet.p) -* pfQiwiWallet +* pfQiwiWallet <- pfClass ### [./lib/api/telegram/telegram.p](./lib/api/telegram/telegram.p) -* pfTelegramBotAPI +* pfTelegramBotAPI <- pfClass ### [./lib/api/yandex/speechkit.p](./lib/api/yandex/speechkit.p) -* pfYandexSpeechKit +* pfYandexSpeechKit <- pfClass ### [./lib/common.p](./lib/common.p) * pfClass -* pfMixin -* pfHashMixin +* pfMixin <- pfClass +* pfHashMixin <- pfMixin * pfChainMixin * pfAssert * pfString @@ -35,136 +34,137 @@ * pfCFile * pfRuntime * pfOS -* pfRetry +* pfRetry <- pfClass ### [./lib/console/commands/generate.p](./lib/console/commands/generate.p) -* pfConsoleGenerateCommand +* pfConsoleGenerateCommand <- pfConsoleCommandWithSubcommands ### [./lib/console/commands/mysql.p](./lib/console/commands/mysql.p) -* pfMySQLCommand +* pfMySQLCommand <- pfConsoleCommandWithSubcommands ### [./lib/console/commands/pgsql.p](./lib/console/commands/pgsql.p) -* pfPgSQLCommand +* pfPgSQLCommand <- pfConsoleCommandWithSubcommands ### [./lib/console/console_app.p](./lib/console/console_app.p) -* pfConsoleApp +* pfConsoleApp <- pfClass * pfConsoleAppStdout -* pfConsoleCommand -* pfConsoleCommandWithSubcommands +* pfConsoleCommand <- pfClass +* pfConsoleCommandWithSubcommands <- pfConsoleCommand ### [./lib/debug/unhandled_exception.p](./lib/debug/unhandled_exception.p) * pfUnhandledExceptionDebug ### [./lib/locks/pg_locks.p](./lib/locks/pg_locks.p) -* pfPGLocksManager +* pfPGLocksManager <- pfClass ### [./lib/net/curl_file.p](./lib/net/curl_file.p) * pfCurlFile ### [./lib/security/sql_security.p](./lib/security/sql_security.p) -* pfSQLSecurityCrypt +* pfSQLSecurityCrypt <- pfClass ### [./lib/sql/connection.p](./lib/sql/connection.p) -* pfSQLConnection -* pfSQLAnsiDialect -* pfSQLPostgresDialect -* pfSQLMySQLDialect -* pfSQLSQLiteDialect +* pfSQLConnection <- pfClass +* pfSQLAnsiDialect <- pfClass +* pfSQLPostgresDialect <- pfSQLAnsiDialect +* pfSQLMySQLDialect <- pfSQLAnsiDialect +* pfSQLSQLiteDialect <- pfSQLAnsiDialect ### [./lib/sql/models/generators/model_form_generators.p](./lib/sql/models/generators/model_form_generators.p) -* pfTableFormGenerator -* pfTableFormGeneratorBootstrap2Widgets -* pfTableFormGeneratorBootstrap3Widgets -* pfTableFormGeneratorBootstrap4HorizontalWidgets -* pfTableFormGeneratorBootstrap4VerticalWidgets -* pfTableFormGeneratorSemanticUIWidgets +* pfTableFormGenerator <- pfClass +* pfTableFormGeneratorBootstrap2Widgets <- pfClass +* pfTableFormGeneratorBootstrap3Widgets <- pfClass +* pfTableFormGeneratorBootstrap4HorizontalWidgets <- pfClass +* pfTableFormGeneratorBootstrap4VerticalWidgets <- pfClass +* pfTableFormGeneratorSemanticUIWidgets <- pfClass ### [./lib/sql/models/generators/sql_table_generators.p](./lib/sql/models/generators/sql_table_generators.p) -* pfSQLModelGenerator -* pfMySQLTableModelGenerator -* pfPostgresTableModelGenerator +* pfSQLModelGenerator <- pfClass +* pfMySQLTableModelGenerator <- pfSQLModelGenerator +* pfPostgresTableModelGenerator <- pfSQLModelGenerator ### [./lib/sql/models/generics/queue/sql_queue.p](./lib/sql/models/generics/queue/sql_queue.p) -* pfSQLQueue +* pfSQLQueue <- pfSQLTable ### [./lib/sql/models/generics/settings/sql_settings.p](./lib/sql/models/generics/settings/sql_settings.p) -* pfSQLSettings +* pfSQLSettings <- pfClass ### [./lib/sql/models/generics/tagging/sql_tagging.p](./lib/sql/models/generics/tagging/sql_tagging.p) -* pfTagging -* pfSQLCTTagsModel -* pfSQLCTContentModel -* pfSQLCTCountersModel +* pfTagging <- pfClass +* pfSQLCTTagsModel <- pfSQLTable +* pfSQLCTContentModel <- pfSQLTable +* pfSQLCTCountersModel <- pfSQLTable ### [./lib/sql/models/sql_table.p](./lib/sql/models/sql_table.p) -* pfSQLTable +* pfSQLTable <- pfClass * pfSQLTableScope -* pfSQLBuilder +* pfSQLBuilder <- pfClass ### [./lib/sql/models/structs.p](./lib/sql/models/structs.p) -* pfModelModule -* pfModelTable -* pfModelChainMixin +* pfModelModule <- pfClass +* pfModelTable <- pfSQLTable +* pfModelChainMixin <- pfChainMixin ### [./lib/tests/unittest.p](./lib/tests/unittest.p) * pfUnittestProgram * pfTestsLoader * pfTestResult * pfTestStdoutStream -* pfTextTestResult +* pfTextTestResult <- pfTestResult * pfTextTestsRunner * pfTestExceptions * pfTestCase +* __pfTestCaseNotImplementedSUT ### [./lib/web/auth.p](./lib/web/auth.p) -* pfAuthBase -* pfRemoteUserAuth -* pfUserRolesAuth -* pfUsersModel -* pfUsersPermissions -* pfRolesModel -* pfRolesToUsersModel +* pfAuthBase <- pfMiddleware +* pfRemoteUserAuth <- pfAuthBase +* pfUserRolesAuth <- pfClass +* pfUsersModel <- pfModelTable +* pfUsersPermissions <- pfClass +* pfRolesModel <- pfModelTable +* pfRolesToUsersModel <- pfModelTable ### [./lib/web/controllers.p](./lib/web/controllers.p) -* pfController -* pfRouter -* pfRouterProcessor -* pfRouterDefaultProcessor -* pfRouterRenderProcessor -* pfRouterCallProcessor -* pfRouterRedirectProcessor +* pfController <- pfClass +* pfRouter <- pfClass +* pfRouterProcessor <- pfClass +* pfRouterDefaultProcessor <- pfRouterProcessor +* pfRouterRenderProcessor <- pfRouterProcessor +* pfRouterCallProcessor <- pfRouterProcessor +* pfRouterRedirectProcessor <- pfRouterProcessor * pfRequest -* pfResponse -* pfResponseRedirect -* pfMiddleware +* pfResponse <- pfClass +* pfResponseRedirect <- pfResponse +* pfMiddleware <- pfClass ### [./lib/web/csrf.p](./lib/web/csrf.p) -* pfCSRFMiddleware +* pfCSRFMiddleware <- pfMiddleware ### [./lib/web/helpers/antiflood.p](./lib/web/helpers/antiflood.p) -* pfAntiFlood -* pfAntiFloodStorage -* pfAntiFloodHashStorage -* pfAntiFloodDBStorage +* pfAntiFlood <- pfClass +* pfAntiFloodStorage <- pfClass +* pfAntiFloodHashStorage <- pfAntiFloodStorage +* pfAntiFloodDBStorage <- pfAntiFloodStorage ### [./lib/web/helpers/cache.p](./lib/web/helpers/cache.p) -* pfCache +* pfCache <- pfClass ### [./lib/web/helpers/scroller.p](./lib/web/helpers/scroller.p) -* pfScroller +* pfScroller <- pfClass +* __AL_Scroller__ ### [./lib/web/helpers/translit.p](./lib/web/helpers/translit.p) -* pfURLTranslit +* pfURLTranslit <- pfClass ### [./lib/web/middleware.p](./lib/web/middleware.p) -* pfCommonMiddleware -* pfSessionMiddleware -* pfDebugInfoMiddleware +* pfCommonMiddleware <- pfMiddleware +* pfSessionMiddleware <- pfMiddleware +* pfDebugInfoMiddleware <- pfMiddleware * pfSecurityMiddleware -* pfRequestIDMiddleware +* pfRequestIDMiddleware <- pfMiddleware ### [./lib/web/templates.p](./lib/web/templates.p) -* pfTemplate -* pfTemplateStorage -* pfTemplateParserWrapper - +* pfTemplate <- pfClass +* pfTemplateStorage <- pfClass +* pfTemplateParserWrapper <- pfClass diff --git a/classes.sh b/classes.sh index c2957e9..b02ec34 100755 --- a/classes.sh +++ b/classes.sh @@ -7,9 +7,4 @@ echo "===================" >> $CFILE echo >> $CFILE echo "[autogenerated]" >> $CFILE -find ./lib -name "*.p" \ - | sort | xargs grep "^@CLASS" -A 1 -H \ - | awk '$0 !~ /(--|@CLASS)/{split($0, m, "-"); if(mod != m[1]){printf("\n### [%s](%s)\n", m[1], m[1])} if(substr(m[2], 1, 2) != "__"){print "*", m[2]; mod = m[1]}} END{ printf("\n"); }' \ - >>$CFILE - - +./p3_classes.py ./lib >> $CFILE diff --git a/p3_classes.py b/p3_classes.py new file mode 100755 index 0000000..24e5465 --- /dev/null +++ b/p3_classes.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 + +""" +Строить список классов Парсера в формате Маркдаун. +Первым параметром можно передать имя паки от которой ищем *.p-файлы иначе ищем от текущей +""" + +import glob +import os +import re +import sys +from dataclasses import ( + dataclass, +) + +p3_class_re = re.compile( + r""" + ^@CLASS.*\n(.+?)\n + (?:^\#.*$|^\s*$)* + (?: + (?:[^@]*?@OPTIONS.*\n(?:(?:locals|partial"dynamic|static)\s*\n)+?) + | + (?:[^@]*?@USE.*\n(?:(?:\S)+\s*\n)+?) + )* + (?:^\#.*$|^\s*$)* + (?:[^@]*?@BASE.*\n(.+?)\n)? + """, + flags=re.MULTILINE | re.VERBOSE, +) + + +@dataclass +class p3Class: + path: str + name: str + base: str + + +def fetch_classes_from_file(source_path): + result = [] + with open(source_path) as f: + source = f.read() + + matches = p3_class_re.findall(source) + for m in matches: + result.append(p3Class(source_path, m[0], m[1])) + + return result + + +def find_classes(root_path, pattern="**/*.p"): + result = [] + + files = glob.glob(pattern, root_dir=root_path, recursive=True) + files.sort() + + for fp in files: + result.extend(fetch_classes_from_file(os.path.join(root_path, fp))) + + return result + + +def print_classes(root_path, classes): + p = None + for c in classes: + if p != c.path: + if p is not None: + print() + print(f"### [{c.path}]({c.path})") + p = c.path + + base = f" <- {c.base}" if c.base != "" else "" + print(f"* {c.name}{base}") + + +def main(): + root_path = "./" + if len(sys.argv) > 1: + root_path = sys.argv[1] + + classes = find_classes(root_path) + print_classes(root_path, classes) + + +if __name__ == "__main__": + main() diff --git a/ut/classes.md b/ut/classes.md index c5be838..cb53a48 100644 --- a/ut/classes.md +++ b/ut/classes.md @@ -2,53 +2,58 @@ =================== [autogenerated] - ### [./common/common_cfile_test.p](./common/common_cfile_test.p) -* TestPFCFile +* TestPFCFile <- pfTestCase + +### [./common/common_pfclass_test.p](./common/common_pfclass_test.p) +* TestPFClass <- pfTestCase ### [./common/common_retry_test.p](./common/common_retry_test.p) -* TestPFRetry -* TestPFRetryOnException +* TestPFRetry <- pfTestCase +* TestPFRetryOnException <- pfTestCase ### [./common/common_validate_test.p](./common/common_validate_test.p) -* TestPFCommonValidate +* TestPFCommonValidate <- pfTestCase ### [./locks/pg_locks_test.p](./locks/pg_locks_test.p) -* TestPGLocks +* TestPGLocks <- pfTestCase ### [./sql/sql_connection_test.p](./sql/sql_connection_test.p) -* CommonPFSQLConnectionTests -* TestSQLite3SQLConnection -* TestMySQL57Connection -* TestMySQL8Connection -* TestPostgresConnection +* CommonPFSQLConnectionTests <- BaseTestSQLConnection +* TestSQLite3SQLConnection <- CommonPFSQLConnectionTests +* TestMySQL57Connection <- CommonPFSQLConnectionTests +* TestMySQL8Connection <- CommonPFSQLConnectionTests +* TestPostgresConnection <- CommonPFSQLConnectionTests ### [./sql/sql_security_test.p](./sql/sql_security_test.p) -* BaseTestSQLSecurity -* TestMySQL57SecurityCrypt -* TestMySQL8SecurityCrypt -* TestPostgresSecurityCrypt +* BaseTestSQLSecurity <- pfTestCase +* TestMySQL57SecurityCrypt <- BaseTestSQLSecurity +* TestMySQL8SecurityCrypt <- BaseTestSQLSecurity +* TestPostgresSecurityCrypt <- BaseTestSQLSecurity ### [./sql/sql_table/common_test.p](./sql/sql_table/common_test.p) -* TestPFSQLTableFields +* TestPFSQLTableFields <- pfTestCase ### [./sql/sql_table/orm_test.p](./sql/sql_table/orm_test.p) -* ORMPFSQLTableTests -* _TestUserModel -* TestSQLite3SQLORMPFSQLTable -* TestMySQL57ORMPFSQLTable -* TestMySQL8ORMPFSQLTable -* TestPostgresORMPFSQLTable +* ORMPFSQLTableTests <- BaseTestSQLConnection +* _TestUserModel <- pfSQLTable +* TestSQLite3SQLORMPFSQLTable <- ORMPFSQLTableTests +* TestMySQL57ORMPFSQLTable <- ORMPFSQLTableTests +* TestMySQL8ORMPFSQLTable <- ORMPFSQLTableTests +* TestPostgresORMPFSQLTable <- ORMPFSQLTableTests ### [./sql/testutils.p](./sql/testutils.p) -* BaseTestSQLConnection +* BaseTestSQLConnection <- pfTestCase ### [./tests/ut_test_case_test.p](./tests/ut_test_case_test.p) -* TestPFTestCase +* TestPFTestCase <- pfTestCase +* __pfTestCase <- pfTestCase +* __pfTestCaseSetupFailed <- __pfTestCase +* __pfTestCaseTearDownFailed <- __pfTestCase ### [./web/controllers/auth_password_hash_test.p](./web/controllers/auth_password_hash_test.p) -* TestAuthPasswordHashes +* TestAuthPasswordHashes <- pfTestCase ### [./web/controllers/catch_test.p](./web/controllers/catch_test.p) -* TestControllersCatch - +* TestControllersCatch <- pfTestCase +* __ControllersCatchTest <- pfController diff --git a/ut/classes.sh b/ut/classes.sh index 8b9f2c4..600bd96 100755 --- a/ut/classes.sh +++ b/ut/classes.sh @@ -7,9 +7,4 @@ echo "===================" >> $CFILE echo >> $CFILE echo "[autogenerated]" >> $CFILE -find . -name "*.p" \ - | sort | xargs grep "^@CLASS" -A 1 -H \ - | awk '$0 !~ /(--|@CLASS)/{split($0, m, "-"); if(mod != m[1]){printf("\n### [%s](%s)\n", m[1], m[1])} if(substr(m[2], 1, 2) != "__"){print "*", m[2]; mod = m[1]}} END{ printf("\n"); }' \ - >>$CFILE - - +../p3_classes.py ./ >> $CFILE