
يعمل Pyggester - (Python + Suggester) كمحلل ديناميكي وثابت. يكمن الغرض الأساسي في تقديم اقتراحات لتعزيز كفاءة رمز الثعبان من خلال معالجة الاستخدام دون المستوى الأمثل لهياكل البيانات.
يقدم Pyggester واجهة CLI لائقة لوظائفها. تم بناء CLI على رأس Typer
Execution command :
pyggest output :
_____
_____________ ________ _______ ______________ /_____________
___ __ _ / / /_ __ `/_ __ `/ _ _ ___/ __/ _ _ ___/
__ /_/ / /_/ /_ /_/ /_ /_/ // __/(__ )/ /_ / __/ /
_ .___/___, / ___, / ___, / ___//____/ __/ ___//_/
/_/ /____/ /____/ /____/
Usage: pyggest [OPTIONS] COMMAND [ARGS]...
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize the installation. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ static Perform static analysis using PyggestStatic. │
│ transform Perform dynamic transformation using PyggesterDynamic. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
يقدم Pyggester CLI ميزتين متميزتين:
التحليل الثابت: تفحص هذه الميزة بشكل شامل الكود الخاص بك دون تنفيذها ، وتوفير رؤى ثاقبة في بنيتها والتحسينات المحتملة.
Execution command
[! ملاحظة] يوجد القالب الفرعي "الثابت" ، ولكن ليس له وظائف يتم تنفيذه ، لأن لدينا بالفعل تحليلات ثابتة جيدة (Pylint ، Ruff ، Flake8). في التكرارات المستقبلية ، إذا حددنا الاقتراحات التي يمكن تحديدها من خلال التحليل الثابت ، فسنقوم بدمجها في هذه الميزة.
pyggest staticالتحول الديناميكي/التلقائي: تضيف هذه الميزة رمزًا إضافيًا إلى ملفات Python لتحليل هياكل البيانات الخاصة بك في وقت التشغيل. رمزك الأصلي يبقى كما هو ؛ لن يتغير. يتم إنشاء ملف جديد يشبه الأصلي ولكن مع رمز إضافي. هذا يعمل مع كل من الملفات الفردية والأدلة الكاملة (هياكل المشروع الكاملة).
Execution command
pyggest transform[! info] يقدم Pyggester وثائق مدمجة للاستخدام التفصيلي
pyggest transform --help
pyggest static --help # NOT IMPLEMENTEDيمكنك بسهولة تثبيت مكتبة Python باستخدام PIP. افتح المحطة الخاصة بك وقم بتشغيل الأمر التالي:
pip install pyggesterاستنساخ المستودع: افتح المحطة الخاصة بك وقم بتشغيل الأمر التالي لاستنساخ مستودع github إلى جهازك المحلي:
git clone [email protected]:ValdonVitija/pyggester.gitانتقل إلى المستودع: قم بتغيير دليل العمل الخاص بك إلى المستودع المستنسخ:
cd pyggesterقم بتثبيت Pyggester باعتباره Pacakge محليًا:
[! مهم] فكر في القيام بذلك في بيئة افتراضية (VenV) إن أمكن.
pip install .لنفترض أن لديك ملف Python واحد تريد تحليله ديناميكيًا (تحليل وقت التشغيل)
قبل تحويل الكود مع Pyggester:
(venv) root@user: ~ /my_app > ls
app.pyمحتوى app.py:
def sum_of_integers ( integer_list ):
total = sum ( integer_list )
return total
my_list = [ 1 , 2 , 3 , 4 , 5 ]
print ( sum_of_integers ( my_list ))مهم
تأكد من أنك في بيئة افتراضية مع تثبيت Pyggester قبل الذهاب إلى الخطوة التالية.
(venv) root@devs04: ~ /my_app > pyggest transform app.py
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ File transformed successfully ! │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯(venv) root@devs04: ~ /my_app > ls
app.py app_transformed.pyمحتوى app_transformed.py:
from pyggester . observable_collector import OBSERVABLE_COLLECTOR
from pyggester . observables import ObservableNumpyArray , ObservableNamedTuple , ObservableSet , ObservablePandasDataFrame , ObservableList , ObservableDict , ObservableTuple
def sum_of_integers ( integer_list ):
total = sum ( integer_list )
return total
my_list = ObservableList ([ 1 , 2 , 3 , 4 , 5 ])
OBSERVABLE_COLLECTOR . append ( my_list )
print ( sum_of_integers ( my_list ))
for observable in OBSERVABLE_COLLECTOR :
observable . run ()مهم
لدينا الآن ملف جديد ، تم إنشاؤه تلقائيًا ، يعكس الملف الأصلي. يتضمن هذا الملف الجديد جميع محتويات الأصل ، بالإضافة إلى رمز إضافي لتحليل الكود الخاص بك أثناء وقت التشغيل. بدلاً من تشغيل "app.py" الأصلي ، يجب عليك الآن تشغيل "app_transformed.py". كن مطمئنًا ، يتم الاحتفاظ بكل شيء من "app.py" في "app_transformed.py".
(venv) root@devs04: ~ /my_app > python3 app_transformed.py
15
╭────────────────────────────────────────────────────────────────────────────╮
│ 10 | Suggestions(/root/my_app/app_transformed.py): │
│ [ * ] Consider using an array.array instead of a list, for optimal │
│ memory consumption │
│ [ * ] Consider using a set instead of a list, because of unique elements │
╰────────────────────────────────────────────────────────────────────────────╯لنفترض أن لديك مشروع بيثون (دليل/ريبو) تريد تحليله ديناميكيًا (تحليل وقت التشغيل)
قبل تحويل الكود مع Pyggester:
(venv) root@devs04: ~ /python_demo/app_dir > ls
__pycache__ app.py temperature.py weather.pyمحتوى app.py:
import weather
import temperature
def main ():
city = input ( 'Enter a city name: ' )
weather_condition = weather . get_weather ( city )
avg_temp = temperature . get_average_temperature ()
print ( f'Weather in { city } : { weather_condition } ' )
print ( f'Average temperature: { avg_temp } degrees Celsius' )
main ()محتوى درجة الحرارة.
temperatures = list ([ 20 , 22 , 15 , 18 , 20 , 21 , 22 , 22 , 18 , 17 , 20 ])
def get_average_temperature ():
return sum ( temperatures ) / len ( temperatures )محتوى Weather.py:
weather_conditions = [ 'Sunny' , 'Rainy' , 'Cloudy' , 'Windy' , 'Sunny' , 'Cloudy' ]
def get_weather ( city ):
return weather_conditions . pop ()مهم
تأكد من أنك في بيئة افتراضية مع تثبيت Pyggester قبل الذهاب إلى الخطوة التالية.
(venv) root@devs04: ~ /python_demo > pyggest transform app_dir/
Enter the name of the main file: app.py
╭──────────────────────────────────────────────────────────────────────────╮
│ Directory transformed successfully ! │
╰──────────────────────────────────────────────────────────────────────────╯مهم
عندما يتم تحديد دليل أو مشروع كوسيطة ، فإن Pyggester يطالبنا بتحديد الملف الرئيسي لمشروعنا. يجب أن يكون هذا الملف نقطة إدخال مشروعك ، المشار إليها باسم ملفه.
(venv) root@devs04: ~ /python_demo > ls
app_dir app_dir_transformedمحتوى app_dir_transformed/:
( venv ) root @ devs04 : ~ / python_demo / app_dir_transformed > ls
app . py temperature . py weather . pyمحتوى app.py:
from pyggester . observable_collector import OBSERVABLE_COLLECTOR
from pyggester . observables import ObservableNumpyArray , ObservableList , ObservablePandasDataFrame , ObservableNamedTuple , ObservableSet , ObservableDict , ObservableTuple
import weather
import temperature
def main ():
city = input ( 'Enter a city name: ' )
weather_condition = weather . get_weather ( city )
avg_temp = temperature . get_average_temperature ()
print ( f'Weather in { city } : { weather_condition } ' )
print ( f'Average temperature: { avg_temp } degrees Celsius' )
main ()
for observable in OBSERVABLE_COLLECTOR :
observable . run ()محتوى درجة الحرارة.
from pyggester . observable_collector import OBSERVABLE_COLLECTOR
from pyggester . observables import ObservableNumpyArray , ObservableList , ObservablePandasDataFrame , ObservableNamedTuple , ObservableSet , ObservableDict , ObservableTuple
temperatures = ObservableList ( list ([ 20 , 22 , 15 , 18 , 20 , 21 , 22 , 22 , 18 , 17 ,
20 ]))
OBSERVABLE_COLLECTOR . append ( temperatures )
def get_average_temperature ():
return sum ( temperatures ) / len ( temperatures )محتوى Weather.py:
from pyggester . observable_collector import OBSERVABLE_COLLECTOR
from pyggester . observables import ObservableNumpyArray , ObservableList , ObservablePandasDataFrame , ObservableNamedTuple , ObservableSet , ObservableDict , ObservableTuple
weather_conditions = ObservableList ([ 'Sunny' , 'Rainy' , 'Cloudy' , 'Windy' ,
'Sunny' , 'Cloudy' ])
OBSERVABLE_COLLECTOR . append ( weather_conditions )
def get_weather ( city ):
return weather_conditions . pop ()مهم
لدينا الآن دليل جديد ، تم إنشاؤه تلقائيًا ، يعكس الدليل الأصلي. يتضمن هذا الدليل الجديد جميع محتويات الأصل ، بالإضافة إلى رمز إضافي لتحليل الرمز الخاص بك أثناء وقت التشغيل. بدلاً من تشغيل "app.py" الأصلي ، يجب عليك الآن تشغيل "app.py" الموجود داخل "App_Dir_transformed/". كن مطمئنًا ، يتم الاحتفاظ بكل شيء من "app_dir" في "app_dir_transformed/'.
(venv) root@devs04: ~ /python_demo/app_dir_transformed > python3 app.py
Enter a city name: Pristina
Weather in Pristina: Cloudy
Average temperature: 19.545454545454547 degrees Celsius
╭─────────────────────────────────────────────────────────────────────────────────────╮
│ 3 | Suggestions(/root/python_demo/app_dir_transformed/temperature.py): │
│ [ * ] Consider using an array.array instead of a list, for optimal memory │
│ consumption │
╰─────────────────────────────────────────────────────────────────────────────────────╯ .
├── LICENSE
├── README.md # main readme file. The one you are currently reading.
├── VERSION # version of pyggester
├── contributing.md
├── pyggester # directory containing the full source code of pyggester
│ ├── __init__.py
│ ├── cli.py # defines the typer cli structure(command & options)
│ ├── command_handlers.py # Handles subcommands and every option variation per subcommand.
│ ├── data # data/config files related to pyggester.
│ │ └── help_files # build in help files for the pyggester cli
│ │ ├── __init__.py
│ │ ├── transform_helper.md # detailed built-in documentation for the transform subcommand of pyggest
│ │ └── static_helper.md # detailed built-in documentation for the static subcommand of pyggest
│ ├── helpers.py # helper functions to be used by other modules
│ ├── main.py # The entry point of pyggest execution. Initializes the typer cli app and prints the ascii logo of pyggester
│ ├── message_handler.py # Manages how the collected messages will be printed to the user.
│ ├── module_importer.py # Contains the mechanism to automatically import observables
│ ├── observable_collector.py # Contains the list that will be used to collect all observables.
│ ├── observable_transformations.py # Contains the mechanism that will automatically add code that collects observables and glues together all ast modules
│ ├── observables.py # Contains all the defined observables(enhanced version of python collections)
│ ├── pyggester.py # The 'engine' of pyggester. This module glues everything together
│ ├── text_formatters.py # Contains text formatters, to beautify text in stdout.
│ └── wrappers.py # Contains the mechanism that wrap each observable.
├── pyggester_abstract_execution_flow.png
├── pyggester_logo.png
├── pytest.ini # pytest config file
├── requirements.txt # Every pyggester dependecy resides here
├── setup.py # Creates the pyggester pacakge and defines pyggest as the entry point command to execute pyggester
└── tests
├── __init__.py
├── test_cli.py
├── test_command_handlers.py
├── test_file.py
├── test_file_transformed.py
├── test_helpers.py
├── test_main.py
├── test_message_handler.py
├── test_module_importer.py
├── test_observable_transformations.py
├── test_observables.py
├── test_pyggester.py
└── test_wrappers.pyيوضح مخطط التدفق التالي المكونات الرئيسية لـ Pyggester ويوفر نظرة عامة شاملة على تسلسل التنفيذ.

للمساهمة في هذا المشروع ، يرجى الرجوع إلى دليل المساهمة الشامل للحصول على تعليمات مفصلة وأفضل الممارسات.
رخصة معهد ماساتشوستس للتكنولوجيا
حقوق الطبع والنشر (C) 2023 Valdonvitijaa
يتم منح الإذن بموجب هذا ، مجانًا ، لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج") ، للتعامل في البرنامج دون تقييد ، بما في ذلك على سبيل المثال لا الحصر حقوق استخدام الأشخاص ونسخها ودمجها ودمجها وتوزيعها وتوزيعها على ما يلي:
يجب إدراج إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو" ، دون أي ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق واللياقة لغرض معين وعدم الانفجار. لا يجوز بأي حال من الأحوال أن يكون المؤلفون أو حاملي حقوق الطبع والنشر مسؤولاً عن أي مطالبة أو أضرار أو مسؤولية أخرى ، سواء في إجراء عقد أو ضرر أو غير ذلك ، ناشئة عن أو خارج البرنامج أو الاستخدام أو غيرها من المعاملات في البرنامج.