From 87a11e5d1f858e799b1407fd7c8cce7dbd3f98b0 Mon Sep 17 00:00:00 2001 From: KyMAN <0kyman0@gmail.com> Date: Fri, 11 Oct 2024 13:43:43 +0200 Subject: [PATCH] feat: PythonMapper done and documentated. --- .gitignore | 8 + Artbook/PythonMapper.logo.svg | 315 +++++++ Artbook/PythonMapper.logo.xcf | Bin 0 -> 312166 bytes .../I18N/PythonMapper.py.i18n.alarabiyah.json | 6 + .../PythonMapper.py.i18n.azerbaycanca.json | 6 + JSON/I18N/PythonMapper.py.i18n.blanga.json | 6 + JSON/I18N/PythonMapper.py.i18n.bokmal.json | 6 + JSON/I18N/PythonMapper.py.i18n.bulgarski.json | 6 + JSON/I18N/PythonMapper.py.i18n.catala.json | 6 + JSON/I18N/PythonMapper.py.i18n.cestina.json | 6 + JSON/I18N/PythonMapper.py.i18n.dansk.json | 6 + JSON/I18N/PythonMapper.py.i18n.deutsch.json | 6 + JSON/I18N/PythonMapper.py.i18n.eesti.json | 6 + JSON/I18N/PythonMapper.py.i18n.ellinika.json | 6 + JSON/I18N/PythonMapper.py.i18n.english.json | 6 + JSON/I18N/PythonMapper.py.i18n.espanol.json | 5 + JSON/I18N/PythonMapper.py.i18n.esperanto.json | 6 + JSON/I18N/PythonMapper.py.i18n.farsi.json | 6 + JSON/I18N/PythonMapper.py.i18n.francais.json | 6 + JSON/I18N/PythonMapper.py.i18n.gaeilge.json | 6 + JSON/I18N/PythonMapper.py.i18n.hangugeo.json | 6 + JSON/I18N/PythonMapper.py.i18n.hanyu.json | 6 + JSON/I18N/PythonMapper.py.i18n.hindi.json | 6 + JSON/I18N/PythonMapper.py.i18n.indonesia.json | 6 + JSON/I18N/PythonMapper.py.i18n.italiano.json | 6 + JSON/I18N/PythonMapper.py.i18n.ivrit.json | 6 + JSON/I18N/PythonMapper.py.i18n.latviski.json | 6 + .../PythonMapper.py.i18n.lietuviskai.json | 6 + JSON/I18N/PythonMapper.py.i18n.magyar.json | 6 + JSON/I18N/PythonMapper.py.i18n.malayu.json | 6 + .../I18N/PythonMapper.py.i18n.nederlands.json | 6 + JSON/I18N/PythonMapper.py.i18n.nihongo.json | 6 + JSON/I18N/PythonMapper.py.i18n.polski.json | 6 + JSON/I18N/PythonMapper.py.i18n.portugues.json | 6 + JSON/I18N/PythonMapper.py.i18n.romaneste.json | 6 + JSON/I18N/PythonMapper.py.i18n.russkiy.json | 6 + JSON/I18N/PythonMapper.py.i18n.shqip.json | 6 + .../I18N/PythonMapper.py.i18n.slovencina.json | 6 + .../PythonMapper.py.i18n.slovenscina.json | 6 + JSON/I18N/PythonMapper.py.i18n.suomi.json | 6 + JSON/I18N/PythonMapper.py.i18n.svenska.json | 6 + JSON/I18N/PythonMapper.py.i18n.tagalog.json | 6 + JSON/I18N/PythonMapper.py.i18n.thai.json | 6 + JSON/I18N/PythonMapper.py.i18n.turkce.json | 6 + JSON/I18N/PythonMapper.py.i18n.ukrainska.json | 6 + JSON/I18N/PythonMapper.py.i18n.urdu.json | 6 + JSON/I18N/PythonMapper.py.i18n.zhongwen.json | 6 + JSON/PythonMapper.py.routes.json | 3 + JSON/PythonMapper.py.settings.json | 42 + Public/doc/es/bugs.w.md | 15 + Public/doc/es/description.md | 63 ++ Public/doc/es/design.w.md | 47 ++ Public/doc/es/donates.w.md | 55 ++ Public/doc/es/faq.w.md | 25 + Public/doc/es/index.w.md | 27 + Public/doc/es/manual/index.w.md | 17 + Public/doc/es/manual/technitian.w.md | 29 + Public/doc/es/manual/use.w.md | 256 ++++++ Public/doc/es/opinions.w.md | 17 + Public/doc/es/projects.w.md | 46 ++ Public/doc/es/targets.w.md | 36 + Public/favicon.ico | Bin 0 -> 4286 bytes Public/images/PythonMapper-180.png | Bin 0 -> 22402 bytes Public/images/PythonMapper-192.png | Bin 0 -> 20475 bytes Public/images/PythonMapper-270.png | Bin 0 -> 23432 bytes Public/images/PythonMapper-32.png | Bin 0 -> 2313 bytes Public/images/PythonMapper-512.png | Bin 0 -> 8436 bytes Public/images/PythonMapper.png | Bin 0 -> 8436 bytes Public/index.w.md | 11 + Public/scss/PythonMapper.css | 154 ++++ Public/scss/PythonMapper.css.map | 7 + Public/scss/PythonMapper.scss | 10 + Python/Application/PythonMapper.py | 15 + Python/PythonMapper.py | 780 ++++++++++++++++++ Python/run.py | 6 + README.md | 6 +- Tools/run.sh | 3 + Tools/sass.sh | 3 + version | 1 + 79 files changed, 2259 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 Artbook/PythonMapper.logo.svg create mode 100644 Artbook/PythonMapper.logo.xcf create mode 100644 JSON/I18N/PythonMapper.py.i18n.alarabiyah.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.azerbaycanca.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.blanga.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.bokmal.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.bulgarski.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.catala.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.cestina.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.dansk.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.deutsch.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.eesti.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.ellinika.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.english.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.espanol.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.esperanto.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.farsi.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.francais.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.gaeilge.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.hangugeo.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.hanyu.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.hindi.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.indonesia.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.italiano.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.ivrit.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.latviski.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.lietuviskai.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.magyar.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.malayu.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.nederlands.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.nihongo.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.polski.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.portugues.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.romaneste.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.russkiy.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.shqip.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.slovencina.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.slovenscina.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.suomi.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.svenska.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.tagalog.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.thai.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.turkce.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.ukrainska.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.urdu.json create mode 100644 JSON/I18N/PythonMapper.py.i18n.zhongwen.json create mode 100644 JSON/PythonMapper.py.routes.json create mode 100644 JSON/PythonMapper.py.settings.json create mode 100644 Public/doc/es/bugs.w.md create mode 100644 Public/doc/es/description.md create mode 100644 Public/doc/es/design.w.md create mode 100644 Public/doc/es/donates.w.md create mode 100644 Public/doc/es/faq.w.md create mode 100644 Public/doc/es/index.w.md create mode 100644 Public/doc/es/manual/index.w.md create mode 100644 Public/doc/es/manual/technitian.w.md create mode 100644 Public/doc/es/manual/use.w.md create mode 100644 Public/doc/es/opinions.w.md create mode 100644 Public/doc/es/projects.w.md create mode 100644 Public/doc/es/targets.w.md create mode 100644 Public/favicon.ico create mode 100644 Public/images/PythonMapper-180.png create mode 100644 Public/images/PythonMapper-192.png create mode 100644 Public/images/PythonMapper-270.png create mode 100644 Public/images/PythonMapper-32.png create mode 100644 Public/images/PythonMapper-512.png create mode 100644 Public/images/PythonMapper.png create mode 100644 Public/index.w.md create mode 100644 Public/scss/PythonMapper.css create mode 100644 Public/scss/PythonMapper.css.map create mode 100644 Public/scss/PythonMapper.scss create mode 100644 Python/Application/PythonMapper.py create mode 100644 Python/PythonMapper.py create mode 100644 Python/run.py create mode 100755 Tools/run.sh create mode 100755 Tools/sass.sh create mode 100644 version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c339411 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +/Data +/Public/data +*.[Ss]ecrets.* +*.[Ss]ecret.* +/Python/Abstracts/AnPMap.py +/Python/Abstracts/Applications.py +.sass-cache +__pycache__ \ No newline at end of file diff --git a/Artbook/PythonMapper.logo.svg b/Artbook/PythonMapper.logo.svg new file mode 100644 index 0000000..3743917 --- /dev/null +++ b/Artbook/PythonMapper.logo.svg @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Artbook/PythonMapper.logo.xcf b/Artbook/PythonMapper.logo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..31dab46d0c4d076d69e2422577a7c80a4e718af5 GIT binary patch literal 312166 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 OZRShS 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 literal 0 HcmV?d00001 diff --git a/JSON/I18N/PythonMapper.py.i18n.alarabiyah.json b/JSON/I18N/PythonMapper.py.i18n.alarabiyah.json new file mode 100644 index 0000000..1a9fb43 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.alarabiyah.json @@ -0,0 +1,6 @@ +{ + "alarabiyah" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.azerbaycanca.json b/JSON/I18N/PythonMapper.py.i18n.azerbaycanca.json new file mode 100644 index 0000000..8ede685 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.azerbaycanca.json @@ -0,0 +1,6 @@ +{ + "azerbaycanca" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.blanga.json b/JSON/I18N/PythonMapper.py.i18n.blanga.json new file mode 100644 index 0000000..ee84e5b --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.blanga.json @@ -0,0 +1,6 @@ +{ + "blanga" : { + + "python_mapper" : "MKVKNIFT" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.bokmal.json b/JSON/I18N/PythonMapper.py.i18n.bokmal.json new file mode 100644 index 0000000..46e5df4 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.bokmal.json @@ -0,0 +1,6 @@ +{ + "bokmal" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.bulgarski.json b/JSON/I18N/PythonMapper.py.i18n.bulgarski.json new file mode 100644 index 0000000..7c1643c --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.bulgarski.json @@ -0,0 +1,6 @@ +{ + "bulgarski" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.catala.json b/JSON/I18N/PythonMapper.py.i18n.catala.json new file mode 100644 index 0000000..95cd987 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.catala.json @@ -0,0 +1,6 @@ +{ + "catala" : { + + "python_mapper" : "MKVBNSP" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.cestina.json b/JSON/I18N/PythonMapper.py.i18n.cestina.json new file mode 100644 index 0000000..0d4c9f0 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.cestina.json @@ -0,0 +1,6 @@ +{ + "cestina" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.dansk.json b/JSON/I18N/PythonMapper.py.i18n.dansk.json new file mode 100644 index 0000000..4a7d41c --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.dansk.json @@ -0,0 +1,6 @@ +{ + "dansk" : { + + "python_mapper" : "I NÆRHEDEN AF PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.deutsch.json b/JSON/I18N/PythonMapper.py.i18n.deutsch.json new file mode 100644 index 0000000..16fdcc2 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.deutsch.json @@ -0,0 +1,6 @@ +{ + "deutsch" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.eesti.json b/JSON/I18N/PythonMapper.py.i18n.eesti.json new file mode 100644 index 0000000..7b33ccc --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.eesti.json @@ -0,0 +1,6 @@ +{ + "eesti" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.ellinika.json b/JSON/I18N/PythonMapper.py.i18n.ellinika.json new file mode 100644 index 0000000..6182411 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.ellinika.json @@ -0,0 +1,6 @@ +{ + "ellinika" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.english.json b/JSON/I18N/PythonMapper.py.i18n.english.json new file mode 100644 index 0000000..d14fe30 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.english.json @@ -0,0 +1,6 @@ +{ + "english" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.espanol.json b/JSON/I18N/PythonMapper.py.i18n.espanol.json new file mode 100644 index 0000000..119d4c9 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.espanol.json @@ -0,0 +1,5 @@ +{ + "espanol" : { + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.esperanto.json b/JSON/I18N/PythonMapper.py.i18n.esperanto.json new file mode 100644 index 0000000..2f905a3 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.esperanto.json @@ -0,0 +1,6 @@ +{ + "esperanto" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.farsi.json b/JSON/I18N/PythonMapper.py.i18n.farsi.json new file mode 100644 index 0000000..d84a926 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.farsi.json @@ -0,0 +1,6 @@ +{ + "farsi" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.francais.json b/JSON/I18N/PythonMapper.py.i18n.francais.json new file mode 100644 index 0000000..96156ae --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.francais.json @@ -0,0 +1,6 @@ +{ + "francais" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.gaeilge.json b/JSON/I18N/PythonMapper.py.i18n.gaeilge.json new file mode 100644 index 0000000..ce27f51 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.gaeilge.json @@ -0,0 +1,6 @@ +{ + "gaeilge" : { + + "python_mapper" : "MKVBXTY" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.hangugeo.json b/JSON/I18N/PythonMapper.py.i18n.hangugeo.json new file mode 100644 index 0000000..5a29c05 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.hangugeo.json @@ -0,0 +1,6 @@ +{ + "hangugeo" : { + + "python_mapper" : "PythonMapper의 특징" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.hanyu.json b/JSON/I18N/PythonMapper.py.i18n.hanyu.json new file mode 100644 index 0000000..3927b43 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.hanyu.json @@ -0,0 +1,6 @@ +{ + "hanyu" : { + + "python_mapper" : "PythonMapper 相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.hindi.json b/JSON/I18N/PythonMapper.py.i18n.hindi.json new file mode 100644 index 0000000..e0eb4c9 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.hindi.json @@ -0,0 +1,6 @@ +{ + "hindi" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.indonesia.json b/JSON/I18N/PythonMapper.py.i18n.indonesia.json new file mode 100644 index 0000000..9eede0a --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.indonesia.json @@ -0,0 +1,6 @@ +{ + "indonesia" : { + + "python_mapper" : "LOGIN" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.italiano.json b/JSON/I18N/PythonMapper.py.i18n.italiano.json new file mode 100644 index 0000000..8e1d7ed --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.italiano.json @@ -0,0 +1,6 @@ +{ + "italiano" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.ivrit.json b/JSON/I18N/PythonMapper.py.i18n.ivrit.json new file mode 100644 index 0000000..06438c2 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.ivrit.json @@ -0,0 +1,6 @@ +{ + "ivrit" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.latviski.json b/JSON/I18N/PythonMapper.py.i18n.latviski.json new file mode 100644 index 0000000..f5f9a40 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.latviski.json @@ -0,0 +1,6 @@ +{ + "latviski" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.lietuviskai.json b/JSON/I18N/PythonMapper.py.i18n.lietuviskai.json new file mode 100644 index 0000000..d04ff7f --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.lietuviskai.json @@ -0,0 +1,6 @@ +{ + "lietuviskai" : { + + "python_mapper" : "PythonMapperIS" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.magyar.json b/JSON/I18N/PythonMapper.py.i18n.magyar.json new file mode 100644 index 0000000..6c90240 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.magyar.json @@ -0,0 +1,6 @@ +{ + "magyar" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.malayu.json b/JSON/I18N/PythonMapper.py.i18n.malayu.json new file mode 100644 index 0000000..e465f54 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.malayu.json @@ -0,0 +1,6 @@ +{ + "malayu" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.nederlands.json b/JSON/I18N/PythonMapper.py.i18n.nederlands.json new file mode 100644 index 0000000..d58abd1 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.nederlands.json @@ -0,0 +1,6 @@ +{ + "nederlands" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.nihongo.json b/JSON/I18N/PythonMapper.py.i18n.nihongo.json new file mode 100644 index 0000000..ee0fe8a --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.nihongo.json @@ -0,0 +1,6 @@ +{ + "nihongo" : { + + "python_mapper" : "PythonMapperの" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.polski.json b/JSON/I18N/PythonMapper.py.i18n.polski.json new file mode 100644 index 0000000..f2f5a44 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.polski.json @@ -0,0 +1,6 @@ +{ + "polski" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.portugues.json b/JSON/I18N/PythonMapper.py.i18n.portugues.json new file mode 100644 index 0000000..35dc36a --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.portugues.json @@ -0,0 +1,6 @@ +{ + "portugues" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.romaneste.json b/JSON/I18N/PythonMapper.py.i18n.romaneste.json new file mode 100644 index 0000000..7415c57 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.romaneste.json @@ -0,0 +1,6 @@ +{ + "romaneste" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.russkiy.json b/JSON/I18N/PythonMapper.py.i18n.russkiy.json new file mode 100644 index 0000000..a4b32c4 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.russkiy.json @@ -0,0 +1,6 @@ +{ + "russkiy" : { + + "python_mapper" : "МКВБЖХГ" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.shqip.json b/JSON/I18N/PythonMapper.py.i18n.shqip.json new file mode 100644 index 0000000..4c5554c --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.shqip.json @@ -0,0 +1,6 @@ +{ + "shqip" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.slovencina.json b/JSON/I18N/PythonMapper.py.i18n.slovencina.json new file mode 100644 index 0000000..19a08ad --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.slovencina.json @@ -0,0 +1,6 @@ +{ + "slovencina" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.slovenscina.json b/JSON/I18N/PythonMapper.py.i18n.slovenscina.json new file mode 100644 index 0000000..ce01b9f --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.slovenscina.json @@ -0,0 +1,6 @@ +{ + "slovenscina" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.suomi.json b/JSON/I18N/PythonMapper.py.i18n.suomi.json new file mode 100644 index 0000000..4cc94bc --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.suomi.json @@ -0,0 +1,6 @@ +{ + "suomi" : { + + "python_mapper" : "MKVBXH" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.svenska.json b/JSON/I18N/PythonMapper.py.i18n.svenska.json new file mode 100644 index 0000000..3866060 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.svenska.json @@ -0,0 +1,6 @@ +{ + "svenska" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.tagalog.json b/JSON/I18N/PythonMapper.py.i18n.tagalog.json new file mode 100644 index 0000000..f18f9ec --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.tagalog.json @@ -0,0 +1,6 @@ +{ + "tagalog" : { + + "python_mapper" : "MKBBFTQF" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.thai.json b/JSON/I18N/PythonMapper.py.i18n.thai.json new file mode 100644 index 0000000..ac65d4e --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.thai.json @@ -0,0 +1,6 @@ +{ + "thai" : { + + "python_mapper" : "ขนาด MKVBXLR" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.turkce.json b/JSON/I18N/PythonMapper.py.i18n.turkce.json new file mode 100644 index 0000000..af37bce --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.turkce.json @@ -0,0 +1,6 @@ +{ + "turkce" : { + + "python_mapper" : "PythonMapper" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.ukrainska.json b/JSON/I18N/PythonMapper.py.i18n.ukrainska.json new file mode 100644 index 0000000..4b249dd --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.ukrainska.json @@ -0,0 +1,6 @@ +{ + "ukrainska" : { + + "python_mapper" : "МКВБКГСФ" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.urdu.json b/JSON/I18N/PythonMapper.py.i18n.urdu.json new file mode 100644 index 0000000..2fc97a2 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.urdu.json @@ -0,0 +1,6 @@ +{ + "urdu" : { + + "python_mapper" : "میک‌بال‌زیم" + } +} \ No newline at end of file diff --git a/JSON/I18N/PythonMapper.py.i18n.zhongwen.json b/JSON/I18N/PythonMapper.py.i18n.zhongwen.json new file mode 100644 index 0000000..4d4fc07 --- /dev/null +++ b/JSON/I18N/PythonMapper.py.i18n.zhongwen.json @@ -0,0 +1,6 @@ +{ + "zhongwen" : { + + "python_mapper" : "PythonMapper 软件" + } +} \ No newline at end of file diff --git a/JSON/PythonMapper.py.routes.json b/JSON/PythonMapper.py.routes.json new file mode 100644 index 0000000..83c41a9 --- /dev/null +++ b/JSON/PythonMapper.py.routes.json @@ -0,0 +1,3 @@ +[ + "get:/ /PythonMapper/Public" +] \ No newline at end of file diff --git a/JSON/PythonMapper.py.settings.json b/JSON/PythonMapper.py.settings.json new file mode 100644 index 0000000..318e803 --- /dev/null +++ b/JSON/PythonMapper.py.settings.json @@ -0,0 +1,42 @@ +{ + "python_mapper_host_name" : "/^(https?\\:\\/{2})?pythonmapper\\.(k3y\\.pw|(anprm\\.)?local|anprm)/", + "python_mapper_default_settings_files" : [ + "/JSON/PythonMapper.py.settings.json" + ], + "python_mapper_default_secrets_files" : [ + "/JSON/PythonMapper.py.settings.secrets.json" + ], + "python_mapper_default_i18n_files" : [ + "/JSON/I18N/PythonMapper.py.i18n.espanol.json" + ], + "python_mapper_default_routes_files" : [ + "/JSON/PythonMapper.py.routes.json", + "/JSON/PythonMapper.py.routes.secrets.json" + ], + "python_mapper_default_views_files" : [], + "python_mapper_resources" : { + "charset" : "utf-8", + "logo" : "/images/PythonMapper.png", + "link" : "https://pythonmapper.k3y.pw/", + "git" : "https://git.k3y.pw/KyMAN/PythonMapper", + "project" : "PythonMapper", + "web" : "https://pythonmapper.k3y.pw", + "authors" : "KyMAN", + "class" : "python-mapper", + "snake" : "python_mapper", + "metas" : {}, + "styles" : ["/scss/PythonMapper.scss"], + "menu" : [ + ["web", "_self", "/"], + ["git", "_blank", "https://git.k3y.pw/KyMAN/PythonMapper"] + ], + "licenses" : [ + ["copyright", null, null, { + "year" : "2024-2025", + "entity" : "KyMAN" + }], + ["cc_by_nc_sa_4"] + ], + "dictionary" : "https://wmarkdown.{domain}/json/WMarkDown.dict.es.kyman.json" + } +} \ No newline at end of file diff --git a/Public/doc/es/bugs.w.md b/Public/doc/es/bugs.w.md new file mode 100644 index 0000000..7eb7e2a --- /dev/null +++ b/Public/doc/es/bugs.w.md @@ -0,0 +1,15 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_bugs +title_text = Bugs y errors - PythonMapper +``` + + + +## Bugs y errors + +Esta sección se dedicará a publicar todos los Bugs y errores reportados los cuales hallan sido catalogados por Srx00, con autoría de quien lo halla reportado, es decir, por falta de tiempo y recursos, posiblemente Srx00, autor de este proyecto no sea capaz de gestionar todas los reportes de Bugs y errores de dicho programa, aunque pondrá todo de su parte para dicho fin, y dichos reportes aparecerán con la autoría de quien lo halla descubierto para aplicar reconocimiento de dicha tarea. + +También se podrá ver el estado del mismo, tanto por la descripción como por los estados de los Checkboxes que acompañen al Report. + + \ No newline at end of file diff --git a/Public/doc/es/description.md b/Public/doc/es/description.md new file mode 100644 index 0000000..d21894c --- /dev/null +++ b/Public/doc/es/description.md @@ -0,0 +1,63 @@ +Python, a la hora de trabajar con clases-objeto que se van generando en archivos que se van importando, estos archivos importados tienen un problema a la hora de asignar tipados de variables de elementos los cuales los importan, es decir: si tenemos una clase-objeto maestra donde el resto de clases-objeto de la estructura requieren de conocer al maestro, Python, sobre estructuras tipadas, ya sea por asignación voluntaria mediante "typing" como tipado forzoso como *py-py*, éste no puede ser asignado de esta forma por defecto. + +> [!#] Un ejemplo de este caso sería el proyecto AnP, cuya filosofía exige un conocimiento de las clases-objetos pertenencientes a la clase-objeto AnP conozcan a dicho objeto que parte de éste último. + +Con esta premisa, como se dijo antes, salvo usos específicos contra compiladores tipo *py-py* Python de por sí ignorará los tipados, por lo que si lo que se busca es tener un acceso al CodeDoc de código por parte del IDE a utilizar, se usará un archivo de elementos nulos y/o vacíos e inútiles que mapeen los elementos de dicha clase-objeto maestra, de esta forma no forzamos un tipado anidado por importación la cual es incompatible con Python. En cada librería que creemos implementamos los elementos a utilizar de dicha librería, simpre contando con que no se usen a modo de creación o ciertas características especiales, donde sí tendríamos que importar la librería original, como un modelo u objeto. + +Explicando más claramente el problema, si nos basamos en la estructura base de AnP como ejemplo, lo que vemos es claramente que a la hora de importar la librería dependiente de AnP es que se forma un bucle infinito de cargas de dependencias, lo que determina en un error de dependencias en importación en Python. + +```mermaid +flowchart LR + +subgraph "Nivel 1" + A[AnP] +end + +subgraph "Nivel 2" + P[Path] + S[Settings] + I[I18N] +end + +A -->|tiene| P +A -->|tiene| S +A -->|tiene| I +P -->|depende de| A +S -->|depende de| A +I -->|depende de| A +S -->|depende de| P +I -->|depende de| P + +``` + +> [!#] En un lenguaje como Java, PHP o Rust, este problema no existe pues una vez se cargan las librerías pertinentes, éstas quedan en ejecución al mismo nivel pero en el caso de Python es como que dichas librerías se ejecutan en un nivel independiente y por lo tanto, se crean niveles de dependencias entre ellos. A continuación se muestra otro gráfico de qué pasaría a la hora de hacer dicha dependencia dentro de AnP. + +```mermaid +flowchart TD + +A0["AnP original"] +P0["Path original"] +A1["AnP dependencia de nivel 1"] +P1["Path uso de nivel 1"] +A2["AnP dependencia de nivel 2"] +P2["Path uso de nivel 2"] +A3["AnP dependencia de nivel 3"] +P3["Path uso de nivel 3"] +AN(("AnP dependencia \nde nivel N (Infinito)")) + +A0 -->|tiene| P0 +P0 -->|"depende y carga"| A1 +A1 -->|tiene| P1 +P1 -->|"depende y carga"| A2 +A2 -->|tiene| P2 +P2 -->|"depende y carga"| A3 +A3 -->|tiene| P3 +P3 -->|"depende y carga"| AN + +``` + +> [!! ¡IMPORTANTE!] Desde el equipo de desarrollo de este proyecto queremos matizar que esta filosofía de desarrollo no es eficiente, y no sería aconsejable su uso en proyectos cuya filosofía o motivo de existencia sea la eficiencia y el consumo reducido pues requeriríamos de compilaciones y ejecuciones más orientadas a *py-py*. Este proyecto sólo es viable para proyectos cuya filosofía sea más bien la facilidad cara el desarrollo de aplicaciones que no requieran de una eficiencia importante. + +Para solucionar dicho problema y automatizar dicho proceso en dicha casuística, creamos la librería "mapper.py" en el lado del proyecto Python, una librería completamente independiente que nos permita hacer un mapeado automático de los ficheros que nosotros le asignemos. + +> [!#] Ya existen librerías e importaciones Python que hace esta tarea pero tanto por aprender cómo sería por debajo uno de estos procesos, así como hacer un uso personalizado del mismo, se decidió crear la librería propia para dicho fin. \ No newline at end of file diff --git a/Public/doc/es/design.w.md b/Public/doc/es/design.w.md new file mode 100644 index 0000000..ef48110 --- /dev/null +++ b/Public/doc/es/design.w.md @@ -0,0 +1,47 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_design +title_text = Diseño - PythonMapper +``` + + + +## Diseño + +El proyecto en cuestión no tendría un diseño específico si no fuese por el hecho de tener una documentación vinculada por el hecho de ser una simple librería para una función específica para tratar y procesar archivos Python para mapearlos y así ser vinculados sus elementos por tipado conocido, aunque éste sea falso, así como el logo del proyecto. El sistema de colores se basará en el WMarkDown, siguiendo con la siguiente tabla: + +[| +|= Tipo | Hexadecimal | RGBA | Muestra +| Fondo | #EFEFEF | rgba\(239, 239, 239, 1) | [[#EFEFEF]] +| Frontal | #222 | rgba\(34, 34, 34, 1) | [[#222]] +| Primario | #459 | rgba\(64, 80, 144, 1) | [[#459]] +| Secundario | #BA5 | rgba\(176, 160, 80, 1) | [[#BA5]] +| Gris | #888 | rgba\(136, 136, 136, 1) | [[#888]] +| Tabla título | #19888888 | rgba\(136, 136, 136, 0.1) | [[color rgba(136, 136, 136, 0.1)]] +| Tabla Select | #19888888 | rgba\(136, 136, 136, 0.1) | [[color rgba(136, 136, 136, 0.1)]] +| Tabla impar | #38888888 | rgba\(136, 136, 136, 0.2) | [[color rgba(136, 136, 136, 0.2)]] +| Tabla par | #00FFFFFF | rgba\(255, 255, 255, 0) | [[color rgba(255, 255, 255, 0)]] +| Borde interno | #19888888 | rgba\(136, 136, 136, 0.5) | [[color rgba(136, 136, 136, 0.5)]] +| Diccionario | #333C5E | rgba\(51, 60, 94, 1) | [[#333C5E]] +| Diccionario en | #6F663C | rgba\(111, 102, 60, 1) | [[#6F663C]] +| Code impar | #38C8C8C8 | rgba\(200, 200, 200, 0.2) | [[color rgba(200, 200, 200, 0.2)]] +|] + +> [!#] Los colores seleccionados van en referencia a los colores originales de Python puesto que es un proyecto dedicado única y exclusivamente a dicho entorno, pero no son los mismos, orientados a un diseño personalizado. + +Con respecto a las fuentes, se dejan las que tiene por defecto WMarkDown, las cuales son: + +* **Roboto**. Para el texto en general. + * https://fonts.google.com/specimen/Roboto?query=roboto +* **Roboto Mono**. Para los bloques de código. + * https://fonts.google.com/specimen/Roboto+Mono?query=roboto +* **Font Awesome**. Para la iconificación general de la Web. + * https://fontawesome.com/ + +Con respecto al logo, nos encontramos con un entorno cuadrado con dos esquinas dobladas simulando una hoja a modo de mapa, y dentro, mediante puntos, simulando un mapeado digital, las letras simplificadas de Python, las cuales son "Py". Dicho logo viene siendo el siguiente: + +((!image /images/PythonMapper.png)) + +> [!@Srx00] Soy consciente de que los puntos que mapean las letras dentro del logo no están centradas, sin embargo, el objetivo era posicionar los puntos desde valores absolutos con separación y tamaño determinados, y por esto es el defecto que se ve, pero pareció bien la estética resultante y se determinó dejarlo así, además, de esta forma daba más aspecto de cubo por dicho desplazamiento, dando un segundo juego visual con sensación de volumen. + + \ No newline at end of file diff --git a/Public/doc/es/donates.w.md b/Public/doc/es/donates.w.md new file mode 100644 index 0000000..fc56ce2 --- /dev/null +++ b/Public/doc/es/donates.w.md @@ -0,0 +1,55 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_donates +title_text = Donaciones - PythonMapper +``` + + + +## Donaciones + +Este proyecto es plenamente gratuito pues es un proyecto orientado a complementar otros proyectos de los mismos desarrolladores. No tiene ningún plan de ingresos ni pasivos ni activos más allá de lo que se expone en este título. Si alguien quisiere colaborar en que este proyecto no sólo esté abierto por requisitos de los autores, sino también cara un mantenimiento hacia terceros, a continuación presentamos unas direcciones de Cryptoactivos donde se podrá donar sin ninguna cuantía mínima establecida. + +- **Bitcoin** o *BTC*: [bitcoin:bc1qtar0zqxhss4n27cw8lsxpc5tnv6e9xwe0rkfs4?label=PythonMapperDonation bc1qtar0zqxhss4n27cw8lsxpc5tnv6e9xwe0rkfs4] +- **Litecoin** o *LTC*: [litecoin:ltc1q9ts8x70nse9jen6d6g2wuyehdl2wzclwycwv3m?label=PythonMapperDonation ltc1q9ts8x70nse9jen6d6g2wuyehdl2wzclwycwv3m] +- **Dogecoin** o *DOGE*: [dogecoin:DBYYDiKy3UoBn1LdWWHFpcUBseEgc5bGSi?label=PythonMapperDonation DBYYDiKy3UoBn1LdWWHFpcUBseEgc5bGSi] +- **Dash**: [dash:XsVkSBwZoH7R8QTAz82kiSe1jvQDv5WB93?label=PythonMapperDonation XsVkSBwZoH7R8QTAz82kiSe1jvQDv5WB93] +- **Faircoin** o *FAIR*: [faircoin:fFpdTtn5dqkuHy1oiaxhV72zx7Wd1VuTGk?label=PythonMapperDonation fFpdTtn5dqkuHy1oiaxhV72zx7Wd1VuTGk] + +> [!!] Mientras no halla ninguna condición de recursos que impida el mantenimiento gratuito de este servicio, éste permanecerá mantenido y público independientemente de los ingresos obtenidos a partir de los donativos. + +> [!#] Los usuarios que colaboren y quieran ser referenciados, éstos serán referenciados en este apartado mediante un Quote de comentario de usuario con el Nick y avatar correspondiente, pero sólo en caso de que ellos quieran aparecer aquí. + +> [!#] Se mantendrá informados a los usuarios de todo aquel donativo dado y la cantidad económica adquirida, y será publicado su uso y tenencia para que halla constancia pública del uso que se le dé a dichos recursos. + +> [!@Srx00] Quería agredecer de forma persona aquellas aportaciones que serán bien recibidas y valoradas para este proyecto, ya sea como valor simbólico como de mantenimiento. Así, que desde el desarrollo y como desarrollador de este proyecto, muchas gracias a todos aquellos que ponen su granito de arena para este proyecto y por lo tanto, en pro de todos. Muchas gracias, de verdad. + +### Balance + +A continuación se mostrará una tabla de balance con respecto a las cantidades y usos dados. + +[| +|= Activo | Cantidad | Motivo | Usuario | Cantidad total actual +| **BTC** | 0 BTC | Inicio del contador de unidades de BTC. | | 0 BTC +| **LTC** | 0 LTC | Inicio del contador de unidades de LTC. | | 0 LTC +| **DOGE** | 0 DOGE | Inicio del contador de unidades de DOGE. | | 0 DOGE +| **DASH** | 0 DASH | Inicio del contador de unidades de DASH. | | 0 DASH +| **FAIR** | 0 FAIR | Inicio del contador de unidades de FAIR. | | 0 FAIR +|] + +Cómputo total actual en tenencia. + +[| +|= Activo | Cantidad | Número de Operaciones +| **BTC** | 0 BTC | 0 +| **LTC** | 0 LTC | 0 +| **DOGE** | 0 DOGE | 0 +| **DASH** | 0 DASH | 0 +| **FAIR** | 0 FAIR | 0 +|] + +### Donantes + +A continuación, los comentarios de los donantes. + + \ No newline at end of file diff --git a/Public/doc/es/faq.w.md b/Public/doc/es/faq.w.md new file mode 100644 index 0000000..97a2ae2 --- /dev/null +++ b/Public/doc/es/faq.w.md @@ -0,0 +1,25 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_faq +title_text = F.A.Q. - PythonMapper +``` + + + +## F.A.Q. + +En este apartado se responderán a las preguntas más frecuentes que se puedan realizar en el entorno cercano de este proyecto. + +> [!?] **¿Por qué se crea este proyecto a pesar de que ya hay otros muchos que teóricamente hacen lo mismo ya implementados dentro de IDEs como Visual Studio Code, entre otros?** El problema es que aquí se trabaja una filosofía no nativa de Python, pero no implica incompatibilidad en su base, por lo que para poder trabajar literalmente dicho sistema se optó por desarrollar un sistema propio que mediante un proceso paralelo y automático a la par que se desarrolla un proyecto, éste pueda ir mapeando dicho proyecto para establecer las dependencias de tipado sobre los elementos que se van adjuntando, así queda plenamente separado del IDE y de cualquier otro recurso y sólo requeriría de ser ejecutado con el propio Python tras una configuración inicial del mismo. + +> [!?] **¿Por qué este trabajo está público y gratuito?** Esta librería es una librería que sí o sí iba a desarrollar Srx00 para los fines de los distintos proyectos que desarrolla. Al no tener un modelo de negocio y no estar sujeto a clientes, éste quedará libre y gratuito, dentro de los términos y condiciones de la licencia Creative Commons BY-NC-SA 4.0. Ésto permite no sólo compartir con la comunidad, sino también currículum y una forma de extender el conocimiento de existencia de este tipo de proyectos de Srx00. + +> [!?] **¿Por qué la licencia Creative Commons de Atribución, No Comercial y que se Permite Compartir, CC-BY-NC-SA 4.0?** Porque Srx00 quiere compartir con la comunidad este trabajo, sin embargo, una de las condiciones más importantes es reconocer la autoría original, lo que ofrece Currículum y conocimiento del trabajo del o los autores, además de no permitir la comercialización de dicho proyecto, lo que no impide que éste pueda estar en un proyecto comercial siempre que lo que se venda no sea este proyecto. Las licencias como MIT o GPL no cumplen con dichas espectativas y Srx00 tiene la filosofía de que todo trabajo ha de ser reconocido a su autor aunque éste no lo requiera o precise pues es su trabajo. + +> [!?] **Al ser un proyecto CC-BY-NC-SA 4.0, el cual tiene como condición No Comercial. ¿Podría integrar este proyecto en un proyecto personal de caracter privado y comercial?** Sí, siempre que éste reconozca la autoría de este proyecto y que no sea éste la base de negocio económico de dicho proyecto, es decir, si se integra para gestionar los errores del proyecto o cualquier otra cosa que ayude o facilite el trabajo del mismo pero la base económica del proyecto sea otra cosa agena a eso se permite perfectamente el uso y manipulación del mismo. + +> [!?] **Los métodos y funciones creados en el archivo del mapeado Python no retornan nada, simplemente se le asigna un cuerpo con la palabra clave *pass*. Una cosa similar pasa con las variables, que tienen como valor *None*. ¿Está correcto eso?** Pues sí, eso se hace con la finalidad de que el método o función exista pero no tenga repercusión a la hora de ser llamado pues cuando se llame desde un objeto, aunque el tipado referencie al mapeado, éste se ejecutará como nativamente es, ignorando el mapeado. Con respecto a las variables pasa exactamente lo mismo, sin embargo, sí hay una repercusión cara las variables estáticas o de clase las cuales salen de la propia definición de la clase. Para poder hacer uso del recurso estático original y no del mapeado ha de hacerse a partir del recurso relativo que estamos trabajando en ese momento. + +> [!?] **Desde que hago uso del mapeado, cuando intento acceder a un recurso estático, éste sale con valores nulos o con métodos que no tienen ni retorno ni procesamiento. ¿Qué estoy haciendo mal?** Uno de los problemas que nos encontramos al hacer uso de los mapeados es que en el nivel de importación donde los usamos, éstos sobreescriben a las definiciones originales por lo que es de vital importancia que en caso de usar mapeados, los recursos estáticos sean accesibles desde los objetos de trabajo pues éstos siguen usando el mapeado original. Este es el motivo principal por el cual sólo ha de importarse las partes del mapeado que realmente se estén utilizando como tipados de referencia, pero nunca importar completamente éste pues nos dará este tipo de problemas inesperados. + + \ No newline at end of file diff --git a/Public/doc/es/index.w.md b/Public/doc/es/index.w.md new file mode 100644 index 0000000..ead79c9 --- /dev/null +++ b/Public/doc/es/index.w.md @@ -0,0 +1,27 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_documentation +title_text = Documentación - PythonMapper +``` + + + +[[include description.md]] + +[[include projects.w.md]] + +[[include design.w.md]] + +[[include manual/index.w.md]] + +[[include faq.w.md]] + +[[include bugs.w.md]] + +[[include targets.w.md]] + +[[include opinions.w.md]] + +[[include donates.w.md]] + + \ No newline at end of file diff --git a/Public/doc/es/manual/index.w.md b/Public/doc/es/manual/index.w.md new file mode 100644 index 0000000..49d4b23 --- /dev/null +++ b/Public/doc/es/manual/index.w.md @@ -0,0 +1,17 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_manual +title_text = Manual - PythonMapper +``` + + + +## Manual + +El manual de este proyecto se basa en dos partes bien diferenciadas: el manual de uso; y el manual del desarrollador para quienes quieran alterar dicho proyecto para fines específicos dentro de los términos de la licencia que lo sostenta. + +[[include use.w.md]] + +[[include technitian.w.md]] + + \ No newline at end of file diff --git a/Public/doc/es/manual/technitian.w.md b/Public/doc/es/manual/technitian.w.md new file mode 100644 index 0000000..9b1853b --- /dev/null +++ b/Public/doc/es/manual/technitian.w.md @@ -0,0 +1,29 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_manual_technitian +title_text = Técnico - Manual - PythonMapper +``` + + + +### Manual tećnico + +El sistema se basa únicamente en una librería Python la cual ha de ser ejecutada tras establecer la configuración del o los proyectos que queramos mapear. Una vez está ejecutado con dicha configuración, ésta creará un objeto **PythonMapper.Project** para gestionar los proyectos individualmente. El hilo de procesos que gestiona dicho proyecto es único y colgarán de éste un sistema de eventos similares a los Intervalos de JavaScript, el cual gestionará tiempos de espera, de carga y procesamiento en monohilo para evitar un consumo de recursos excesivo y permitir la convivencia de dicho proceso en entornos con más procesos dentro del ecosistema Software donde se aloje. + +La configuración que se extrae para gestionar los valores de los objetos **PythonMapper.Project** serán sacados principalmente del diccionario dado para cada proyecto individualmente, y se complementará a partir de la clase estática **PythonMapper.Settings**, la cual contiene la configuración por defecto para todo el proyecto. + +Por otro lado, tenemos un sistema de gestión de memoria anidada mediante la clase objeto **PythonMapper.SearchData**, contiene los datos necesarios para la gestión de cada una de las librerías del proyecto qeu se esté trabajando, ordenando sus recursos por niveles de dependencias y de contenidos. + +Finalmente, el proyecto hace uso de la clase objeto **PythonMapper.ClassData** que contiene toda la información de cada uno de los niveles de clase de una librería, siendo el nivel 0 el Root de la propia librería y los siguientes niveles las clases, incluyendo las clases anidadas. También contiene los elementos estáticos, variables de objeto y métodos. Cada una de las clases anidadas estará compuesta por otro objeto **PythonMapper.ClassData** anidado sobre el anterior para establecer orden de dependencias. + +Para poder gestionar de una forma óptima dicho contenido, todo se moverá sobre un objeto de la clase **PythonMapper**, el cual cargarálos proyectos y los asignará a objetos de tipo **PythonMapper.Project** gestionados a partir de un único hilo que funciona como un Intervalo JavaScript para gestionar los tiempos mediante simulaciones de Wait con tiempos no definidos para su trabajo tanto en la configuración como con la capacidad de poderse cerrar prácticamente instáneamente la aplicación, con una gestión de cola o de semáforo sobre un único hilo rápido. + +Para hacer más efectivo el proceso, éste cacheará todos los archivos que ha de mapear, donde detectará si cada archivo fue alterado o no, donde si lo fue, éste se procesará y creará dará orden a actualizar el archivo de mapeado una vez termine de procesar todos los archivos. + +El proceso de los archivos, para simplificar los patrones regulares y las estructuras de búsqueda, se formatearán mediante claves que identifican las anidaciones, mediante el método estático **PythonMapper.Project.unclean_data**. Tras dicho paso se Matchearán los patrones que identifican las clases, las variables tanto estáticas como de objeto, y los métodos, y se ignorarán los elementos privados y/o repetidos, quedándose sólo los elementos ocultos o públicos en su primera aparición. La gestión de los Matcheos se hace a partir de una estructura While True que gestiona el contenido hasta que éste sea finalizado. + +Todos estos resultados se almacenan en la estructura anidada de tipo **PythonMapper.ClassData** para su posterior gestión. Cada vez que se detecta un fragmento a almacenar en dicha estructura, éste se le limpiará el formato mediante el método estático **PythonMapper.Project.clean_code**, y desprovisto de las tabulaciones iniciales para ser establecidas limpiamente después, listo para ser integrado dentro del archivo Mapper. Los niveles de anidamiento de la estructura de tipo **PythonMapper.ClassData** determinarán la tabulación. + +El orden de los elementos dentro del archivo mapeado será el dado por los archivos, aunque habrá un orden establecido para los elementos integrados en una clase donde se establece la definición de nombre de clase, luego los elementos estáticos, luego el constructor con sus correspondientes variables objeto si éste los tuviese, y finalmente los métodos del mismo, incluyendo sus modificadores. + + \ No newline at end of file diff --git a/Public/doc/es/manual/use.w.md b/Public/doc/es/manual/use.w.md new file mode 100644 index 0000000..da3b05f --- /dev/null +++ b/Public/doc/es/manual/use.w.md @@ -0,0 +1,256 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_manual_use +title_text = Usuario - Manual - PythonMapper +``` + + + +### Usuario + +Para poder utilizar este proyecto simplemente hemos de desargar el archivo **[https://git.k3y.pw/KyMAN/PythonMapper/src/branch/main/Python/PythonMapper.py Python/PythonMapper.py]** del proyecto Git. Para evitar problemas con los Path relativos internos del proyecto se aconseja clonar el proyecto. + +```sh +#!/bin/bash +git clone https://git.k3y.pw/KyMAN/PythonMapper +cd PythonMapper +``` + +Una vez clonado el proyecto, simplemente hemos de crear un archivo JSON dentro del directorio JSON de la raíz del proyecto llamado **PythonMapper.py.projects.secrets.json** donde instalaremos todos los proyectos con las librerías y propiedades que queramos automatizar a partir de la filosofía de trabajo de la librería *PythonMapper*. Este archivo JSON se compone de un diccionario donde se mete una clave para identificar cada uno de los proyectos, e internamente al valor de dicha clave, otro diccionario anidado con los siguientes atributos: + +* **path** *\(Obligatorio)*: Path absoluto del que colgarán los archivos vinculados al proyecto. +* **files** *\(Obligatorio)*: Lista de los Path relativos al Path absoluto de los archivos Python que queramos mapear. +* **map** *\(Obligatorio)*: Path relativo al Path absoluto del archivo de mapeado resultante. +* **dependences** *\(Opcional)*: Lista de dependencias que queramos agregar a dicho fichero con respecto a los tipados tanto de extensión como de implementación de las clases, así como de los tipados usados por las variables, argumentos, parámetros y/o atributos. +* **definitions** *\(Opcional)*: Lista de variables predefinidas que queramos añadir a nuestro archivo de mapeado para su correcta interpretación. Éste viene siendo una lista sencilla de Strings donde dependiendo de qué se le establece, éste actuará de una forma distinta según ciertos criterios. +* **tabulation** *\(Optional)*: String que representaría los caracteres en blanco usados por tabulación. *Por defecto son 4 espacios, pero puede ser establecido 2 espacios en blanco, un caracter de tabulación, etc. A conveniencia del usuario desarrollador.* +* **timer** *\(Optional)*: Tiempo de espera para volver a analizar los ficheros para verificar cambios en éstos y reconstruir el archivo de mapeado en milisegundos. *Por defecto son 30000 milisegundos.* +* **rest** o **rest_timer** *\(Optional)*: Tiempo de espera para el procesamiento del siguiente fichero a la hora de analizar los ficheros de un proyecto. Este tiempo es bastante importante para evitar un trabajo excesivo sobre el procesador permitiendo un descanso en milisegundos entre el procesado de un archivo y otro. *Por defecto, el tiempo de espera es de 10 milisegundos.* + +> [!!] Es importante destacar que los Paths que se usarán para la autogeneración del mepeado parten del **path** dado en la configuración concatenado mediante un Slash (**/**) al Path relativo que se esté trabajando, ya sea el del propio mapeado como el de cualquiera de los ficheros dados, por lo que es aconsejable no acabar con Slash el parámetro **path**; así como tampoco iniciar con dicho caracter ninguno de los ficheros definidos en **files** ni el Path relativo del mapeado establecido en **map**. + +La ejecución de la librería **Python/PythonMapper.py** puede ser ejecutada desde un entorno Unix desde el fichero **Tools/run.sh** del proyecto en cuestiónk, aunque puede ser también ejecutado directamente desde Python. Dicho archivo Bash Shell está diseñado para simplificar y facilitar la ejecución del mismo. + +#### Dependencias + +La lista de dependencias no es más que una lista cuyos valores pueden depender acerca de la finalidad o el sistema de importar dicha dependencia. Dichos patrones serían los siguientes: + +##### Dependencia directa + +La dependencia directa no es más que un String el cual será interpretado como código Python de forma directa. Se distingue de la opción de establecer el nombre de la dependencia por la existencia de espacios en dicho String que complementa el Script Python. + +```json +{ + "AnP" : { + "dependences" : [ + "from re import Pattern as REPattern" + ] + } +} +``` + +```py +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from re import Pattern as REPattern + +``` + +##### Dependencia por nombre + +La dependencia por nombre no es más que un String el cual contiene el nombre de la dependencia que queremos adjuntar. A diferencia de la dependencia directa, ésta no puede contener espacios y se espera el nombre o el Path Python de la dependencia separado por puntos, sin espacios y sin aliases. + +```json +{ + "AnP" : { + "dependences" : [ + "datetime" + ] + } +} +``` + +```py +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import datetime + +``` + +##### Dependencia parcial + +La dependencia parcial consta de una lista de 2 elementos donde el primer elemento es un String que determina el Path Python del paquete de la dependencia; y el segundo elemento puede ser un String o una lista de Strings para determinar uno o más elementos a importar, específicamente de dicha librería, ahorrando una importación total, siendo ésta más definida y exclusiva al uso. + +```json +{ + "AnP" : { + "dependences" : [ + ["typing", ["Any", "Optional", "NewType"]], + ["threading", "Thread"] + ] + } +} +``` + +```py +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from typing import Any, Optional, NewType +from threading import Thread + +``` + +##### Importación con alias + +La importación con alias se crea a partir de una lista de 3 elementos String los cuales son: + +1. Path Python del paquete de la dependencia. +2. Elemento que queremos importar. +3. Alias que le queremos dar. + +```json +{ + "AnP" : { + "dependences" : [ + ["re", "Pattern", "REPattern"], + ["re", "Match", "REMatch"] + ] + } +} +``` + +```py +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from re import Pattern as REPattern +from re import Match as REMatch + +``` + +#### Definiciones + +Las definiciones se usan para definir variables que ayuden a la interpretación correcta del mapeado si alguna dependencia no es aplicable desde un principio o en el conjunto del mapeado. La idea es crear temporal o permanentemente dentro del mapeado las variables de uso para tipados. Éstas pueden ser de las siguientes formas: + +> [!!] Las definiciones no son variables con un tipado concreto, sino que es la definición de un tipado a usar dentro del mapeado. + +> [!!] Si en el mapeado de Python no se integra la importación de **typing.NewType**, éste lo implementará automáticamente si hay alguna variable a crear. + +##### Definición por nombre + +Cuando se define una variable por nombre, ésta quedará con un tipado equivalente de *Any* mediante su nombre. + +```json +{ + "AnP" : { + "definitions" : [ + "AnP" + ] + } +} +``` + +```py +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from typing import NewType + +AnP = NewType("AnP", Any) + +``` + +##### Definición cruda + +La definición cruda viene siendo un String el cual genere la definición de por sí. + +```json +{ + "AnP" : { + "definitions" : [ + "AnP = NewType(\"AnP\", Any)" + ] + } +} +``` + +```py +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +AnP = NewType("AnP", Any) + +``` + +> [!! ¡IMPORTANTE!] Si se hace una definición cruda se entiende que toda dependencia que requiera está implementada en la sección de dependencias. si no es así, la librería de mapeado dará error. + +> [!!] Este tipo de definiciones se aplican a tipados que requieren de especificar conceptos de tipado concretos. + +#### Ejemplo + +Un ejemplo de un proyecto a mapear sería el propio AnP, el cual, a fecha de la creación de dicha documentación sería de la siguiente forma: + +```json +{ + "anp" : { + "path" : "/media/kyman/SSD2TB/git/AnP/Python", + "files" : [ + "Models/HTTP.py", + "Models/RoutesResponse.py", + "Abstracts/Applications.py", + "Models/Routes.py", + "Modules/ErrorsManager.py", + "Abstracts/Managers.py", + "Abstracts/OwnSettings.py", + "Abstracts/HTTP.py", + "Application/Events.py", + "Models/Threads.py", + "Models/Commands.py", + "Abstracts/Connections.py", + "Abstracts/Controllers.py", + "Managers/PrintTypes.py", + "Application/Path.py", + "Managers/Settings.py", + "Managers/I18N.py", + "Modules/WMarkDown.py", + "Models/Licenses.py", + "Managers/Licenses.py", + "Application/Threads.py", + "Application/Terminal.py", + "Managers/MimeExtensions.py", + "Managers/Connections.py", + "Managers/Views.py", + "Managers/Controllers.py", + "Managers/Routes.py", + "Managers/Servers.py", + "Managers/Applications.py", + "Models/Shell.py", + "Models/Proxy.py", + "Drivers/UnixDomainSocketWebServer.py", + "Drivers/Shell.py", + "Drivers/Curl.py", + "Drivers/CSV.py", + "Drivers/Selenium.py", + "Drivers/ProxiesList.py", + "Application/AnP.py" + ], + "map" : "Abstracts/AnPMap.py", + "dependences" : [ + ["typing", ["Any", "Optional", "Callable"]], + ["socket", "socket", "Socket"], + "datetime", + ["re", "Pattern", "REPattern"], + ["re", "Match", "REMatch"], + ["threading", "Thread"] + ], + "definitions" : [ + "Self", "WebDriver", "WebElement", "AnP", "class ObjectSetter:pass" + ] + } +} +``` + + diff --git a/Public/doc/es/opinions.w.md b/Public/doc/es/opinions.w.md new file mode 100644 index 0000000..fed4ed9 --- /dev/null +++ b/Public/doc/es/opinions.w.md @@ -0,0 +1,17 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_opinions +title_text = Opiniones y comentarios - PythonMapper +``` + + + +## Opiniones y comentarios + +Esta sección va dedicada a publicar las opiniones y comentarios de usuarios cercanos a los desarrolladores del proyecto para que halla una visión externa a éste, aprobechando la confianza en éstos tanto para lo bueno como para lo malo. + +> [!@Srx00] Quería agradecer personalmente a todos aquellos que me han dado una opinión y/o comentario acerca de este proyecto. Lo valoro mucho pues sea como crítica para aprender como apoyo a continuar con este tipo de trabajos, me son realmente importantes. ¡Muchas gracias! + +> [!@Srx00] Como opinión personal, es un proyecto raro, que le da mayor complejidad a la aplicación que lo integre, sin embargo, da una faceta de ayuda paralelamente al IDE actualizando la dependencia que mapea los objetos de una forma más clásica tirando al sistema de Java o similares, un proyecto con dependencias anidadas Python. + + \ No newline at end of file diff --git a/Public/doc/es/projects.w.md b/Public/doc/es/projects.w.md new file mode 100644 index 0000000..51ea44f --- /dev/null +++ b/Public/doc/es/projects.w.md @@ -0,0 +1,46 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_projects +title_text = Proyectos - PythonMapper +``` + + + +## Proyectos + +Este proyecto es independiente a nivel de funcionamiento como librería, sin embargo, a nivel de página Web, éste hace uso de los siguientes proyectos. + +[[""" +WMarkDown + *https://wmarkdown.k3y.pw/images/WMarkDown.png + *https://wmarkdown.k3y.pw/favicon.ico + https://wmarkdown.k3y.pw/ + https://git.k3y.pw/Whalers/WMarkDown +AnP + *https://anp.k3y.pw/images/AnP.png + *https://anp.k3y.pw/images/AnP-512.png + *https://anp.k3y.pw/favicon.ico + https://anp.k3y.pw/ + https://git.k3y.pw/AnP/AnP +CDN de KyMAN + *https://cdn.k3y.pw/images/CDN.png + *https://cdn.k3y.pw/images/CDN-512.png + *https://cdn.k3y.pw/favicon.ico + https://cdn.k3y.pw/ + https://git.k3y.pw/KyMAN/CDN +"""]] + +> [!#] Dicho proyecto hereda de otros proyectos a partir de los aquí presentados, por ejemplo, a partir del WMarkDown hereda del MathJAX, highlight.js y MermaidJS de JavaScript, entre otros. Si vais al proyecto WMarkDown podréis ver más información acerca de dichas dependencias. + +Por otro lado, este proyecto es usado en proyectos tales como los siguientes: + +[[""" +AnP + *https://anp.k3y.pw/images/AnP.png + *https://anp.k3y.pw/images/AnP-512.png + *https://anp.k3y.pw/favicon.ico + https://anp.k3y.pw/ + https://git.k3y.pw/AnP/AnP +"""]] + + \ No newline at end of file diff --git a/Public/doc/es/targets.w.md b/Public/doc/es/targets.w.md new file mode 100644 index 0000000..947f782 --- /dev/null +++ b/Public/doc/es/targets.w.md @@ -0,0 +1,36 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_targets +title_text = Objetivos - PythonMapper +``` + + + +## Objetivos + +A continuación se expondrán todos los objetivos que atañen a este proyecto. + ++ [X] Crear proyecto Git. ++ [-] Construir base Web en AnP para gestión documental y estructuración del proyecto. + + [X] Constructor del AnP Web contra WMarkDown. + + [X] Documentar filosofía y motivos de existencia de este proyecto. *[[!description.w.md]].* + + [X] Crear logo y diseño del proyecto. + + [X] Crear las secciones pertinentes a la documentación del proyecto. + + [ ] Adjuntar todos los términos de uso al diccionario del WMarkDown. + + [X] Documentar funcionamiento. ++ [X] Crear librería de trabajo. + + [X] Crear base para impresión de información sobre el terminal. + + [X] Print. + + [X] Validaciones. + + [X] Excepciones. + + [X] Establecer estructura de de proyecto JSON. + + [X] Crear base de la clase del proyecto. + + [X] Incluir gestor de proyectos. + + [X] Generar cargador de ficheros y gestión de cambios por caché. + + [X] Gestionador de bloques de anidación que afecten a los patrones regulares de identificación de elementos dentro de código. + + [X] Generar identificador de estructuras a gestionar. + + [X] Generar fichero de mapeado generado. ++ [-] Crear direcciones de donaciones. ++ [ ] Publicar. + + \ No newline at end of file diff --git a/Public/favicon.ico b/Public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9492251c38f5ca730c4050af319a29a620c455a8 GIT binary patch literal 4286 zcmcInTTE0}6g@M;NGlfm(FaMJLYfq4`qQa>{I&g18#F+yfQC2Pf`S3Y%1a)?C@|ol zs4##aj=Tm2TYTUPG@&-BMq?t?rtOD~Una(W$dAzkyj|6nOs~NnFs{0;+D1^ZrW30yR;az zySDz)53aHJP{F+m*ahSuAo`t&gBXBC&iQJ^rqSmg^NQ&b_aS%J+5lwC3l| z@?7&e_}qmapSaX-z5AT_@#xQqMIHS$8%8cfZ*OxoW(}OSaBta%F(Pwd{Il(CN9`L& zF2sVTIv2dTy~h(c2Y(FrG6%;kY3_3$WA9XJex6r{;sti_hmSQg?&Q8RbG=f~J$$<> zWwlam-+z(3yvLe`mT|7-cMnfHGuA2f)phsk!QY;lq-^UN`a|Pyo!r!SGO@X|>``9t z@yTa8c<;jN4*~E+Vdr3D$${=`=|gANmbY~Lv*pNW+82cts=sbI;z@x%6WIH%!qGlf z?Ch%oRdSv-bT+PhpUR&>{EoB)#j)M$Plxzq+(iIrG|lk6~9=OL5UGbU933 zK1ts9I9F}r(d2MmaM)cy{v8K;x^wzZCbnm#DAa*=(C$L>2gZf=?lb?F_m6dB74b{` z;}h5Sk+Sso@P)Uj1MQFlqCe0l>5q&#`HqY~9X{=E_h)}!T>hpUX@6iw;CB=#j5Z)) zzC^x9j3Dp>`k$1eA0a=azPk1v{V%8Q)LQOQ2i^mTbIBhJKI3oGu@fcv-6NMbj7+S6 zPfw>0o{5t(2lH~2tv#OK zc&?p}wi8&FV$?C!eQx!^+-${Wv)`$+Y5dfOo8WyP{`-W)xqLB5d;@BN+h%LLyZP8y zDdPJ+?sq5T7)i$0ma5`54qu1?&mHg%k~l~F#c(qTcBr|^ z6m||YK;D(ArUO@@Lzt9@xd~+Ol4(u*fVvg>?tAJTVBHuV{fT53L7v~F+A}x%Dedn} zU#H-FR}jNbnoG)5dzzLlS7jPs4-*Dch%lI!2;)HTyG9M@o&$J9@P!C&t_FA%S# z$aBBa|Bz>IG7lnuxKI~d$p0&TI@D`}{h9wOu$F+mgd%5O1>!Fj`QHYfPxZKR9t=Kg zrjNf{%;(6he|h6+4l@4a8fwE$XU6x>@_&|^|EIP5zkdR9B<%bcBtG)bKttL7uHO-N zYk_?mag>F8)Je+g9Zh2mf=%Ko_a5@lH%Z9Z9;~e)KkEhX-%?4}djyHk{C^Gk_lcJO zi|0zTJf_w^)^W(7SCDRUB4j5|3{(@(g4BYGygYh_tMohQ{5O0t_494z{ve-QV{bxV!F^@J4@XIef3su? z^85?@5A|NHS5i)(k-ZZAk3ECxueb}GKT7hy2%oi)HInrb{bKLdo{<}fr&aLtTj@h* z;$VxfKwlyzBXG`m$PGuIwJOzpJ{q|=hI8!2vS*?nVk{tm?}hoFy#Q+>dqwsL>=oEE zuy>#i?8A5$^oJ(oAjSpPm>-b;pW2WonX6eZkSi{84|kx}3xhdS9$g(5oFBam`*ZfE znhtrhxVuUAOw@sPU@u62fKT3FT(CFe8gkSQ)+yEs66dU&+(SH8C3_ZrclhE{DaH=_ zb6*{32i^tjX9msZbMM@ogglA4KL3ZXc1!-}4(|Qo4`0;*@--cb=k36|pg;JN^RjD! z@KqhOyU^Joca}cMcU~3o8%N)N`JRKe)!zkq7lYs<0pr>05Alo(@+}6zUz>Q=K#%-3 zAkShEzx@?FwL*LYiUcipM2Jv(gfL+=*drgRLdUF literal 0 HcmV?d00001 diff --git a/Public/images/PythonMapper-180.png b/Public/images/PythonMapper-180.png new file mode 100644 index 0000000000000000000000000000000000000000..8497c3803bf44902ab374ac6c6c3de0ed55906d1 GIT binary patch literal 22402 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 Hu0mjf`QEOc literal 0 HcmV?d00001 diff --git a/Public/images/PythonMapper-270.png b/Public/images/PythonMapper-270.png new file mode 100644 index 0000000000000000000000000000000000000000..2b67b4c83087462ef68d9b7b647075662357acdb GIT binary patch literal 23432 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

WsVWcZnLXg$dp@ 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 literal 0 HcmV?d00001 diff --git a/Public/images/PythonMapper.png b/Public/images/PythonMapper.png new file mode 100644 index 0000000000000000000000000000000000000000..154b201902c81d115b8da51bd9e823ef3ddea1ab GIT binary patch literal 8436 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 literal 0 HcmV?d00001 diff --git a/Public/index.w.md b/Public/index.w.md new file mode 100644 index 0000000..7999af8 --- /dev/null +++ b/Public/index.w.md @@ -0,0 +1,11 @@ +```wmd-options +language = es +title_i18n = python_mapper_title_documentation +title_text = Documentación - PythonMapper +``` + + + +[[include /doc/es/index.w.md]] + + \ No newline at end of file diff --git a/Public/scss/PythonMapper.css b/Public/scss/PythonMapper.css new file mode 100644 index 0000000..7134397 --- /dev/null +++ b/Public/scss/PythonMapper.css @@ -0,0 +1,154 @@ +.python-mapper { + position: relative; + top: 0em; + left: 0em; + width: 100%; + height: 100%; + overflow: hidden; + background-color: #EFEFEF; + color: #222; } + .python-mapper, .python-mapper input, .python-mapper button, .python-mapper select { + font-family: "Roboto"; } + .python-mapper pre, .python-mapper textarea, + .python-mapper .wmd-code-block, + .python-mapper .wmd-code-block ol > li::marker, + .python-mapper .wmd-code-doc > .description { + font-family: "Roboto Mono"; } + .python-mapper [data-icon]::before { + font-family: "FA6FR"; } + .python-mapper input, .python-mapper button, .python-mapper select, .python-mapper textarea { + font-size: 1em; } + .python-mapper [data-visible=false], .python-mapper [data-hidden=true] { + display: none; } + .python-mapper a[href] { + text-decoration: none; + word-break: break-word; } + .python-mapper a[href], .python-mapper [onclick], .python-mapper [onmouseover], .python-mapper [onmousedown], .python-mapper button, .python-mapper [type=button], .python-mapper [type=reset], .python-mapper [type=submit] { + cursor: pointer; + transition-duration: 1s; } + .python-mapper a[href]:hover, .python-mapper [onclick]:hover, .python-mapper [onmouseover]:hover, .python-mapper [onmousedown]:hover, .python-mapper button:hover, .python-mapper [type=button]:hover, .python-mapper [type=reset]:hover, .python-mapper [type=submit]:hover { + transition-duration: 0.2s; } + .python-mapper a[href], .python-mapper [onclick], .python-mapper [onmouseover], .python-mapper [onmousedown], .python-mapper button, .python-mapper [type=button], .python-mapper [type=reset], .python-mapper [type=submit] { + color: #459; + transition-property: color; } + .python-mapper a[href]:hover, .python-mapper [onclick]:hover, .python-mapper [onmouseover]:hover, .python-mapper [onmousedown]:hover, .python-mapper button:hover, .python-mapper [type=button]:hover, .python-mapper [type=reset]:hover, .python-mapper [type=submit]:hover { + color: #BA5; } + .python-mapper [onmouseover], .python-mapper [onmousedown] { + color: #333c5e; + transition-property: color; } + .python-mapper [onmouseover]:hover, .python-mapper [onmousedown]:hover { + color: #6f663c; } + .python-mapper a[href], .python-mapper [onclick] { + transition-property: color; } + .python-mapper button, .python-mapper [type=button], .python-mapper [type=reset], .python-mapper [type=submit] { + border-color: 0.1em solid #459; + box-shadow: 0em 0em 0.4em #459; + transition-property: color,border-color,box-shadow; } + .python-mapper button:hover, .python-mapper [type=button]:hover, .python-mapper [type=reset]:hover, .python-mapper [type=submit]:hover { + border-color: 0.1em solid #BA5; + box-shadow: 0em 0em 0.4em #BA5; } + .python-mapper .wmd-dictionary-item { + color: #333c5e; } + .python-mapper .wmd-dictionary-item:hover { + color: #6f663c; } + .python-mapper h2 { + font-size: 2.6em; } + .python-mapper h3 { + font-size: 2.2em; } + .python-mapper h4 { + font-size: 1.8em; } + .python-mapper h5 { + font-size: 1.4em; } + .python-mapper h6 { + font-size: 1em; } + .python-mapper ul, .python-mapper ol { + padding: 0em 2em; } + .python-mapper header, .python-mapper main, .python-mapper footer { + position: absolute; + left: 0em; + width: 100%; } + .python-mapper header, .python-mapper footer { + overflow: hidden; + display: flex; + flex-direction: row; + box-shadow: 0em 0em 0.125em #EFEFEF, 0em 0em 0.25em #EFEFEF, 0em 0em 0.5em #EFEFEF, 0em 0em 1em #EFEFEF, 0em 0em 2em #EFEFEF; } + .python-mapper header > *, .python-mapper footer > * { + flex: auto; + align-self: center; } + .python-mapper header { + top: 0em; + height: 4em; + z-index: 20; } + .python-mapper header h1 { + margin: .2em 1em; + padding: 0em; + font-size: 1em; + text-wrap: nowrap; } + .python-mapper header h1 .image { + height: 3.6em; } + .python-mapper header h1 img { + width: auto; + height: 3.6em; } + .python-mapper header h1 img + span { + display: none; } + .python-mapper header h1 span + span { + font-size: 3.4em; + height: 0.9444444444em; } + .python-mapper header h1 a > span { + display: inline-block; + vertical-align: top; } + .python-mapper main { + top: 4em; + bottom: 2.5em; + padding: 1% 2%; + z-index: 10; + overflow: auto; + box-sizing: border-box; } + .python-mapper footer { + bottom: 0em; + height: 2.5em; + z-index: 30; } + .python-mapper .main-menu { + width: 25em; + text-align: center; } + .python-mapper .main-menu ul { + list-style-type: none; + margin: 0em; + padding: 0em; } + .python-mapper .main-menu li { + display: inline-block; + margin: 0em .6em; } + .python-mapper .licenses { + display: flex; + flex-direction: row; + justify-content: center; + position: absolute; + left: 0em; + bottom: 0em; + width: 100%; + text-align: center; + padding: .1em .2em; + font-weight: 900; + font-size: .85em; + box-sizing: border-box; } + .python-mapper .license { + display: flex; + flex-direction: row; + align-self: center; + margin: 0em .2em; + text-align: center; + box-sizing: border-box; } + .python-mapper .license span { + flex: auto; + align-self: center; } + .python-mapper .license > * { + vertical-align: middle; } + .python-mapper .license img { + width: auto; + height: 2.5em; + margin: .2em .2em; } + +.python-mapper h1 .image + span { + font-size: 3.1em; } + +/*# sourceMappingURL=PythonMapper.css.map */ diff --git a/Public/scss/PythonMapper.css.map b/Public/scss/PythonMapper.css.map new file mode 100644 index 0000000..c8e5220 --- /dev/null +++ b/Public/scss/PythonMapper.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["PythonMapper.scss","../../../AnP/Public/scss/AnP.common.scss","../../../AnP/Public/scss/AnP.settings.scss"], +"names": [], +"file": "PythonMapper.css" +} diff --git a/Public/scss/PythonMapper.scss b/Public/scss/PythonMapper.scss new file mode 100644 index 0000000..e06751f --- /dev/null +++ b/Public/scss/PythonMapper.scss @@ -0,0 +1,10 @@ +@import "../../../AnP/Public/scss/AnP.settings.scss"; +$color-primary : #459; +$color-secondary : #BA5; +@import "../../../AnP/Public/scss/AnP.common.scss"; + +.python-mapper{ + @include main_web; +} + +.python-mapper h1 .image+span{font-size : 3.1em;} \ No newline at end of file diff --git a/Python/Application/PythonMapper.py b/Python/Application/PythonMapper.py new file mode 100644 index 0000000..57e2fcb --- /dev/null +++ b/Python/Application/PythonMapper.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from Abstracts.Applications import ApplicationsAbstract +from Abstracts.AnPMap import AnP, Optional, Any +from os.path import abspath as path_absolute +from os.path import dirname as directory_name + +class PythonMapper(ApplicationsAbstract): + + def __init__(self, anp:AnP|None, inputs:Optional[dict[str, Any|None]|tuple|list] = None) -> None: + super().__init__(anp, "python_mapper", anp.path.get_parent(path_absolute(directory_name(__file__))), { + **anp.get_dictionary(inputs), + "python_mapper_default_settings_files" : "/JSON/PythonMapper.py.settings.json" + }) \ No newline at end of file diff --git a/Python/PythonMapper.py b/Python/PythonMapper.py new file mode 100644 index 0000000..ee795e2 --- /dev/null +++ b/Python/PythonMapper.py @@ -0,0 +1,780 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from inspect import FrameInfo +from typing import Any, Optional +from os.path import dirname as directory_name +from os.path import abspath as path_absolute +from os.path import exists as path_exists +from threading import Thread +from json import loads as json_decode +from time import sleep +import random +from re import compile as RECompile +from re import Pattern as REPattern +from re import Match as REMatch +from re import MULTILINE as RE_MULTILINE +from time import time as timestamp +from signal import SIGINT as SIGNAL_INTERRUPTION +from signal import signal as signal_method +from inspect import stack as get_stack +from traceback import format_stack as trace_format_stack +from traceback import extract_tb as extract_traceback +import datetime +from io import TextIOWrapper + +class PythonMapper: + + class Settings: + random_wait_time_in_use:int = 500 + project_process_timer:int = 30000 + process_subtimer:int = 100 + process_time:int = 1000 + print_format:str = "[{type}] {yyyy}{mm}{dd} {hh}{ii}{ss}.{nnn} [{line}]{file}({method}): {message}" + exception_format:int = " '{file}({method})[{line}]'{lines}\n\n{exception_message}" + rest_time_per_process_file:int = 10 + tabulation_character:str = " " + + class CodeBlock: + def __init__(self): + self.class_data:str = "" + self.class_code:list[PythonMapper.CodeBlock] = [] + self.methods:list[str] = [] + self.static_variables:list[str] = [] + self.object_variables:list[str] = [] + self.constructor:str = "" + + class ClassData: + def __init__(self, class_name:str, spaces:int) -> None: + self.object_done:list[str] = [] + self.static_done:list[str] = [] + self.spaces:int = spaces + self.class_name:str = class_name + self.code:PythonMapper.CodeBlock = PythonMapper.CodeBlock() + + class SearchData: + def __init__(self) -> None: + self.levels:list[PythonMapper.ClassData] = [PythonMapper.ClassData("ROOT", 0)] + self.i:int = 0 + + class Project: + + methods:dict[str, REPattern] = { + "class_item" : RECompile(r'^([ \t]*)class[ \t]+([a-zA-Z0-9_]+)(#[^\:]+)?(?=\:)', RE_MULTILINE), + "method" : RECompile(r'^([ \t]*\@[^\r\n]+(\n|\r\n))*([ \t]*)def[ \t]+(_?[^_][a-zA-Z0-9_]*|__init__)(#[^\:]+)(?=\:)', RE_MULTILINE), + "object_variable" : RECompile(r'^[ \t]+(self[ \t]*\.[ \t]*(_?[^_][a-zA-Z0-9_]*)([ \t]*\:[^\=\r\n]+)?)([ \t]*=|[\r\n]|$)', RE_MULTILINE), + "static_variable" : RECompile(r'^([ \t]*)(_?[^_][a-zA-Z0-9]*)([ \t]*\:[^\r\n\=]+)?(?=[ \t]*\=)(?!\=)', RE_MULTILINE) + } + + re_unclean_code:REPattern = RECompile(r'(? None: + + self.parent:PythonMapper = parent + self.name:str = name + self.timer:int = inputs["timer"] if "timer" in inputs else PythonMapper.Settings.project_process_timer + self.rest_timer:int = ( + inputs["rest_timer"] if "rest_timer" in inputs else + inputs["rest"] if "rest" in inputs else + PythonMapper.Settings.rest_time_per_process_file + ) + self.path:str = inputs["path"] + self.files:tuple[str] = tuple(inputs["files"]) + self.map:str = inputs["map"] + self.__cache:dict[str, str] = {} + self.in_use:bool = False + self.__last_time:int = 0 + self.__data:list[PythonMapper.CodeBlock|None] = [] + self.dependences:list[str|list[str, str|list[str]]|list[str, str, str]|list[str]] = inputs["dependences"] if "dependences" in inputs else [] + self.definitions:list[str] = inputs["definitions"] if "definitions" in inputs else [] + self.tabulation:str = inputs["tabulation"] if "tabulation" in inputs else PythonMapper.Settings.tabulation_character + + if len(self.definitions): + + has_new_type:bool = False + dependence:str|list[str, str|list[str]]|list[str, str, str]|list[str] + + for dependence in self.dependences: + if isinstance(dependence, list) and len(dependence) > 1 and dependence[0] == "typing" and (dependence[1] == "NewType" if isinstance(dependence[1], str) else "NewType" in dependence[1]): + has_new_type = True + break + + if not has_new_type: + self.dependences += [["typing", "NewType"]] + + def process(self) -> None: + + time:int = PythonMapper.time() + + if time - self.__last_time >= self.timer: + self.__update_cache() and self.__process_cache_file() + self.__last_time = time + + def __process_cache_level(self, block:Any, level:int) -> str: + + white_spaces:str = "" + code:str = "" + subblock:PythonMapper.CodeBlock + method:str + variable:str + has_class:bool = block.class_data != "" + + block:PythonMapper.CodeBlock = block + + for _ in range(level - 1): + white_spaces += self.tabulation + + if has_class: + code += "\n\n" + white_spaces + block.class_data + ":" + white_spaces += self.tabulation + + for subblock in block.class_code: + code += self.__process_cache_level(subblock, level + 1) + + if len(block.static_variables): + code += "\n" + for variable in block.static_variables: + code += "\n" + white_spaces + variable + " = None" + + if has_class: + + l:int = len(block.object_variables) + + if l or block.constructor: + + tabulation:str = white_spaces + self.tabulation + + code += "\n\n" + white_spaces + (block.constructor + ":" if block.constructor else "def __init__(self):") + + if l: + for variable in block.object_variables: + code += "\n" + tabulation + variable + " = None" + else: + code += "\n" + tabulation + "pass" + + for method in block.methods: + code += "\n\n" + white_spaces + method + ":pass" + + return code + + def __process_cache_file(self) -> None: + + # b:PythonMapper.CodeBlock + + # for i, block in enumerate(self.__data): + # print([i, [b.class_data for b in block.class_code]]) + + # return + + code:str = ( + "#!/usr/bin/env python\n" + + "# -*- coding: utf-8 -*-" + ) + block:PythonMapper.CodeBlock + + if len(self.dependences): + + dependence:str|list[str, str|list[str]]|list[str, str, str]|list[str] + + code += "\n" + + for dependence in self.dependences: + if isinstance(dependence, str): + if " " in dependence: + code += "\n" + dependence + continue + dependence = [dependence] + + l:int = len(dependence) + + if l == 1: + code += "\nimport " + (dependence[0] if isinstance(dependence[0], str) else ", ".join(dependence[0])) + elif l == 2: + code += "\nfrom " + dependence[0] + " import " + (dependence[1] if isinstance(dependence[1], str) else ", ".join(dependence[1])) + elif l == 3: + code += "\nfrom " + dependence[0] + " import " + dependence[1] + " as " + dependence[2] + + if len(self.definitions): + + definition:str + + code += "\n" + + for definition in self.definitions: + code += "\n" + (definition if "=" in definition or " " in definition else definition + " = NewType(\"" + definition + "\", Any)") + + for block in self.__data: + code += self.__process_cache_level(block, 0) + + self.parent.save_file(self.path + '/' + self.map, code) + + def __update_cache(self) -> bool: + + i:int + file:str + has_changes:bool = False + + for i, file in enumerate(self.files): + if not self.parent._working: + break + + error:int + data:int + path:str = self.path + '/' + file + + data, error = self.parent.load_file(path) + + if not error and (path not in self.__cache or data != self.__cache[path]): + self.__cache[path] = data + self.__process_code(path, data, i) + if not has_changes: + has_changes = True + sleep(self.rest_timer / 1000.0) + + return has_changes + + @staticmethod + def unclean_code(code:str) -> tuple[str, tuple[str]]: + + blocks:tuple[str] = tuple() + i:int = 0 + + while True: + + matches:REMatch = PythonMapper.Project.re_unclean_code.search(code) + + if not matches: + break + + position:tuple[int, int] = matches.span() + + blocks += (code[position[0]:position[1]],) + code = code[:position[0]] + "###UNCLEAN"+ str(i) + "KEY###" + code[position[1]:] + i += 1 + + return (code, blocks) + + @staticmethod + def clean_code(code:str, blocks:tuple[str]) -> str: + + while True: + + matches:REMatch = PythonMapper.Project.re_clean_code.search(code) + + if not matches: + break + + position:tuple[int, int] = matches.span() + + code = code[:position[0]] + blocks[int(matches.group(1))] + code[position[1]:] + + return code + + @staticmethod + def get_group(code:str, pattern:REPattern) -> list[REMatch|None, list[int, int], bool]: + + matches:REMatch|None = pattern.search(code) + position:int = list(matches.span()) if matches else [-1, -1] + ok:bool = matches != None and position[0] >= 0 + + return [matches, position, ok] + + def __process_code(self, path:str, code:str, k:int) -> None: + + blocks:tuple[str] + l:int = len(code) + sets:dict[str, list[REMatch|None, int, bool]] = {} + data:PythonMapper.SearchData = PythonMapper.SearchData() + + code, blocks = PythonMapper.Project.unclean_code(code) + + self.parent._print("info", "The code with '{length}' characters from file '{path}' was uncleaned with '{l}' items.", { + "length" : l, + "path" : path, + "l" : len(blocks) + }) + + while True: + + selected:str = "" + i:int = -1 + key:str + pattern:REPattern + has_next:bool = False + matches:REMatch + ok:bool + span:list[int, int] + position:list[int, int] + + for key, pattern in PythonMapper.Project.methods.items(): + if key not in sets: + sets[key] = PythonMapper.Project.get_group(code, pattern) + + matches, span, ok = sets[key] + + if not ok: + continue + + if span[0] < 0: + matches, span, ok = sets[key] = PythonMapper.Project.get_group(code, pattern) + + if ok and (i < 0 or span[0] < i): + i = span[0] + selected = key + if not has_next: + has_next = True + + if not has_next: + break + + matches, span, ok = sets[selected] + + getattr(PythonMapper.Project, selected)(code, PythonMapper.Project.clean_code(code[span[0]:span[1]], blocks).strip(), data, matches) + # getattr(PythonMapper.Project, selected)(code, code[span[0]:span[1]], data, matches) + + code = code[span[1]:] + + if not code: + break + + for key, (matches, position, ok) in sets.items(): + if ok: + sets[key][1] = [i - span[1] for i in position] + + if k == len(self.__data): + self.__data += [None] + while data.i: + data.i -= 1 + data.levels[data.i].code.class_code += [data.levels[data.i + 1].code] + self.__data[k] = data.levels[0].code + + @staticmethod + def set_level(data:Any, spaces:int) -> bool: + + data:PythonMapper.SearchData = data + + if spaces > data.levels[data.i].spaces: + if data.i and data.levels[data.i].spaces == data.levels[data.i - 1].spaces: + data.levels[data.i].spaces = spaces + else: + + i:int = len(data.levels) + + while data.levels[data.i].spaces > spaces: + data.i -= 1 + data.levels[data.i].code.class_code += [data.levels[data.i + 1].code] + i -= 1 + + data.levels = data.levels[:i] + + return data.levels[data.i].spaces == spaces + + @classmethod + def class_item(self, code:str, fragment:str, data:Any, matches:REMatch): + + data:PythonMapper.SearchData = data + + if self.set_level(data, len(matches.group(1))): + data.levels += [PythonMapper.ClassData(matches.group(2), len(matches.group(1)))] + data.i += 1 + data.levels[data.i].code.class_data = fragment + # print(["class_item", fragment]) + + @classmethod + def method(self, code:str, fragment:str, data:Any, matches:REMatch): + + data:PythonMapper.SearchData = data + name:str = matches.group(4) + + if self.set_level(data, len(matches.group(3))): + if name == "__init__" and not data.levels[data.i].code.constructor and "@" not in fragment[:fragment.index("__init__")]: + data.levels[data.i].code.constructor = fragment + else: + data.levels[data.i].code.methods += [fragment] + # print(["method", fragment]) + + @classmethod + def object_variable(self, code:str, fragment:str, data:Any, matches:REMatch): + + name:str = matches.group(1) + data:PythonMapper.SearchData = data + + if name in data.levels[data.i].object_done: + return + data.levels[data.i].object_done += [name] + + fragment = (fragment[:-1] if fragment[-1] == "=" else fragment).strip() + data.levels[data.i].code.object_variables += [fragment] + + # print(["object_variable", fragment]) + + @classmethod + def static_variable(self, code:str, fragment:str, data:Any, matches:REMatch): + + name:str = matches.group(2) + data:PythonMapper.SearchData = data + + if not self.set_level(data, len(matches.group(1))) or name in data.levels[data.i].static_done: + return + data.levels[data.i].static_done += [name] + + data.levels[data.i].code.static_variables += [fragment] + # print(["static_variable", data.i, name, len(matches.group(1)), fragment]) + # print(["static_variable", fragment]) + + re_string_variables:REPattern = RECompile(r'\{([^\{\}]+)\}') + re_break_lines:REPattern = RECompile(r'\r\n|[\r\n]') + re_exception_line:REPattern = RECompile(r'^\s*File "([^"]+)", line ([0-9]+), in ([^\n]+)(.*|[\r\n]*)*$') + + def __init__(self, inputs:dict[str, Any|None]) -> None: + + key:str + + self.__inputs:dict[str, Any|None] = inputs + self.__projects:dict[str, PythonMapper.Project] = {} + self.__thread:Thread = Thread(target = self.__process_projects) + self.__root_path:str = path_absolute(directory_name(__file__)) + self.__root_path_l:int = len(self.__root_path) + 1 + self.__files_projects:tuple[str] = (self.__root_path + "/../JSON/PythonMapper.py.projects.secrets.json",) + self._working:bool = True + self.__last_process_try:int = 0 + + signal_method(SIGNAL_INTERRUPTION, self.signal_handler) + + for key in ("projects_files", "projects_file", "project_file"): + if key in inputs: + if isinstance(inputs[key], str): + self.__files_projects += (inputs[key],) + elif isinstance(inputs[key], list): + self.__files_projects += tuple(inputs[key]) + elif isinstance(inputs[key], tuple): + self.__files_projects += inputs[key] + + self.update_projects() + + self.__thread.start() + + # print(self.__projects) + + def signal_handler(self, signal_id:int, frame:Any) -> None: + self.stop() + print("The PythonMapper was stopped successfully.") + + def stop(self) -> None: + if self._working: + self._working = False + + @staticmethod + def string_variables(string:str, variables:Optional[dict[str, Any|None]] = {}) -> str: + + def callback(matches:REMatch) -> str: + + key:str = matches.group(1) + + return str(variables[key]) if key in variables else matches.group(0) + + return PythonMapper.re_string_variables.sub(callback, string) + + def get_action_data(self, i:int = 1) -> dict[str, str|int]: + + stack:FrameInfo = get_stack()[1 + i] + + return { + "file" : stack.filename[self.__root_path_l:], + "method" : stack.function, + "line" : stack.lineno + } + + def _print(self, _type:str, message:str, variables:Optional[dict[str, Any|None]] = None, i:Optional[int] = 1) -> None: + + type_l:int = len(_type) + date:datetime.datetime = datetime.datetime.now() + own:dict[str, Any|None] = { + "type" : " "[int(type_l / 2):] + _type[0:4].upper() + " "[int((type_l + 1) / 2):], + **self.get_action_data(i) + } + key:str + + for key in ("year", "month", "day", "hour", "minute", "second"): + + k:str = "i" if key == "minute" else key[0] + + own[key] = own[k] = getattr(date, key) % 100 + own[k + k] = ("00" + str(own[k]))[-2:] + + own["year"] = own["yyyy"] = date.year + own["milliseconds"] = own["n"] = int(date.microsecond / 1000) + own["nnn"] = ("000" + str(own["n"]))[-3:] + + variables = {**own, **variables} + variables["message"] = PythonMapper.string_variables(message + ( + PythonMapper.Settings.exception_format if variables["type"] == "EXCE" else + "{list}" if variables["type"] == "ERRO" else + ""), variables) + + print(PythonMapper.string_variables(PythonMapper.Settings.print_format, variables)) + + def validate(self, + error:int, + messages:Optional[tuple[str]] = tuple(), + variables:Optional[dict[str, Any|None]] = {}, + error_message:Optional[str|None] = None, + ok_message:Optional[str] = None + ): + if error: + if error_message: + + list_messages:str = "" + i:int = 0 + l:int = len(messages) + + while 1 << i <= error: + if error & 1 << i: + list_messages += PythonMapper.string_variables("\n - [{i}] {message}", { + "i" : i, + "message" : PythonMapper.string_variables(messages[i], variables) if i < l else "error_message_" + str(i) + }) + i += 1 + + self._print("error", error_message, { + **variables, + "list" : list_messages, + "code" : error + }) + + return False + + ok_message and self._print("ok", ok_message, variables) + + return True + + def exception(self, + exception:Exception, + message:Optional[str|list|tuple] = None, + variables:Optional[dict[str, Any]|list|tuple] = None, + i:Optional[int] = 1 + ) -> None: + + lines:list[str]|None = extract_traceback(exception.__traceback__).format() + line_matches:REMatch[str]|None = self.re_exception_line.match(lines[-1]) + key:str + value:Any|None + block:str|None + data:dict[str, Any|None] = { + **{key : value for subset in (variables if isinstance(variables, (list, tuple)) else (variables,)) for key, value in (subset if isinstance(subset, dict) else {}).items()}, + **self.get_action_data(1), + "lines" : "", + "exception_message" : str(exception), + "method" : line_matches.group(3), + "line" : line_matches.group(2), + "file" : line_matches.group(1)[self.__root_path_l:] + } + + for block in trace_format_stack()[:-2] + lines: + if block: + data["lines"] += "\n " + self.re_break_lines.split(block.strip())[0] + + data["end"] = PythonMapper.string_variables(PythonMapper.Settings.exception_format, data) + + message and self._print("exception", message, data, i + 1) + + def load_file(self, path:str) -> tuple[str|None, int]: + + error:int = ( + 1 << 0 if path == None else + 1 << 1 if not isinstance(path, str) else + 1 << 2 if not path else + 1 << 3 if not path_exists(path) else + 0) << 0 + data:str|None = None + + if not error: + + opened:TextIOWrapper[Any] + + try: + with open(path, 'r') as opened: + data = opened.read() + except Exception as exception: + error |= 1 << 0 + self.exception(exception, "There was an exception trying load file '{path}'.", { + "path" : path[self.__root_path_l:] if self.__root_path in path else path + }) + + self.validate( + error, + ( + "exception", + "path_null", + "path_not_string", + "path_empty", + "path_not_exists" + ), + { + "path" : path[self.__root_path_l:] if self.__root_path in path else path + }, + "There was any error with code '{code}' trying load the file '{path}'.", + "The file '{path}' was loaded successfully." + ) + + return data, error + + def save_file(self, path:str, content:str) -> int: + + error:int = ( + (( + 1 << 0 if path == None else + 1 << 1 if not isinstance(path, str) else + 1 << 2 if not path else + # 1 << 3 if not path_exists(path) else + 0) << 0) | + (( + 1 << 0 if content == None else + 1 << 1 if not isinstance(content, str) else + # 1 << 2 if not content else + 0) << 4) | + 0) << 1 + + if not error: + + opened:TextIOWrapper[Any] + + try: + with open(path, "w") as opened: + opened.write(content) + except Exception as exception: + error |= 1 << 0 + self.exception(exception, "There was an exception trying save file '{path}' with {bytes} bytes of String data.", { + "path" : path, + "bytes" : len(content) + }) + + self.validate( + error, + ( + "exception", + "path_null", + "path_not_string", + "path_empty", + "path_not_exists" + "content_null", + "content_not_string", + "content_empty" + ), + { + "path" : path, + "bytes" : len(content) if isinstance(content, str) else -1 + }, + "There was any error with code '{code}' trying save file '{path}' with {bytes} bytes of String data.", + "The file '{path}' was write with {bytes} bytes of String data successfully." + ) + + return error + + def __load_projects_file(self, path:str) -> int: + + error:int + data:str|None + + data, error = self.load_file(path) + + error <<= 3 + + if data: + try: + + project_key:str + project_data:dict[str, str|list[str]] + projects:dict[str, dict[str, str|list[str]]] = json_decode(data) + + for project_key, project_data in projects.items(): + if project_key in self.__projects: + while self.__projects[project_key]["in_use"]: + if not self._working: + error |= 1 << 1 + break + sleep((random.random() * PythonMapper.Settings.random_wait_time_in_use) / 1000.0) + if self._working: + del self.__projects[project_key] + if not self._working: + error |= 1 << 1 + break + try: + self.__projects[project_key] = PythonMapper.Project(self, project_key, project_data) + except Exception as exception: + error |= 1 << 2 + self.exception(exception, "There was an exception trying load the project '{key}' from '{path}'.", { + "path" : path[self.__root_path_l:] if self.__root_path in path else path, + "key" : project_key + }) + if project_key in self.__projects: + del self.__projects[project_key] + + except Exception as exception: + error |= 1 << 0 + self.exception(exception, "There was an exception trying load the projects from file '{path}'.", { + "path" : path[self.__root_path_l:] if self.__root_path in path else path + }) + + self.validate( + error, + ( + "exception", + "not_working", + "project_building_exception", + "load_exception", + "path_null", + "path_not_string", + "path_empty", + "path_not_exists" + ), + { + "path" : path[self.__root_path_l:] if self.__root_path in path else path + }, + "There was any error with code '{code}' trying loading the projects of file '{path}'.", + "The projects of file '{path}' was loaded successfully." + ) + + return error + + def update_projects(self) -> int: + + error:int = 0 + + for file in self.__files_projects: + if self.__load_projects_file(file): + error |= 1 << 1 + + self.validate( + error, + ( + "exception", + "load_projects_errors" + ), + {}, + "There was any error with code '{code}' trying update the projects.", + "The projects was updated successfully." + ) + + return error + + @staticmethod + def time() -> int: + return int(timestamp() * 1000) + + def __process_projects(self) -> None: + while self._working: + + time:int = PythonMapper.time() + + if time - self.__last_process_try >= PythonMapper.Settings.process_time: + + project:PythonMapper.Project + + for project in self.__projects.values(): + project.process() + + self.__last_process_try = time + + sleep(PythonMapper.Settings.process_subtimer / 1000.0) \ No newline at end of file diff --git a/Python/run.py b/Python/run.py new file mode 100644 index 0000000..be6b42c --- /dev/null +++ b/Python/run.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from PythonMapper import PythonMapper + +python_mapper:PythonMapper = PythonMapper({}) \ No newline at end of file diff --git a/README.md b/README.md index a88688c..3e42eb9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ # PythonMapper -Python Mapper is a very simple project with a mapping Python files in one unique non functional Python file target. This unique file help to IDE helping the developer. \ No newline at end of file +Python Mapper is a very simple project with a mapping Python files in one unique non functional Python file target. This unique file help to IDE helping the developer. For more info of this project, documentation, etc. You could visit its official Website: + +- https://pythonpmapper.k3y.pw/ + +> **WARNING**: This project was hosted in an own creator server that it will down all nights for break of him. \ No newline at end of file diff --git a/Tools/run.sh b/Tools/run.sh new file mode 100755 index 0000000..bf44c4a --- /dev/null +++ b/Tools/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash +directory=`dirname $(readlink -f "$0")` +python3 $directory/../Python/run.py; \ No newline at end of file diff --git a/Tools/sass.sh b/Tools/sass.sh new file mode 100755 index 0000000..f8f8bbd --- /dev/null +++ b/Tools/sass.sh @@ -0,0 +1,3 @@ +#!/bin/bash +directory=`dirname $(readlink -f "$0")` +sass $directory/../Public/scss/PythonMapper.scss ../Public/scss/PythonMapper.css; \ No newline at end of file diff --git a/version b/version new file mode 100644 index 0000000..3bc5d84 --- /dev/null +++ b/version @@ -0,0 +1 @@ +0.0.1.0 \ No newline at end of file