From 2114b34573016b906cdd329f42652c12d2eab68d Mon Sep 17 00:00:00 2001 From: Santosh Ravinutala <114400781+San12R@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:28:32 +0530 Subject: [PATCH 01/14] Create hi --- Meliora/hi | 1 + 1 file changed, 1 insertion(+) create mode 100644 Meliora/hi diff --git a/Meliora/hi b/Meliora/hi new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Meliora/hi @@ -0,0 +1 @@ + From 8b1d7ad960b3063f5610f682c08b1a7ae7d8f3bf Mon Sep 17 00:00:00 2001 From: Santosh Ravinutala <114400781+San12R@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:29:48 +0530 Subject: [PATCH 02/14] Add files via upload --- Meliora/.gitattributes | 2 + Meliora/README.md | 2 + Meliora/main.py | 104 +++++++++++++++++++++++++++++++++++++++++ Meliora/models.py | 17 +++++++ Meliora/req.txt | 13 ++++++ 5 files changed, 138 insertions(+) create mode 100644 Meliora/.gitattributes create mode 100644 Meliora/README.md create mode 100644 Meliora/main.py create mode 100644 Meliora/models.py create mode 100644 Meliora/req.txt diff --git a/Meliora/.gitattributes b/Meliora/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/Meliora/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/Meliora/README.md b/Meliora/README.md new file mode 100644 index 00000000..9f0372b1 --- /dev/null +++ b/Meliora/README.md @@ -0,0 +1,2 @@ +# Meliora + diff --git a/Meliora/main.py b/Meliora/main.py new file mode 100644 index 00000000..ca3ccd0c --- /dev/null +++ b/Meliora/main.py @@ -0,0 +1,104 @@ +from flask import Flask, render_template, request, redirect, url_for, jsonify +from models import * + +# ============================ Configuration ============================ + +app = Flask(__name__) + +app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///LibraryData.sqlite3" +app.config['SECRET_KEY'] = "MyLibrary" + +db.init_app(app) +app.app_context().push() + +# ======================================================================= + +@app.route('/', methods=['GET','POST']) +def index(): + msg01 = request.args.get('msg01') + msg02 = request.args.get('msg02') + return render_template('index.html', msg01 = msg01, msg02 = msg02) + +@app.route('/vote', methods=['POST']) +def vote(): + vote = request.form.get('vote') + title = request.form.get('selected-route') + + r = Road.query.filter_by(Title=title).first() + + if r: + if vote == 'small-vehicle': + r.S_veh = r.S_veh + 1 + db.session.commit() + if vote == 'car': + r.Car = r.Car + 1 + db.session.commit() + if vote == 'big-vehicle': + r.B_veh = r.B_veh + 1 + db.session.commit() + # return f"{vote} & {title}" + return redirect(url_for('index', msg01=1)) + +@app.route('/add_marker', methods=['GET', 'POST']) +def add_marker(): + if request.method == 'GET': + return render_template('add_marker.html') + if request.method == 'POST': + title = request.form.get('title') + long = float(request.form.get('long')) + lat = float(request.form.get('lat')) + ind = request.form.get('ind') + flag = 0 + if ind == "yes": + flag = 1 + r = Road(Title = title, Long = long, Lat = lat, Acc_ind = flag, S_veh = 0, Car = 0, B_veh = 0) + db.session.add(r) + db.session.commit() + return redirect(url_for('index', msg02=1)) + + +@app.route('/api/road_details/', methods = ['GET']) +def road_details(title): + try: + r = Road.query.filter_by(Title = title).first() + m = max(r.S_veh, r.Car, r.B_veh) + flag = "" + if r.Acc_ind == 1: + flag = "The region is accident-prone" + msg = '' + if m == 0: + msg = "This road is not voted yet." + elif m == r.S_veh and m == r.Car and m == r.B_veh: + msg = "This road is voted to be suitable for all size of vehicles" + elif m == r.S_veh == r.Car: + msg = "This road is voted to be suitable for a car and smaller vehicles" + elif m == r.B_veh == r.Car: + msg = "This road is voted to be suitable for a car as well as big vehicles" + elif m == r.B_veh == r.Car: + msg = "This road is voted to be suitable for a small as well as big vehicles- compartively less suitable for cars" + elif m == r.S_veh: + msg = "This road is voted to be suitable for smaller vehicles" + elif m == r.Car: + msg = "This road is voted to be suitable for a car" + elif m == r.B_veh: + msg = "This road is voted to be suitable for big vehicles" + send = [msg, flag] + return jsonify(send), 201 + + except Exception as e: + msg = 'An error occured' + return jsonify([msg, flag]) + +@app.route('/api/markers', methods = ['GET']) +def markers(): + roads = Road.query.all() + roads_data = [{ + 'Title': road.Title, + 'Long': road.Long, + 'Lat': road.Lat, + } + for road in roads] + return jsonify(roads_data) + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/Meliora/models.py b/Meliora/models.py new file mode 100644 index 00000000..9eaf4299 --- /dev/null +++ b/Meliora/models.py @@ -0,0 +1,17 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() + +class Road(db.Model): + Road_id = db.Column(db.Integer, primary_key=True) + Title = db.Column(db.String(50), nullable = False) + Long = db.Column(db.Float, nullable = False) + Lat = db.Column(db.Float, nullable = False) + S_veh = db.Column(db.Integer, nullable = False) + Car = db.Column(db.Integer, nullable = False) + B_veh = db.Column(db.Integer, nullable = False) + Acc_ind = db.Column(db.Integer, nullable = False) + + + def get_id(self): + return str(self.Road_id) diff --git a/Meliora/req.txt b/Meliora/req.txt new file mode 100644 index 00000000..42fb45db --- /dev/null +++ b/Meliora/req.txt @@ -0,0 +1,13 @@ +blinker==1.6.3 +click==8.1.7 +colorama==0.4.6 +Flask==3.0.0 +greenlet==3.0.0 +importlib-metadata==6.8.0 +itsdangerous==2.1.2 +Jinja2==3.1.2 +MarkupSafe==2.1.3 +SQLAlchemy==2.0.22 +typing_extensions==4.8.0 +Werkzeug==3.0.0 +zipp==3.17.0 From 7f8430774803345fe98837f474706cab8308b6d7 Mon Sep 17 00:00:00 2001 From: Santosh Ravinutala <114400781+San12R@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:38:39 +0530 Subject: [PATCH 03/14] Delete Meliora directory --- Meliora/.gitattributes | 2 - Meliora/README.md | 2 - Meliora/hi | 1 - Meliora/main.py | 104 ----------------------------------------- Meliora/models.py | 17 ------- Meliora/req.txt | 13 ------ 6 files changed, 139 deletions(-) delete mode 100644 Meliora/.gitattributes delete mode 100644 Meliora/README.md delete mode 100644 Meliora/hi delete mode 100644 Meliora/main.py delete mode 100644 Meliora/models.py delete mode 100644 Meliora/req.txt diff --git a/Meliora/.gitattributes b/Meliora/.gitattributes deleted file mode 100644 index dfe07704..00000000 --- a/Meliora/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/Meliora/README.md b/Meliora/README.md deleted file mode 100644 index 9f0372b1..00000000 --- a/Meliora/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Meliora - diff --git a/Meliora/hi b/Meliora/hi deleted file mode 100644 index 8b137891..00000000 --- a/Meliora/hi +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Meliora/main.py b/Meliora/main.py deleted file mode 100644 index ca3ccd0c..00000000 --- a/Meliora/main.py +++ /dev/null @@ -1,104 +0,0 @@ -from flask import Flask, render_template, request, redirect, url_for, jsonify -from models import * - -# ============================ Configuration ============================ - -app = Flask(__name__) - -app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///LibraryData.sqlite3" -app.config['SECRET_KEY'] = "MyLibrary" - -db.init_app(app) -app.app_context().push() - -# ======================================================================= - -@app.route('/', methods=['GET','POST']) -def index(): - msg01 = request.args.get('msg01') - msg02 = request.args.get('msg02') - return render_template('index.html', msg01 = msg01, msg02 = msg02) - -@app.route('/vote', methods=['POST']) -def vote(): - vote = request.form.get('vote') - title = request.form.get('selected-route') - - r = Road.query.filter_by(Title=title).first() - - if r: - if vote == 'small-vehicle': - r.S_veh = r.S_veh + 1 - db.session.commit() - if vote == 'car': - r.Car = r.Car + 1 - db.session.commit() - if vote == 'big-vehicle': - r.B_veh = r.B_veh + 1 - db.session.commit() - # return f"{vote} & {title}" - return redirect(url_for('index', msg01=1)) - -@app.route('/add_marker', methods=['GET', 'POST']) -def add_marker(): - if request.method == 'GET': - return render_template('add_marker.html') - if request.method == 'POST': - title = request.form.get('title') - long = float(request.form.get('long')) - lat = float(request.form.get('lat')) - ind = request.form.get('ind') - flag = 0 - if ind == "yes": - flag = 1 - r = Road(Title = title, Long = long, Lat = lat, Acc_ind = flag, S_veh = 0, Car = 0, B_veh = 0) - db.session.add(r) - db.session.commit() - return redirect(url_for('index', msg02=1)) - - -@app.route('/api/road_details/<title>', methods = ['GET']) -def road_details(title): - try: - r = Road.query.filter_by(Title = title).first() - m = max(r.S_veh, r.Car, r.B_veh) - flag = "" - if r.Acc_ind == 1: - flag = "The region is accident-prone" - msg = '' - if m == 0: - msg = "This road is not voted yet." - elif m == r.S_veh and m == r.Car and m == r.B_veh: - msg = "This road is voted to be suitable for all size of vehicles" - elif m == r.S_veh == r.Car: - msg = "This road is voted to be suitable for a car and smaller vehicles" - elif m == r.B_veh == r.Car: - msg = "This road is voted to be suitable for a car as well as big vehicles" - elif m == r.B_veh == r.Car: - msg = "This road is voted to be suitable for a small as well as big vehicles- compartively less suitable for cars" - elif m == r.S_veh: - msg = "This road is voted to be suitable for smaller vehicles" - elif m == r.Car: - msg = "This road is voted to be suitable for a car" - elif m == r.B_veh: - msg = "This road is voted to be suitable for big vehicles" - send = [msg, flag] - return jsonify(send), 201 - - except Exception as e: - msg = 'An error occured' - return jsonify([msg, flag]) - -@app.route('/api/markers', methods = ['GET']) -def markers(): - roads = Road.query.all() - roads_data = [{ - 'Title': road.Title, - 'Long': road.Long, - 'Lat': road.Lat, - } - for road in roads] - return jsonify(roads_data) - -if __name__ == '__main__': - app.run() \ No newline at end of file diff --git a/Meliora/models.py b/Meliora/models.py deleted file mode 100644 index 9eaf4299..00000000 --- a/Meliora/models.py +++ /dev/null @@ -1,17 +0,0 @@ -from flask_sqlalchemy import SQLAlchemy - -db = SQLAlchemy() - -class Road(db.Model): - Road_id = db.Column(db.Integer, primary_key=True) - Title = db.Column(db.String(50), nullable = False) - Long = db.Column(db.Float, nullable = False) - Lat = db.Column(db.Float, nullable = False) - S_veh = db.Column(db.Integer, nullable = False) - Car = db.Column(db.Integer, nullable = False) - B_veh = db.Column(db.Integer, nullable = False) - Acc_ind = db.Column(db.Integer, nullable = False) - - - def get_id(self): - return str(self.Road_id) diff --git a/Meliora/req.txt b/Meliora/req.txt deleted file mode 100644 index 42fb45db..00000000 --- a/Meliora/req.txt +++ /dev/null @@ -1,13 +0,0 @@ -blinker==1.6.3 -click==8.1.7 -colorama==0.4.6 -Flask==3.0.0 -greenlet==3.0.0 -importlib-metadata==6.8.0 -itsdangerous==2.1.2 -Jinja2==3.1.2 -MarkupSafe==2.1.3 -SQLAlchemy==2.0.22 -typing_extensions==4.8.0 -Werkzeug==3.0.0 -zipp==3.17.0 From 8dc587d7e2ff92bfe742efd9bffe0ca96d169caf Mon Sep 17 00:00:00 2001 From: Santosh Ravinutala <114400781+San12R@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:53:41 +0530 Subject: [PATCH 04/14] Update README.md --- README.md | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 877fb545..65aac2fb 100644 --- a/README.md +++ b/README.md @@ -15,18 +15,49 @@ To get started with the Code-with-Google-Maps-2023 repository, follow these step ### README.md must consist of the following information: -#### Team Name - -#### Problem Statement - -#### Team Leader Email - +#### Team Name - Meliora +#### Problem Statement - Development of an application for enhanced routing and road + safety of the users based on multiple factors +#### Team Leader Email - san.ravinutala@gmail.com ### A Brief of the Prototype: This section must include UML Diagrams and prototype description ### Tech Stack: - List Down all technologies used to Build the prototype + 1. Server side: + a. Application: + Python: Flask framework + flask-SQLAlchemy ORM + b. Backend: + SQLite RDBMS +2. Frontend: + HTML + CSS + Jinja + JavaScript ### Step-by-Step Code Execution Instructions: - This Section must contain a set of instructions required to clone and run the prototype so that it can be tested and deeply analyzed +*Please note that these instructions are specifically for Windows Operating Systems, and they may vary for other operating systems. + +1. Begin by downloading the provided folder, which contains all the necessary files. + +2. Once you have downloaded the folder, open the terminal (cmd) within it. + +3. Activate the virtual environment named "gmapenv" using the following command: "gmapenv\scripts\activate". + +4. After successfully activating the virtual environment, you can check the code if you have IDE such as the Visual Studio Code (VSCode) installed. +5. Execute the following command: code .. + +6. With the virtual environment set up, you can now run the application on your local server. In the command prompt, type and execute: "python main.py". + +7. You can see the message: "Running on http://127.0.0.1:5000." + +8. Copy and paste the localhost address from previous step, which is "http://127.0.0.1:5000," into your web browser's address bar to view the application. + +9. Press "ctrl+c" to stop the application from the cmd. +10. Type "deactivate" in the command prompt to deactivate the virtual enviroment. +11. type "exit" to exit the cmd. + ### Future Scope: Write about the scalability and futuristic aspects of the prototype developed From 8ac0374e8c3ae91025b9675c19e8f4ef58c853bd Mon Sep 17 00:00:00 2001 From: Santosh Ravinutala <114400781+San12R@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:54:16 +0530 Subject: [PATCH 05/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65aac2fb..1ab13500 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ To get started with the Code-with-Google-Maps-2023 repository, follow these step #### Team Name - Meliora #### Problem Statement - Development of an application for enhanced routing and road - safety of the users based on multiple factors +safety of the users based on multiple factors #### Team Leader Email - san.ravinutala@gmail.com ### A Brief of the Prototype: From 4362c15e7749cc2d3ce14875b534b2c20d53ba31 Mon Sep 17 00:00:00 2001 From: Santosh Ravinutala <114400781+San12R@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:55:48 +0530 Subject: [PATCH 06/14] Create .gitkeep --- Meliora/.gitkeep | 1 + 1 file changed, 1 insertion(+) create mode 100644 Meliora/.gitkeep diff --git a/Meliora/.gitkeep b/Meliora/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Meliora/.gitkeep @@ -0,0 +1 @@ + From a333707c918547b94243e7c1148d266b7a808cd9 Mon Sep 17 00:00:00 2001 From: Santosh Ravinutala <114400781+San12R@users.noreply.github.com> Date: Thu, 26 Oct 2023 23:21:21 +0530 Subject: [PATCH 07/14] Create .keep --- Meliora/.keep | 1 + 1 file changed, 1 insertion(+) create mode 100644 Meliora/.keep diff --git a/Meliora/.keep b/Meliora/.keep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Meliora/.keep @@ -0,0 +1 @@ + From 9ffe1633aeb4a61cb45976083b6d6d52730de785 Mon Sep 17 00:00:00 2001 From: Santosh Ravinutala <114400781+San12R@users.noreply.github.com> Date: Thu, 26 Oct 2023 23:27:12 +0530 Subject: [PATCH 08/14] Update README.md --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 877fb545..12f69874 100644 --- a/README.md +++ b/README.md @@ -15,18 +15,53 @@ To get started with the Code-with-Google-Maps-2023 repository, follow these step ### README.md must consist of the following information: -#### Team Name - -#### Problem Statement - -#### Team Leader Email - +#### Team Name - Meliora +#### Problem Statement - Development of an application for enhanced routing and road +safety of the users based on multiple factors +#### Team Leader Email - san.ravinutala@gmail.com ### A Brief of the Prototype: - This section must include UML Diagrams and prototype description +A web application for enhanced routing and road safety of the users based on +multiple factors like road information, volume of travellers over a route and its safety +rating, users' vehicle information, emergency alerts and other traffic signs over the route +using Google Maps APIs and retrieve details and markers through API endpoints. +The code allows users to vote for the suitability of a road for different types of vehicles (small vehicles, cars, and big vehicles), view road details, and add markers for new roads. ### Tech Stack: - List Down all technologies used to Build the prototype + 1. Server side: + a. Application: + Python: Flask framework + flask-SQLAlchemy ORM + b. Backend: + SQLite RDBMS +2. Frontend: + HTML + CSS + Jinja + JavaScript ### Step-by-Step Code Execution Instructions: - This Section must contain a set of instructions required to clone and run the prototype so that it can be tested and deeply analyzed +*Please note that these instructions are specifically for Windows Operating Systems, and they may vary for other operating systems. + +1. Begin by downloading the provided folder, which contains all the necessary files. + +2. Once you have downloaded the folder, open the terminal (cmd) within it. + +3. Activate the virtual environment named "gmapenv" using the following command: "gmapenv\scripts\activate". + +4. After successfully activating the virtual environment, you can check the code if you have IDE such as the Visual Studio Code (VSCode) installed. +5. Execute the following command: code .. + +6. With the virtual environment set up, you can now run the application on your local server. In the command prompt, type and execute: "python main.py". + +7. You can see the message: "Running on http://127.0.0.1:5000." + +8. Copy and paste the localhost address from previous step, which is "http://127.0.0.1:5000," into your web browser's address bar to view the application. + +9. Press "ctrl+c" to stop the application from the cmd. +10. Type "deactivate" in the command prompt to deactivate the virtual enviroment. +11. type "exit" to exit the cmd. + ### Future Scope: Write about the scalability and futuristic aspects of the prototype developed From d4013b5acda2dac82515781dc781097d47da2438 Mon Sep 17 00:00:00 2001 From: San12R <114400781+San12R@users.noreply.github.com> Date: Thu, 26 Oct 2023 23:40:09 +0530 Subject: [PATCH 09/14] main --- Meliora/.gitattributes | 2 + Meliora/README.md | 2 + Meliora/Templates/add_marker.html | 257 + Meliora/Templates/index.html | 273 + Meliora/__pycache__/main.cpython-39.pyc | Bin 0 -> 2337 bytes Meliora/__pycache__/models.cpython-39.pyc | Bin 0 -> 765 bytes .../site/python3.9/greenlet/greenlet.h | 164 + .../Jinja2-3.1.2.dist-info/INSTALLER | 1 + .../Jinja2-3.1.2.dist-info/LICENSE.rst | 28 + .../Jinja2-3.1.2.dist-info/METADATA | 113 + .../Jinja2-3.1.2.dist-info/RECORD | 58 + .../Jinja2-3.1.2.dist-info/WHEEL | 5 + .../Jinja2-3.1.2.dist-info/entry_points.txt | 2 + .../Jinja2-3.1.2.dist-info/top_level.txt | 1 + .../MarkupSafe-2.1.3.dist-info/INSTALLER | 1 + .../MarkupSafe-2.1.3.dist-info/LICENSE.rst | 28 + .../MarkupSafe-2.1.3.dist-info/METADATA | 93 + .../MarkupSafe-2.1.3.dist-info/RECORD | 14 + .../MarkupSafe-2.1.3.dist-info/WHEEL | 5 + .../MarkupSafe-2.1.3.dist-info/top_level.txt | 1 + .../SQLAlchemy-2.0.22.dist-info/INSTALLER | 1 + .../SQLAlchemy-2.0.22.dist-info/LICENSE | 19 + .../SQLAlchemy-2.0.22.dist-info/METADATA | 238 + .../SQLAlchemy-2.0.22.dist-info/RECORD | 524 + .../SQLAlchemy-2.0.22.dist-info/REQUESTED | 0 .../SQLAlchemy-2.0.22.dist-info/WHEEL | 5 + .../SQLAlchemy-2.0.22.dist-info/top_level.txt | 1 + .../typing_extensions.cpython-39.pyc | Bin 0 -> 85383 bytes .../site-packages/_distutils_hack/__init__.py | 128 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 5107 bytes .../__pycache__/override.cpython-39.pyc | Bin 0 -> 238 bytes .../site-packages/_distutils_hack/override.py | 1 + .../blinker-1.6.3.dist-info/INSTALLER | 1 + .../blinker-1.6.3.dist-info/LICENSE.rst | 20 + .../blinker-1.6.3.dist-info/METADATA | 62 + .../blinker-1.6.3.dist-info/RECORD | 14 + .../blinker-1.6.3.dist-info/WHEEL | 4 + .../Lib/site-packages/blinker/__init__.py | 19 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 502 bytes .../__pycache__/_saferef.cpython-39.pyc | Bin 0 -> 7180 bytes .../__pycache__/_utilities.cpython-39.pyc | Bin 0 -> 4194 bytes .../blinker/__pycache__/base.cpython-39.pyc | Bin 0 -> 17201 bytes .../Lib/site-packages/blinker/_saferef.py | 230 + .../Lib/site-packages/blinker/_utilities.py | 142 + .../gmapenv/Lib/site-packages/blinker/base.py | 548 ++ .../Lib/site-packages/blinker/py.typed | 0 .../click-8.1.7.dist-info/INSTALLER | 1 + .../click-8.1.7.dist-info/LICENSE.rst | 28 + .../click-8.1.7.dist-info/METADATA | 103 + .../click-8.1.7.dist-info/RECORD | 39 + .../site-packages/click-8.1.7.dist-info/WHEEL | 5 + .../click-8.1.7.dist-info/top_level.txt | 1 + .../Lib/site-packages/click/__init__.py | 73 + .../click/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2621 bytes .../click/__pycache__/_compat.cpython-39.pyc | Bin 0 -> 15996 bytes .../__pycache__/_termui_impl.cpython-39.pyc | Bin 0 -> 16241 bytes .../__pycache__/_textwrap.cpython-39.pyc | Bin 0 -> 1537 bytes .../__pycache__/_winconsole.cpython-39.pyc | Bin 0 -> 7788 bytes .../click/__pycache__/core.cpython-39.pyc | Bin 0 -> 90622 bytes .../__pycache__/decorators.cpython-39.pyc | Bin 0 -> 17043 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 10200 bytes .../__pycache__/formatting.cpython-39.pyc | Bin 0 -> 9416 bytes .../click/__pycache__/globals.cpython-39.pyc | Bin 0 -> 2428 bytes .../click/__pycache__/parser.cpython-39.pyc | Bin 0 -> 13573 bytes .../shell_completion.cpython-39.pyc | Bin 0 -> 17002 bytes .../click/__pycache__/termui.cpython-39.pyc | Bin 0 -> 25873 bytes .../click/__pycache__/testing.cpython-39.pyc | Bin 0 -> 15152 bytes .../click/__pycache__/types.cpython-39.pyc | Bin 0 -> 33410 bytes .../click/__pycache__/utils.cpython-39.pyc | Bin 0 -> 18759 bytes .../Lib/site-packages/click/_compat.py | 623 ++ .../Lib/site-packages/click/_termui_impl.py | 739 ++ .../Lib/site-packages/click/_textwrap.py | 49 + .../Lib/site-packages/click/_winconsole.py | 279 + .../gmapenv/Lib/site-packages/click/core.py | 3042 ++++++ .../Lib/site-packages/click/decorators.py | 561 ++ .../Lib/site-packages/click/exceptions.py | 288 + .../Lib/site-packages/click/formatting.py | 301 + .../Lib/site-packages/click/globals.py | 68 + .../gmapenv/Lib/site-packages/click/parser.py | 529 + .../gmapenv/Lib/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 596 ++ .../gmapenv/Lib/site-packages/click/termui.py | 784 ++ .../Lib/site-packages/click/testing.py | 479 + .../gmapenv/Lib/site-packages/click/types.py | 1089 +++ .../gmapenv/Lib/site-packages/click/utils.py | 624 ++ .../colorama-0.4.6.dist-info/INSTALLER | 1 + .../colorama-0.4.6.dist-info/METADATA | 441 + .../colorama-0.4.6.dist-info/RECORD | 31 + .../colorama-0.4.6.dist-info/WHEEL | 5 + .../licenses/LICENSE.txt | 27 + .../Lib/site-packages/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 466 bytes .../colorama/__pycache__/ansi.cpython-39.pyc | Bin 0 -> 3216 bytes .../__pycache__/ansitowin32.cpython-39.pyc | Bin 0 -> 8294 bytes .../__pycache__/initialise.cpython-39.pyc | Bin 0 -> 2267 bytes .../colorama/__pycache__/win32.cpython-39.pyc | Bin 0 -> 4449 bytes .../__pycache__/winterm.cpython-39.pyc | Bin 0 -> 5252 bytes .../Lib/site-packages/colorama/ansi.py | 102 + .../Lib/site-packages/colorama/ansitowin32.py | 277 + .../Lib/site-packages/colorama/initialise.py | 121 + .../site-packages/colorama/tests/__init__.py | 1 + .../tests/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 186 bytes .../__pycache__/ansi_test.cpython-39.pyc | Bin 0 -> 2546 bytes .../ansitowin32_test.cpython-39.pyc | Bin 0 -> 11549 bytes .../initialise_test.cpython-39.pyc | Bin 0 -> 7078 bytes .../__pycache__/isatty_test.cpython-39.pyc | Bin 0 -> 2799 bytes .../tests/__pycache__/utils.cpython-39.pyc | Bin 0 -> 1654 bytes .../__pycache__/winterm_test.cpython-39.pyc | Bin 0 -> 3321 bytes .../site-packages/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../colorama/tests/initialise_test.py | 189 + .../colorama/tests/isatty_test.py | 57 + .../Lib/site-packages/colorama/tests/utils.py | 49 + .../colorama/tests/winterm_test.py | 131 + .../Lib/site-packages/colorama/win32.py | 180 + .../Lib/site-packages/colorama/winterm.py | 195 + .../site-packages/distutils-precedence.pth | 1 + .../flask-3.0.0.dist-info/INSTALLER | 1 + .../flask-3.0.0.dist-info/LICENSE.rst | 28 + .../flask-3.0.0.dist-info/METADATA | 116 + .../flask-3.0.0.dist-info/RECORD | 58 + .../flask-3.0.0.dist-info/REQUESTED | 0 .../site-packages/flask-3.0.0.dist-info/WHEEL | 4 + .../flask-3.0.0.dist-info/entry_points.txt | 3 + .../Lib/site-packages/flask/__init__.py | 60 + .../Lib/site-packages/flask/__main__.py | 3 + .../flask/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2282 bytes .../flask/__pycache__/__main__.cpython-39.pyc | Bin 0 -> 217 bytes .../flask/__pycache__/app.cpython-39.pyc | Bin 0 -> 49146 bytes .../__pycache__/blueprints.cpython-39.pyc | Bin 0 -> 3379 bytes .../flask/__pycache__/cli.cpython-39.pyc | Bin 0 -> 26778 bytes .../flask/__pycache__/config.cpython-39.pyc | Bin 0 -> 12669 bytes .../flask/__pycache__/ctx.cpython-39.pyc | Bin 0 -> 14519 bytes .../__pycache__/debughelpers.cpython-39.pyc | Bin 0 -> 5996 bytes .../flask/__pycache__/globals.cpython-39.pyc | Bin 0 -> 1585 bytes .../flask/__pycache__/helpers.cpython-39.pyc | Bin 0 -> 21229 bytes .../flask/__pycache__/logging.cpython-39.pyc | Bin 0 -> 2508 bytes .../flask/__pycache__/sessions.cpython-39.pyc | Bin 0 -> 13102 bytes .../flask/__pycache__/signals.cpython-39.pyc | Bin 0 -> 815 bytes .../__pycache__/templating.cpython-39.pyc | Bin 0 -> 6997 bytes .../flask/__pycache__/testing.cpython-39.pyc | Bin 0 -> 9451 bytes .../flask/__pycache__/typing.cpython-39.pyc | Bin 0 -> 1817 bytes .../flask/__pycache__/views.cpython-39.pyc | Bin 0 -> 5381 bytes .../flask/__pycache__/wrappers.cpython-39.pyc | Bin 0 -> 5154 bytes .../gmapenv/Lib/site-packages/flask/app.py | 1478 +++ .../Lib/site-packages/flask/blueprints.py | 91 + .../gmapenv/Lib/site-packages/flask/cli.py | 1068 +++ .../gmapenv/Lib/site-packages/flask/config.py | 347 + .../gmapenv/Lib/site-packages/flask/ctx.py | 440 + .../Lib/site-packages/flask/debughelpers.py | 160 + .../Lib/site-packages/flask/globals.py | 51 + .../Lib/site-packages/flask/helpers.py | 623 ++ .../Lib/site-packages/flask/json/__init__.py | 170 + .../json/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 5971 bytes .../json/__pycache__/provider.cpython-39.pyc | Bin 0 -> 7559 bytes .../flask/json/__pycache__/tag.cpython-39.pyc | Bin 0 -> 11421 bytes .../Lib/site-packages/flask/json/provider.py | 216 + .../Lib/site-packages/flask/json/tag.py | 314 + .../Lib/site-packages/flask/logging.py | 76 + .../gmapenv/Lib/site-packages/flask/py.typed | 0 .../Lib/site-packages/flask/sansio/README.md | 6 + .../sansio/__pycache__/app.cpython-39.pyc | Bin 0 -> 28167 bytes .../__pycache__/blueprints.cpython-39.pyc | Bin 0 -> 22668 bytes .../__pycache__/scaffold.cpython-39.pyc | Bin 0 -> 23746 bytes .../Lib/site-packages/flask/sansio/app.py | 964 ++ .../site-packages/flask/sansio/blueprints.py | 626 ++ .../site-packages/flask/sansio/scaffold.py | 802 ++ .../Lib/site-packages/flask/sessions.py | 367 + .../Lib/site-packages/flask/signals.py | 17 + .../Lib/site-packages/flask/templating.py | 221 + .../Lib/site-packages/flask/testing.py | 295 + .../gmapenv/Lib/site-packages/flask/typing.py | 88 + .../gmapenv/Lib/site-packages/flask/views.py | 190 + .../Lib/site-packages/flask/wrappers.py | 173 + .../INSTALLER | 1 + .../LICENSE.rst | 28 + .../flask_sqlalchemy-3.1.1.dist-info/METADATA | 109 + .../flask_sqlalchemy-3.1.1.dist-info/RECORD | 27 + .../REQUESTED | 0 .../flask_sqlalchemy-3.1.1.dist-info/WHEEL | 4 + .../flask_sqlalchemy/__init__.py | 26 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 880 bytes .../__pycache__/cli.cpython-39.pyc | Bin 0 -> 895 bytes .../__pycache__/extension.cpython-39.pyc | Bin 0 -> 31457 bytes .../__pycache__/model.cpython-39.pyc | Bin 0 -> 9360 bytes .../__pycache__/pagination.cpython-39.pyc | Bin 0 -> 10443 bytes .../__pycache__/query.cpython-39.pyc | Bin 0 -> 4051 bytes .../__pycache__/record_queries.cpython-39.pyc | Bin 0 -> 3830 bytes .../__pycache__/session.cpython-39.pyc | Bin 0 -> 3398 bytes .../__pycache__/table.cpython-39.pyc | Bin 0 -> 1293 bytes .../track_modifications.cpython-39.pyc | Bin 0 -> 2232 bytes .../Lib/site-packages/flask_sqlalchemy/cli.py | 16 + .../flask_sqlalchemy/extension.py | 1008 ++ .../site-packages/flask_sqlalchemy/model.py | 330 + .../flask_sqlalchemy/pagination.py | 364 + .../site-packages/flask_sqlalchemy/py.typed | 0 .../site-packages/flask_sqlalchemy/query.py | 105 + .../flask_sqlalchemy/record_queries.py | 117 + .../site-packages/flask_sqlalchemy/session.py | 111 + .../site-packages/flask_sqlalchemy/table.py | 39 + .../flask_sqlalchemy/track_modifications.py | 88 + .../greenlet-3.0.0.dist-info/AUTHORS | 51 + .../greenlet-3.0.0.dist-info/INSTALLER | 1 + .../greenlet-3.0.0.dist-info/LICENSE | 30 + .../greenlet-3.0.0.dist-info/LICENSE.PSF | 47 + .../greenlet-3.0.0.dist-info/METADATA | 102 + .../greenlet-3.0.0.dist-info/RECORD | 116 + .../greenlet-3.0.0.dist-info/WHEEL | 5 + .../greenlet-3.0.0.dist-info/top_level.txt | 1 + .../greenlet/TBrokenGreenlet.cpp | 45 + .../greenlet/TExceptionState.cpp | 62 + .../Lib/site-packages/greenlet/TGreenlet.cpp | 610 ++ .../greenlet/TGreenletGlobals.cpp | 94 + .../site-packages/greenlet/TMainGreenlet.cpp | 155 + .../site-packages/greenlet/TPythonState.cpp | 368 + .../site-packages/greenlet/TStackState.cpp | 232 + .../greenlet/TThreadStateDestroy.cpp | 190 + .../site-packages/greenlet/TUserGreenlet.cpp | 663 ++ .../Lib/site-packages/greenlet/__init__.py | 71 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 987 bytes .../greenlet/_greenlet.cp39-win_amd64.pyd | Bin 0 -> 215552 bytes .../Lib/site-packages/greenlet/greenlet.cpp | 1493 +++ .../Lib/site-packages/greenlet/greenlet.h | 164 + .../greenlet/greenlet_allocator.hpp | 63 + .../greenlet/greenlet_compiler_compat.hpp | 95 + .../greenlet/greenlet_cpython_add_pending.hpp | 172 + .../greenlet/greenlet_cpython_compat.hpp | 127 + .../greenlet/greenlet_exceptions.hpp | 150 + .../greenlet/greenlet_greenlet.hpp | 774 ++ .../greenlet/greenlet_internal.hpp | 106 + .../site-packages/greenlet/greenlet_refs.hpp | 1100 +++ .../greenlet/greenlet_slp_switch.hpp | 99 + .../greenlet/greenlet_thread_state.hpp | 543 ++ .../greenlet_thread_state_dict_cleanup.hpp | 118 + .../greenlet/greenlet_thread_support.hpp | 31 + .../greenlet/platform/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 189 bytes .../platform/setup_switch_x64_masm.cmd | 2 + .../greenlet/platform/switch_aarch64_gcc.h | 124 + .../greenlet/platform/switch_alpha_unix.h | 30 + .../greenlet/platform/switch_amd64_unix.h | 87 + .../greenlet/platform/switch_arm32_gcc.h | 79 + .../greenlet/platform/switch_arm32_ios.h | 67 + .../greenlet/platform/switch_arm64_masm.asm | 53 + .../greenlet/platform/switch_arm64_masm.obj | Bin 0 -> 746 bytes .../greenlet/platform/switch_arm64_msvc.h | 17 + .../greenlet/platform/switch_csky_gcc.h | 48 + .../platform/switch_loongarch64_linux.h | 31 + .../greenlet/platform/switch_m68k_gcc.h | 38 + .../greenlet/platform/switch_mips_unix.h | 64 + .../greenlet/platform/switch_ppc64_aix.h | 103 + .../greenlet/platform/switch_ppc64_linux.h | 105 + .../greenlet/platform/switch_ppc_aix.h | 87 + .../greenlet/platform/switch_ppc_linux.h | 84 + .../greenlet/platform/switch_ppc_macosx.h | 82 + .../greenlet/platform/switch_ppc_unix.h | 82 + .../greenlet/platform/switch_riscv_unix.h | 32 + .../greenlet/platform/switch_s390_unix.h | 87 + .../greenlet/platform/switch_sparc_sun_gcc.h | 92 + .../greenlet/platform/switch_x32_unix.h | 63 + .../greenlet/platform/switch_x64_masm.asm | 111 + .../greenlet/platform/switch_x64_masm.obj | Bin 0 -> 1078 bytes .../greenlet/platform/switch_x64_msvc.h | 60 + .../greenlet/platform/switch_x86_msvc.h | 326 + .../greenlet/platform/switch_x86_unix.h | 105 + .../greenlet/slp_platformselect.h | 71 + .../site-packages/greenlet/tests/__init__.py | 218 + .../tests/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 4894 bytes .../fail_clearing_run_switches.cpython-39.pyc | Bin 0 -> 1534 bytes .../fail_cpp_exception.cpython-39.pyc | Bin 0 -> 1172 bytes ...initialstub_already_started.cpython-39.pyc | Bin 0 -> 2033 bytes .../fail_slp_switch.cpython-39.pyc | Bin 0 -> 749 bytes ...fail_switch_three_greenlets.cpython-39.pyc | Bin 0 -> 1139 bytes ...ail_switch_three_greenlets2.cpython-39.pyc | Bin 0 -> 1514 bytes .../fail_switch_two_greenlets.cpython-39.pyc | Bin 0 -> 1158 bytes .../__pycache__/leakcheck.cpython-39.pyc | Bin 0 -> 7382 bytes .../test_contextvars.cpython-39.pyc | Bin 0 -> 7976 bytes .../tests/__pycache__/test_cpp.cpython-39.pyc | Bin 0 -> 2812 bytes .../test_extension_interface.cpython-39.pyc | Bin 0 -> 4680 bytes .../tests/__pycache__/test_gc.cpython-39.pyc | Bin 0 -> 3114 bytes .../__pycache__/test_generator.cpython-39.pyc | Bin 0 -> 2251 bytes .../test_generator_nested.cpython-39.pyc | Bin 0 -> 5425 bytes .../__pycache__/test_greenlet.cpython-39.pyc | Bin 0 -> 44754 bytes .../test_greenlet_trash.cpython-39.pyc | Bin 0 -> 4636 bytes .../__pycache__/test_leaks.cpython-39.pyc | Bin 0 -> 11545 bytes .../test_stack_saved.cpython-39.pyc | Bin 0 -> 869 bytes .../__pycache__/test_throw.cpython-39.pyc | Bin 0 -> 4041 bytes .../__pycache__/test_tracing.cpython-39.pyc | Bin 0 -> 9522 bytes .../__pycache__/test_version.cpython-39.pyc | Bin 0 -> 1560 bytes .../__pycache__/test_weakref.cpython-39.pyc | Bin 0 -> 1881 bytes .../greenlet/tests/_test_extension.c | 231 + .../tests/_test_extension.cp39-win_amd64.pyd | Bin 0 -> 13312 bytes .../_test_extension_cpp.cp39-win_amd64.pyd | Bin 0 -> 14848 bytes .../greenlet/tests/_test_extension_cpp.cpp | 211 + .../tests/fail_clearing_run_switches.py | 47 + .../greenlet/tests/fail_cpp_exception.py | 33 + .../tests/fail_initialstub_already_started.py | 78 + .../greenlet/tests/fail_slp_switch.py | 29 + .../tests/fail_switch_three_greenlets.py | 44 + .../tests/fail_switch_three_greenlets2.py | 55 + .../tests/fail_switch_two_greenlets.py | 41 + .../site-packages/greenlet/tests/leakcheck.py | 318 + .../greenlet/tests/test_contextvars.py | 309 + .../site-packages/greenlet/tests/test_cpp.py | 69 + .../tests/test_extension_interface.py | 115 + .../site-packages/greenlet/tests/test_gc.py | 86 + .../greenlet/tests/test_generator.py | 59 + .../greenlet/tests/test_generator_nested.py | 168 + .../greenlet/tests/test_greenlet.py | 1252 +++ .../greenlet/tests/test_greenlet_trash.py | 178 + .../greenlet/tests/test_leaks.py | 447 + .../greenlet/tests/test_stack_saved.py | 19 + .../greenlet/tests/test_throw.py | 129 + .../greenlet/tests/test_tracing.py | 291 + .../greenlet/tests/test_version.py | 41 + .../greenlet/tests/test_weakref.py | 35 + .../INSTALLER | 1 + .../LICENSE | 202 + .../METADATA | 138 + .../importlib_metadata-6.8.0.dist-info/RECORD | 25 + .../importlib_metadata-6.8.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../importlib_metadata/__init__.py | 1015 ++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 37055 bytes .../__pycache__/_adapters.cpython-39.pyc | Bin 0 -> 2962 bytes .../__pycache__/_collections.cpython-39.pyc | Bin 0 -> 1560 bytes .../__pycache__/_compat.cpython-39.pyc | Bin 0 -> 2061 bytes .../__pycache__/_functools.cpython-39.pyc | Bin 0 -> 3150 bytes .../__pycache__/_itertools.cpython-39.pyc | Bin 0 -> 2027 bytes .../__pycache__/_meta.cpython-39.pyc | Bin 0 -> 2878 bytes .../__pycache__/_py39compat.cpython-39.pyc | Bin 0 -> 1196 bytes .../__pycache__/_text.cpython-39.pyc | Bin 0 -> 3093 bytes .../importlib_metadata/_adapters.py | 90 + .../importlib_metadata/_collections.py | 30 + .../importlib_metadata/_compat.py | 67 + .../importlib_metadata/_functools.py | 104 + .../importlib_metadata/_itertools.py | 73 + .../site-packages/importlib_metadata/_meta.py | 63 + .../importlib_metadata/_py39compat.py | 35 + .../site-packages/importlib_metadata/_text.py | 99 + .../site-packages/importlib_metadata/py.typed | 0 .../itsdangerous-2.1.2.dist-info/INSTALLER | 1 + .../itsdangerous-2.1.2.dist-info/LICENSE.rst | 28 + .../itsdangerous-2.1.2.dist-info/METADATA | 97 + .../itsdangerous-2.1.2.dist-info/RECORD | 23 + .../itsdangerous-2.1.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 19 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 870 bytes .../__pycache__/_json.cpython-39.pyc | Bin 0 -> 926 bytes .../__pycache__/encoding.cpython-39.pyc | Bin 0 -> 1883 bytes .../__pycache__/exc.cpython-39.pyc | Bin 0 -> 3439 bytes .../__pycache__/serializer.cpython-39.pyc | Bin 0 -> 9747 bytes .../__pycache__/signer.cpython-39.pyc | Bin 0 -> 8438 bytes .../__pycache__/timed.cpython-39.pyc | Bin 0 -> 6484 bytes .../__pycache__/url_safe.cpython-39.pyc | Bin 0 -> 2719 bytes .../Lib/site-packages/itsdangerous/_json.py | 16 + .../site-packages/itsdangerous/encoding.py | 54 + .../Lib/site-packages/itsdangerous/exc.py | 107 + .../Lib/site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 295 + .../Lib/site-packages/itsdangerous/signer.py | 257 + .../Lib/site-packages/itsdangerous/timed.py | 234 + .../site-packages/itsdangerous/url_safe.py | 80 + .../Lib/site-packages/jinja2/__init__.py | 37 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1606 bytes .../__pycache__/_identifier.cpython-39.pyc | Bin 0 -> 2081 bytes .../__pycache__/async_utils.cpython-39.pyc | Bin 0 -> 2665 bytes .../jinja2/__pycache__/bccache.cpython-39.pyc | Bin 0 -> 13902 bytes .../__pycache__/compiler.cpython-39.pyc | Bin 0 -> 54182 bytes .../__pycache__/constants.cpython-39.pyc | Bin 0 -> 1542 bytes .../jinja2/__pycache__/debug.cpython-39.pyc | Bin 0 -> 3980 bytes .../__pycache__/defaults.cpython-39.pyc | Bin 0 -> 1342 bytes .../__pycache__/environment.cpython-39.pyc | Bin 0 -> 53110 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 5583 bytes .../jinja2/__pycache__/ext.cpython-39.pyc | Bin 0 -> 25538 bytes .../jinja2/__pycache__/filters.cpython-39.pyc | Bin 0 -> 50405 bytes .../__pycache__/idtracking.cpython-39.pyc | Bin 0 -> 11092 bytes .../jinja2/__pycache__/lexer.cpython-39.pyc | Bin 0 -> 20268 bytes .../jinja2/__pycache__/loaders.cpython-39.pyc | Bin 0 -> 20437 bytes .../jinja2/__pycache__/meta.cpython-39.pyc | Bin 0 -> 3800 bytes .../__pycache__/nativetypes.cpython-39.pyc | Bin 0 -> 4964 bytes .../jinja2/__pycache__/nodes.cpython-39.pyc | Bin 0 -> 40877 bytes .../__pycache__/optimizer.cpython-39.pyc | Bin 0 -> 1931 bytes .../jinja2/__pycache__/parser.cpython-39.pyc | Bin 0 -> 27579 bytes .../jinja2/__pycache__/runtime.cpython-39.pyc | Bin 0 -> 32169 bytes .../jinja2/__pycache__/sandbox.cpython-39.pyc | Bin 0 -> 11922 bytes .../jinja2/__pycache__/tests.cpython-39.pyc | Bin 0 -> 6574 bytes .../jinja2/__pycache__/utils.cpython-39.pyc | Bin 0 -> 24542 bytes .../jinja2/__pycache__/visitor.cpython-39.pyc | Bin 0 -> 3925 bytes .../Lib/site-packages/jinja2/_identifier.py | 6 + .../Lib/site-packages/jinja2/async_utils.py | 84 + .../Lib/site-packages/jinja2/bccache.py | 406 + .../Lib/site-packages/jinja2/compiler.py | 1957 ++++ .../Lib/site-packages/jinja2/constants.py | 20 + .../gmapenv/Lib/site-packages/jinja2/debug.py | 191 + .../Lib/site-packages/jinja2/defaults.py | 48 + .../Lib/site-packages/jinja2/environment.py | 1667 ++++ .../Lib/site-packages/jinja2/exceptions.py | 166 + .../gmapenv/Lib/site-packages/jinja2/ext.py | 859 ++ .../Lib/site-packages/jinja2/filters.py | 1840 ++++ .../Lib/site-packages/jinja2/idtracking.py | 318 + .../gmapenv/Lib/site-packages/jinja2/lexer.py | 866 ++ .../Lib/site-packages/jinja2/loaders.py | 661 ++ .../gmapenv/Lib/site-packages/jinja2/meta.py | 111 + .../Lib/site-packages/jinja2/nativetypes.py | 130 + .../gmapenv/Lib/site-packages/jinja2/nodes.py | 1204 +++ .../Lib/site-packages/jinja2/optimizer.py | 47 + .../Lib/site-packages/jinja2/parser.py | 1032 ++ .../gmapenv/Lib/site-packages/jinja2/py.typed | 0 .../Lib/site-packages/jinja2/runtime.py | 1053 ++ .../Lib/site-packages/jinja2/sandbox.py | 428 + .../gmapenv/Lib/site-packages/jinja2/tests.py | 255 + .../gmapenv/Lib/site-packages/jinja2/utils.py | 755 ++ .../Lib/site-packages/jinja2/visitor.py | 92 + .../Lib/site-packages/markupsafe/__init__.py | 304 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 11347 bytes .../__pycache__/_native.cpython-39.pyc | Bin 0 -> 2012 bytes .../Lib/site-packages/markupsafe/_native.py | 63 + .../Lib/site-packages/markupsafe/_speedups.c | 320 + .../markupsafe/_speedups.cp39-win_amd64.pyd | Bin 0 -> 15872 bytes .../site-packages/markupsafe/_speedups.pyi | 9 + .../Lib/site-packages/markupsafe/py.typed | 0 .../pip-22.0.4.dist-info/INSTALLER | 1 + .../pip-22.0.4.dist-info/LICENSE.txt | 20 + .../pip-22.0.4.dist-info/METADATA | 92 + .../site-packages/pip-22.0.4.dist-info/RECORD | 1053 ++ .../pip-22.0.4.dist-info/REQUESTED | 0 .../site-packages/pip-22.0.4.dist-info/WHEEL | 5 + .../pip-22.0.4.dist-info/entry_points.txt | 5 + .../pip-22.0.4.dist-info/top_level.txt | 1 + .../gmapenv/Lib/site-packages/pip/__init__.py | 13 + .../gmapenv/Lib/site-packages/pip/__main__.py | 31 + .../pip/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 631 bytes .../pip/__pycache__/__main__.cpython-39.pyc | Bin 0 -> 587 bytes .../site-packages/pip/_internal/__init__.py | 19 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 752 bytes .../__pycache__/build_env.cpython-39.pyc | Bin 0 -> 9505 bytes .../__pycache__/cache.cpython-39.pyc | Bin 0 -> 8309 bytes .../__pycache__/configuration.cpython-39.pyc | Bin 0 -> 11157 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 23354 bytes .../_internal/__pycache__/main.cpython-39.pyc | Bin 0 -> 617 bytes .../__pycache__/pyproject.cpython-39.pyc | Bin 0 -> 3542 bytes .../self_outdated_check.cpython-39.pyc | Bin 0 -> 4582 bytes .../__pycache__/wheel_builder.cpython-39.pyc | Bin 0 -> 9161 bytes .../site-packages/pip/_internal/build_env.py | 296 + .../Lib/site-packages/pip/_internal/cache.py | 264 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 272 bytes .../__pycache__/autocompletion.cpython-39.pyc | Bin 0 -> 5255 bytes .../__pycache__/base_command.cpython-39.pyc | Bin 0 -> 6374 bytes .../cli/__pycache__/cmdoptions.cpython-39.pyc | Bin 0 -> 22698 bytes .../command_context.cpython-39.pyc | Bin 0 -> 1287 bytes .../cli/__pycache__/main.cpython-39.pyc | Bin 0 -> 1362 bytes .../__pycache__/main_parser.cpython-39.pyc | Bin 0 -> 2159 bytes .../cli/__pycache__/parser.cpython-39.pyc | Bin 0 -> 9943 bytes .../__pycache__/progress_bars.cpython-39.pyc | Bin 0 -> 9232 bytes .../__pycache__/req_command.cpython-39.pyc | Bin 0 -> 13441 bytes .../cli/__pycache__/spinners.cpython-39.pyc | Bin 0 -> 4942 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 0 -> 351 bytes .../pip/_internal/cli/autocompletion.py | 171 + .../pip/_internal/cli/base_command.py | 223 + .../pip/_internal/cli/cmdoptions.py | 1018 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 70 + .../pip/_internal/cli/main_parser.py | 87 + .../site-packages/pip/_internal/cli/parser.py | 292 + .../pip/_internal/cli/progress_bars.py | 321 + .../pip/_internal/cli/req_command.py | 506 + .../pip/_internal/cli/spinners.py | 157 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 127 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3049 bytes .../commands/__pycache__/cache.cpython-39.pyc | Bin 0 -> 6176 bytes .../commands/__pycache__/check.cpython-39.pyc | Bin 0 -> 1565 bytes .../__pycache__/completion.cpython-39.pyc | Bin 0 -> 3138 bytes .../__pycache__/configuration.cpython-39.pyc | Bin 0 -> 8319 bytes .../commands/__pycache__/debug.cpython-39.pyc | Bin 0 -> 6654 bytes .../__pycache__/download.cpython-39.pyc | Bin 0 -> 3982 bytes .../__pycache__/freeze.cpython-39.pyc | Bin 0 -> 2635 bytes .../commands/__pycache__/hash.cpython-39.pyc | Bin 0 -> 2131 bytes .../commands/__pycache__/help.cpython-39.pyc | Bin 0 -> 1303 bytes .../commands/__pycache__/index.cpython-39.pyc | Bin 0 -> 4593 bytes .../__pycache__/install.cpython-39.pyc | Bin 0 -> 17694 bytes .../commands/__pycache__/list.cpython-39.pyc | Bin 0 -> 10153 bytes .../__pycache__/search.cpython-39.pyc | Bin 0 -> 5321 bytes .../commands/__pycache__/show.cpython-39.pyc | Bin 0 -> 6091 bytes .../__pycache__/uninstall.cpython-39.pyc | Bin 0 -> 3099 bytes .../commands/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 4849 bytes .../pip/_internal/commands/cache.py | 223 + .../pip/_internal/commands/check.py | 53 + .../pip/_internal/commands/completion.py | 96 + .../pip/_internal/commands/configuration.py | 266 + .../pip/_internal/commands/debug.py | 202 + .../pip/_internal/commands/download.py | 140 + .../pip/_internal/commands/freeze.py | 97 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/install.py | 771 ++ .../pip/_internal/commands/list.py | 361 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 178 + .../pip/_internal/commands/uninstall.py | 105 + .../pip/_internal/commands/wheel.py | 178 + .../pip/_internal/configuration.py | 366 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 795 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 1870 bytes .../__pycache__/installed.cpython-39.pyc | Bin 0 -> 1228 bytes .../__pycache__/sdist.cpython-39.pyc | Bin 0 -> 4551 bytes .../__pycache__/wheel.cpython-39.pyc | Bin 0 -> 1595 bytes .../pip/_internal/distributions/base.py | 36 + .../pip/_internal/distributions/installed.py | 20 + .../pip/_internal/distributions/sdist.py | 127 + .../pip/_internal/distributions/wheel.py | 31 + .../site-packages/pip/_internal/exceptions.py | 658 ++ .../pip/_internal/index/__init__.py | 2 + .../index/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 226 bytes .../__pycache__/collector.cpython-39.pyc | Bin 0 -> 18031 bytes .../__pycache__/package_finder.cpython-39.pyc | Bin 0 -> 28081 bytes .../index/__pycache__/sources.cpython-39.pyc | Bin 0 -> 7191 bytes .../pip/_internal/index/collector.py | 610 ++ .../pip/_internal/index/package_finder.py | 1004 ++ .../pip/_internal/index/sources.py | 224 + .../pip/_internal/locations/__init__.py | 520 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 12514 bytes .../__pycache__/_distutils.cpython-39.pyc | Bin 0 -> 4665 bytes .../__pycache__/_sysconfig.cpython-39.pyc | Bin 0 -> 6256 bytes .../locations/__pycache__/base.cpython-39.pyc | Bin 0 -> 1534 bytes .../pip/_internal/locations/_distutils.py | 169 + .../pip/_internal/locations/_sysconfig.py | 219 + .../pip/_internal/locations/base.py | 52 + .../Lib/site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 62 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2329 bytes .../metadata/__pycache__/base.cpython-39.pyc | Bin 0 -> 21121 bytes .../__pycache__/pkg_resources.cpython-39.pyc | Bin 0 -> 9927 bytes .../pip/_internal/metadata/base.py | 546 ++ .../pip/_internal/metadata/pkg_resources.py | 256 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 260 bytes .../__pycache__/candidate.cpython-39.pyc | Bin 0 -> 1443 bytes .../__pycache__/direct_url.cpython-39.pyc | Bin 0 -> 7233 bytes .../__pycache__/format_control.cpython-39.pyc | Bin 0 -> 2714 bytes .../models/__pycache__/index.cpython-39.pyc | Bin 0 -> 1230 bytes .../models/__pycache__/link.cpython-39.pyc | Bin 0 -> 10254 bytes .../models/__pycache__/scheme.cpython-39.pyc | Bin 0 -> 1006 bytes .../__pycache__/search_scope.cpython-39.pyc | Bin 0 -> 3475 bytes .../selection_prefs.cpython-39.pyc | Bin 0 -> 1662 bytes .../__pycache__/target_python.cpython-39.pyc | Bin 0 -> 3408 bytes .../models/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 4332 bytes .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 220 + .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../pip/_internal/models/link.py | 288 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 129 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 89 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 248 bytes .../network/__pycache__/auth.cpython-39.pyc | Bin 0 -> 7480 bytes .../network/__pycache__/cache.cpython-39.pyc | Bin 0 -> 2920 bytes .../__pycache__/download.cpython-39.pyc | Bin 0 -> 5512 bytes .../__pycache__/lazy_wheel.cpython-39.pyc | Bin 0 -> 8380 bytes .../__pycache__/session.cpython-39.pyc | Bin 0 -> 10750 bytes .../network/__pycache__/utils.cpython-39.pyc | Bin 0 -> 1426 bytes .../network/__pycache__/xmlrpc.cpython-39.pyc | Bin 0 -> 2047 bytes .../pip/_internal/network/auth.py | 323 + .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 185 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 454 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 196 bytes .../__pycache__/check.cpython-39.pyc | Bin 0 -> 4000 bytes .../__pycache__/freeze.cpython-39.pyc | Bin 0 -> 6142 bytes .../__pycache__/prepare.cpython-39.pyc | Bin 0 -> 14758 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 202 bytes .../build/__pycache__/metadata.cpython-39.pyc | Bin 0 -> 1413 bytes .../metadata_editable.cpython-39.pyc | Bin 0 -> 1447 bytes .../metadata_legacy.cpython-39.pyc | Bin 0 -> 2323 bytes .../build/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 1197 bytes .../__pycache__/wheel_editable.cpython-39.pyc | Bin 0 -> 1413 bytes .../__pycache__/wheel_legacy.cpython-39.pyc | Bin 0 -> 2720 bytes .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 149 + .../pip/_internal/operations/freeze.py | 254 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 260 bytes .../editable_legacy.cpython-39.pyc | Bin 0 -> 1481 bytes .../install/__pycache__/legacy.cpython-39.pyc | Bin 0 -> 3280 bytes .../install/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 20962 bytes .../operations/install/editable_legacy.py | 47 + .../_internal/operations/install/legacy.py | 120 + .../pip/_internal/operations/install/wheel.py | 738 ++ .../pip/_internal/operations/prepare.py | 642 ++ .../site-packages/pip/_internal/pyproject.py | 168 + .../pip/_internal/req/__init__.py | 94 + .../req/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2555 bytes .../__pycache__/constructors.cpython-39.pyc | Bin 0 -> 12100 bytes .../req/__pycache__/req_file.cpython-39.pyc | Bin 0 -> 13373 bytes .../__pycache__/req_install.cpython-39.pyc | Bin 0 -> 22116 bytes .../req/__pycache__/req_set.cpython-39.pyc | Bin 0 -> 5893 bytes .../__pycache__/req_tracker.cpython-39.pyc | Bin 0 -> 4253 bytes .../__pycache__/req_uninstall.cpython-39.pyc | Bin 0 -> 18834 bytes .../pip/_internal/req/constructors.py | 490 + .../pip/_internal/req/req_file.py | 536 ++ .../pip/_internal/req/req_install.py | 858 ++ .../pip/_internal/req/req_set.py | 189 + .../pip/_internal/req/req_tracker.py | 124 + .../pip/_internal/req/req_uninstall.py | 633 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 196 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 1053 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 203 bytes .../__pycache__/resolver.cpython-39.pyc | Bin 0 -> 12191 bytes .../_internal/resolution/legacy/resolver.py | 467 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 207 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 6604 bytes .../__pycache__/candidates.cpython-39.pyc | Bin 0 -> 18527 bytes .../__pycache__/factory.cpython-39.pyc | Bin 0 -> 19095 bytes .../found_candidates.cpython-39.pyc | Bin 0 -> 4838 bytes .../__pycache__/provider.cpython-39.pyc | Bin 0 -> 7633 bytes .../__pycache__/reporter.cpython-39.pyc | Bin 0 -> 3268 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 0 -> 7577 bytes .../__pycache__/resolver.cpython-39.pyc | Bin 0 -> 8176 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 547 ++ .../resolution/resolvelib/factory.py | 739 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 248 + .../resolution/resolvelib/reporter.py | 68 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 298 + .../pip/_internal/self_outdated_check.py | 189 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 191 bytes .../utils/__pycache__/_log.cpython-39.pyc | Bin 0 -> 1516 bytes .../utils/__pycache__/appdirs.cpython-39.pyc | Bin 0 -> 1622 bytes .../utils/__pycache__/compat.cpython-39.pyc | Bin 0 -> 1510 bytes .../compatibility_tags.cpython-39.pyc | Bin 0 -> 4062 bytes .../utils/__pycache__/datetime.cpython-39.pyc | Bin 0 -> 510 bytes .../__pycache__/deprecation.cpython-39.pyc | Bin 0 -> 3248 bytes .../direct_url_helpers.cpython-39.pyc | Bin 0 -> 2081 bytes .../__pycache__/distutils_args.cpython-39.pyc | Bin 0 -> 1096 bytes .../utils/__pycache__/egg_link.cpython-39.pyc | Bin 0 -> 2137 bytes .../utils/__pycache__/encoding.cpython-39.pyc | Bin 0 -> 1300 bytes .../__pycache__/entrypoints.cpython-39.pyc | Bin 0 -> 1301 bytes .../__pycache__/filesystem.cpython-39.pyc | Bin 0 -> 5137 bytes .../__pycache__/filetypes.cpython-39.pyc | Bin 0 -> 941 bytes .../utils/__pycache__/glibc.cpython-39.pyc | Bin 0 -> 1672 bytes .../utils/__pycache__/hashes.cpython-39.pyc | Bin 0 -> 5186 bytes .../inject_securetransport.cpython-39.pyc | Bin 0 -> 980 bytes .../utils/__pycache__/logging.cpython-39.pyc | Bin 0 -> 9592 bytes .../utils/__pycache__/misc.cpython-39.pyc | Bin 0 -> 18797 bytes .../utils/__pycache__/models.cpython-39.pyc | Bin 0 -> 2059 bytes .../__pycache__/packaging.cpython-39.pyc | Bin 0 -> 2079 bytes .../setuptools_build.cpython-39.pyc | Bin 0 -> 4567 bytes .../__pycache__/subprocess.cpython-39.pyc | Bin 0 -> 5707 bytes .../utils/__pycache__/temp_dir.cpython-39.pyc | Bin 0 -> 7258 bytes .../__pycache__/unpacking.cpython-39.pyc | Bin 0 -> 6722 bytes .../utils/__pycache__/urls.cpython-39.pyc | Bin 0 -> 1595 bytes .../__pycache__/virtualenv.cpython-39.pyc | Bin 0 -> 3285 bytes .../utils/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 4475 bytes .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/distutils_args.py | 42 + .../pip/_internal/utils/egg_link.py | 75 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 27 + .../pip/_internal/utils/filesystem.py | 182 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 144 + .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 343 + .../site-packages/pip/_internal/utils/misc.py | 629 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 195 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 246 + .../pip/_internal/utils/unpacking.py | 258 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 136 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 514 bytes .../vcs/__pycache__/bazaar.cpython-39.pyc | Bin 0 -> 3353 bytes .../vcs/__pycache__/git.cpython-39.pyc | Bin 0 -> 12561 bytes .../vcs/__pycache__/mercurial.cpython-39.pyc | Bin 0 -> 5058 bytes .../vcs/__pycache__/subversion.cpython-39.pyc | Bin 0 -> 8475 bytes .../__pycache__/versioncontrol.cpython-39.pyc | Bin 0 -> 21181 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 101 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 ++ .../pip/_internal/wheel_builder.py | 377 + .../Lib/site-packages/pip/_vendor/__init__.py | 111 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2904 bytes .../_vendor/__pycache__/distro.cpython-39.pyc | Bin 0 -> 38366 bytes .../_vendor/__pycache__/six.cpython-39.pyc | Bin 0 -> 27508 bytes .../typing_extensions.cpython-39.pyc | Bin 0 -> 68492 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 642 bytes .../__pycache__/_cmd.cpython-39.pyc | Bin 0 -> 1570 bytes .../__pycache__/adapter.cpython-39.pyc | Bin 0 -> 3134 bytes .../__pycache__/cache.cpython-39.pyc | Bin 0 -> 1841 bytes .../__pycache__/compat.cpython-39.pyc | Bin 0 -> 746 bytes .../__pycache__/controller.cpython-39.pyc | Bin 0 -> 8208 bytes .../__pycache__/filewrapper.cpython-39.pyc | Bin 0 -> 2786 bytes .../__pycache__/heuristics.cpython-39.pyc | Bin 0 -> 4703 bytes .../__pycache__/serialize.cpython-39.pyc | Bin 0 -> 4250 bytes .../__pycache__/wrapper.cpython-39.pyc | Bin 0 -> 673 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 + .../pip/_vendor/cachecontrol/adapter.py | 137 + .../pip/_vendor/cachecontrol/cache.py | 43 + .../_vendor/cachecontrol/caches/__init__.py | 6 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 293 bytes .../__pycache__/file_cache.cpython-39.pyc | Bin 0 -> 3323 bytes .../__pycache__/redis_cache.cpython-39.pyc | Bin 0 -> 1565 bytes .../_vendor/cachecontrol/caches/file_cache.py | 150 + .../cachecontrol/caches/redis_cache.py | 37 + .../pip/_vendor/cachecontrol/compat.py | 32 + .../pip/_vendor/cachecontrol/controller.py | 415 + .../pip/_vendor/cachecontrol/filewrapper.py | 111 + .../pip/_vendor/cachecontrol/heuristics.py | 139 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 33 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 275 bytes .../__pycache__/__main__.cpython-39.pyc | Bin 0 -> 452 bytes .../certifi/__pycache__/core.cpython-39.pyc | Bin 0 -> 1543 bytes .../pip/_vendor/certifi/cacert.pem | 4362 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 76 + .../pip/_vendor/chardet/__init__.py | 83 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1899 bytes .../__pycache__/big5freq.cpython-39.pyc | Bin 0 -> 27178 bytes .../__pycache__/big5prober.cpython-39.pyc | Bin 0 -> 1133 bytes .../chardistribution.cpython-39.pyc | Bin 0 -> 6219 bytes .../charsetgroupprober.cpython-39.pyc | Bin 0 -> 2260 bytes .../__pycache__/charsetprober.cpython-39.pyc | Bin 0 -> 3482 bytes .../codingstatemachine.cpython-39.pyc | Bin 0 -> 2909 bytes .../chardet/__pycache__/compat.cpython-39.pyc | Bin 0 -> 398 bytes .../__pycache__/cp949prober.cpython-39.pyc | Bin 0 -> 1140 bytes .../chardet/__pycache__/enums.cpython-39.pyc | Bin 0 -> 2647 bytes .../__pycache__/escprober.cpython-39.pyc | Bin 0 -> 2632 bytes .../chardet/__pycache__/escsm.cpython-39.pyc | Bin 0 -> 7081 bytes .../__pycache__/eucjpprober.cpython-39.pyc | Bin 0 -> 2446 bytes .../__pycache__/euckrfreq.cpython-39.pyc | Bin 0 -> 12062 bytes .../__pycache__/euckrprober.cpython-39.pyc | Bin 0 -> 1141 bytes .../__pycache__/euctwfreq.cpython-39.pyc | Bin 0 -> 27182 bytes .../__pycache__/euctwprober.cpython-39.pyc | Bin 0 -> 1141 bytes .../__pycache__/gb2312freq.cpython-39.pyc | Bin 0 -> 19106 bytes .../__pycache__/gb2312prober.cpython-39.pyc | Bin 0 -> 1149 bytes .../__pycache__/hebrewprober.cpython-39.pyc | Bin 0 -> 3018 bytes .../__pycache__/jisfreq.cpython-39.pyc | Bin 0 -> 22134 bytes .../chardet/__pycache__/jpcntx.cpython-39.pyc | Bin 0 -> 37607 bytes .../langbulgarianmodel.cpython-39.pyc | Bin 0 -> 21809 bytes .../__pycache__/langgreekmodel.cpython-39.pyc | Bin 0 -> 20485 bytes .../langhebrewmodel.cpython-39.pyc | Bin 0 -> 20553 bytes .../langhungarianmodel.cpython-39.pyc | Bin 0 -> 21754 bytes .../langrussianmodel.cpython-39.pyc | Bin 0 -> 26357 bytes .../__pycache__/langthaimodel.cpython-39.pyc | Bin 0 -> 20729 bytes .../langturkishmodel.cpython-39.pyc | Bin 0 -> 20569 bytes .../__pycache__/latin1prober.cpython-39.pyc | Bin 0 -> 2954 bytes .../mbcharsetprober.cpython-39.pyc | Bin 0 -> 2261 bytes .../mbcsgroupprober.cpython-39.pyc | Bin 0 -> 1130 bytes .../chardet/__pycache__/mbcssm.cpython-39.pyc | Bin 0 -> 15717 bytes .../sbcharsetprober.cpython-39.pyc | Bin 0 -> 3114 bytes .../sbcsgroupprober.cpython-39.pyc | Bin 0 -> 1699 bytes .../__pycache__/sjisprober.cpython-39.pyc | Bin 0 -> 2482 bytes .../universaldetector.cpython-39.pyc | Bin 0 -> 5830 bytes .../__pycache__/utf8prober.cpython-39.pyc | Bin 0 -> 1991 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 438 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 107 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 195 bytes .../cli/__pycache__/chardetect.cpython-39.pyc | Bin 0 -> 2689 bytes .../pip/_vendor/chardet/cli/chardetect.py | 84 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 36 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4650 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4398 +++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4383 +++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4650 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5718 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4383 +++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4383 +++++++++ .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 200 bytes .../__pycache__/languages.cpython-39.pyc | Bin 0 -> 7931 bytes .../pip/_vendor/chardet/metadata/languages.py | 310 + .../pip/_vendor/chardet/sbcharsetprober.py | 145 + .../pip/_vendor/chardet/sbcsgroupprober.py | 83 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 443 bytes .../colorama/__pycache__/ansi.cpython-39.pyc | Bin 0 -> 3228 bytes .../__pycache__/ansitowin32.cpython-39.pyc | Bin 0 -> 7694 bytes .../__pycache__/initialise.cpython-39.pyc | Bin 0 -> 1710 bytes .../colorama/__pycache__/win32.cpython-39.pyc | Bin 0 -> 3942 bytes .../__pycache__/winterm.cpython-39.pyc | Bin 0 -> 4664 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 258 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1056 bytes .../distlib/__pycache__/compat.cpython-39.pyc | Bin 0 -> 31821 bytes .../__pycache__/database.cpython-39.pyc | Bin 0 -> 42480 bytes .../distlib/__pycache__/index.cpython-39.pyc | Bin 0 -> 17289 bytes .../__pycache__/locators.cpython-39.pyc | Bin 0 -> 38253 bytes .../__pycache__/manifest.cpython-39.pyc | Bin 0 -> 10192 bytes .../__pycache__/markers.cpython-39.pyc | Bin 0 -> 4974 bytes .../__pycache__/metadata.cpython-39.pyc | Bin 0 -> 26587 bytes .../__pycache__/resources.cpython-39.pyc | Bin 0 -> 11010 bytes .../__pycache__/scripts.cpython-39.pyc | Bin 0 -> 11242 bytes .../distlib/__pycache__/util.cpython-39.pyc | Bin 0 -> 52605 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 20355 bytes .../distlib/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 27168 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 483 bytes .../_backport/__pycache__/misc.cpython-39.pyc | Bin 0 -> 1103 bytes .../__pycache__/shutil.cpython-39.pyc | Bin 0 -> 21677 bytes .../__pycache__/sysconfig.cpython-39.pyc | Bin 0 -> 15967 bytes .../__pycache__/tarfile.cpython-39.pyc | Bin 0 -> 62731 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 764 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 786 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 +++++ .../pip/_vendor/distlib/compat.py | 1122 +++ .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/index.py | 509 + .../pip/_vendor/distlib/locators.py | 1300 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 147 + .../pip/_vendor/distlib/metadata.py | 1058 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 429 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 96768 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 180736 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 105984 bytes .../site-packages/pip/_vendor/distlib/util.py | 1969 ++++ .../pip/_vendor/distlib/version.py | 739 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 90112 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 166400 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel.py | 1053 ++ .../Lib/site-packages/pip/_vendor/distro.py | 1386 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1302 bytes .../__pycache__/_ihatexml.cpython-39.pyc | Bin 0 -> 13771 bytes .../__pycache__/_inputstream.cpython-39.pyc | Bin 0 -> 21630 bytes .../__pycache__/_tokenizer.cpython-39.pyc | Bin 0 -> 39725 bytes .../__pycache__/_utils.cpython-39.pyc | Bin 0 -> 4802 bytes .../__pycache__/constants.cpython-39.pyc | Bin 0 -> 66340 bytes .../__pycache__/html5parser.cpython-39.pyc | Bin 0 -> 91011 bytes .../__pycache__/serializer.cpython-39.pyc | Bin 0 -> 10813 bytes .../pip/_vendor/html5lib/_ihatexml.py | 289 + .../pip/_vendor/html5lib/_inputstream.py | 918 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1735 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 5 + .../_trie/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 352 bytes .../_trie/__pycache__/_base.cpython-39.pyc | Bin 0 -> 1596 bytes .../_trie/__pycache__/py.cpython-39.pyc | Bin 0 -> 2257 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 159 + .../pip/_vendor/html5lib/constants.py | 2946 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 200 bytes .../alphabeticalattributes.cpython-39.pyc | Bin 0 -> 1322 bytes .../filters/__pycache__/base.cpython-39.pyc | Bin 0 -> 870 bytes .../inject_meta_charset.cpython-39.pyc | Bin 0 -> 1876 bytes .../filters/__pycache__/lint.cpython-39.pyc | Bin 0 -> 2618 bytes .../__pycache__/optionaltags.cpython-39.pyc | Bin 0 -> 2763 bytes .../__pycache__/sanitizer.cpython-39.pyc | Bin 0 -> 16886 bytes .../__pycache__/whitespace.cpython-39.pyc | Bin 0 -> 1368 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 916 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2795 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 937 bytes .../__pycache__/genshi.cpython-39.pyc | Bin 0 -> 1545 bytes .../__pycache__/sax.cpython-39.pyc | Bin 0 -> 1464 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3332 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 11316 bytes .../__pycache__/dom.cpython-39.pyc | Bin 0 -> 9453 bytes .../__pycache__/etree.cpython-39.pyc | Bin 0 -> 11821 bytes .../__pycache__/etree_lxml.cpython-39.pyc | Bin 0 -> 13004 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 343 + .../html5lib/treebuilders/etree_lxml.py | 392 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3998 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 6997 bytes .../__pycache__/dom.cpython-39.pyc | Bin 0 -> 1732 bytes .../__pycache__/etree.cpython-39.pyc | Bin 0 -> 3494 bytes .../__pycache__/etree_lxml.cpython-39.pyc | Bin 0 -> 6631 bytes .../__pycache__/genshi.cpython-39.pyc | Bin 0 -> 1888 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 131 + .../html5lib/treewalkers/etree_lxml.py | 215 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 847 bytes .../idna/__pycache__/codec.cpython-39.pyc | Bin 0 -> 3084 bytes .../idna/__pycache__/compat.cpython-39.pyc | Bin 0 -> 766 bytes .../idna/__pycache__/core.cpython-39.pyc | Bin 0 -> 9762 bytes .../idna/__pycache__/idnadata.cpython-39.pyc | Bin 0 -> 23043 bytes .../idna/__pycache__/intranges.cpython-39.pyc | Bin 0 -> 1997 bytes .../__pycache__/package_data.cpython-39.pyc | Bin 0 -> 211 bytes .../idna/__pycache__/uts46data.cpython-39.pyc | Bin 0 -> 151744 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 397 + .../pip/_vendor/idna/idnadata.py | 2137 +++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8512 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 54 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1414 bytes .../__pycache__/_version.cpython-39.pyc | Bin 0 -> 218 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 1852 bytes .../msgpack/__pycache__/ext.cpython-39.pyc | Bin 0 -> 6280 bytes .../__pycache__/fallback.cpython-39.pyc | Bin 0 -> 25619 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1012 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-39.pyc | Bin 0 -> 590 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 446 bytes .../__pycache__/_manylinux.cpython-39.pyc | Bin 0 -> 7294 bytes .../__pycache__/_musllinux.cpython-39.pyc | Bin 0 -> 4609 bytes .../__pycache__/_structures.cpython-39.pyc | Bin 0 -> 2803 bytes .../__pycache__/markers.cpython-39.pyc | Bin 0 -> 9453 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 0 -> 3974 bytes .../__pycache__/specifiers.cpython-39.pyc | Bin 0 -> 21521 bytes .../packaging/__pycache__/tags.cpython-39.pyc | Bin 0 -> 12252 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 3611 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 13152 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pep517/__init__.py | 6 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 313 bytes .../pep517/__pycache__/build.cpython-39.pyc | Bin 0 -> 3561 bytes .../pep517/__pycache__/check.cpython-39.pyc | Bin 0 -> 5108 bytes .../__pycache__/colorlog.cpython-39.pyc | Bin 0 -> 2938 bytes .../pep517/__pycache__/compat.cpython-39.pyc | Bin 0 -> 1529 bytes .../__pycache__/dirtools.cpython-39.pyc | Bin 0 -> 1347 bytes .../__pycache__/envbuild.cpython-39.pyc | Bin 0 -> 4507 bytes .../pep517/__pycache__/meta.cpython-39.pyc | Bin 0 -> 2920 bytes .../__pycache__/wrappers.cpython-39.pyc | Bin 0 -> 12493 bytes .../site-packages/pip/_vendor/pep517/build.py | 127 + .../site-packages/pip/_vendor/pep517/check.py | 207 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 51 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 171 + .../pip/_vendor/pep517/in_process/__init__.py | 17 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 915 bytes .../__pycache__/_in_process.cpython-39.pyc | Bin 0 -> 10269 bytes .../_vendor/pep517/in_process/_in_process.py | 363 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 375 + .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 100336 bytes .../__pycache__/py31compat.cpython-39.pyc | Bin 0 -> 650 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/platformdirs/__init__.py | 331 + .../pip/_vendor/platformdirs/__main__.py | 46 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 10651 bytes .../__pycache__/__main__.cpython-39.pyc | Bin 0 -> 1222 bytes .../__pycache__/android.cpython-39.pyc | Bin 0 -> 4371 bytes .../__pycache__/api.cpython-39.pyc | Bin 0 -> 5284 bytes .../__pycache__/macos.cpython-39.pyc | Bin 0 -> 3306 bytes .../__pycache__/unix.cpython-39.pyc | Bin 0 -> 7054 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 295 bytes .../__pycache__/windows.cpython-39.pyc | Bin 0 -> 6450 bytes .../pip/_vendor/platformdirs/android.py | 119 + .../pip/_vendor/platformdirs/api.py | 156 + .../pip/_vendor/platformdirs/macos.py | 64 + .../pip/_vendor/platformdirs/unix.py | 181 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 182 + .../pip/_vendor/progress/__init__.py | 189 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 5682 bytes .../progress/__pycache__/bar.cpython-39.pyc | Bin 0 -> 2727 bytes .../__pycache__/colors.cpython-39.pyc | Bin 0 -> 1500 bytes .../__pycache__/counter.cpython-39.pyc | Bin 0 -> 1625 bytes .../__pycache__/spinner.cpython-39.pyc | Bin 0 -> 1451 bytes .../site-packages/pip/_vendor/progress/bar.py | 93 + .../pip/_vendor/progress/colors.py | 79 + .../pip/_vendor/progress/counter.py | 47 + .../pip/_vendor/progress/spinner.py | 45 + .../pip/_vendor/pygments/__init__.py | 83 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3025 bytes .../__pycache__/__main__.cpython-39.pyc | Bin 0 -> 586 bytes .../__pycache__/cmdline.cpython-39.pyc | Bin 0 -> 15378 bytes .../__pycache__/console.cpython-39.pyc | Bin 0 -> 1883 bytes .../__pycache__/filter.cpython-39.pyc | Bin 0 -> 2644 bytes .../__pycache__/formatter.cpython-39.pyc | Bin 0 -> 3008 bytes .../pygments/__pycache__/lexer.cpython-39.pyc | Bin 0 -> 24438 bytes .../__pycache__/modeline.cpython-39.pyc | Bin 0 -> 1186 bytes .../__pycache__/plugin.cpython-39.pyc | Bin 0 -> 2106 bytes .../__pycache__/regexopt.cpython-39.pyc | Bin 0 -> 2940 bytes .../__pycache__/scanner.cpython-39.pyc | Bin 0 -> 3553 bytes .../__pycache__/sphinxext.cpython-39.pyc | Bin 0 -> 4558 bytes .../pygments/__pycache__/style.cpython-39.pyc | Bin 0 -> 4495 bytes .../pygments/__pycache__/token.cpython-39.pyc | Bin 0 -> 4357 bytes .../__pycache__/unistring.cpython-39.pyc | Bin 0 -> 31215 bytes .../pygments/__pycache__/util.cpython-39.pyc | Bin 0 -> 9172 bytes .../pip/_vendor/pygments/cmdline.py | 663 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 937 ++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 23393 bytes .../pip/_vendor/pygments/formatter.py | 94 + .../_vendor/pygments/formatters/__init__.py | 153 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 4661 bytes .../__pycache__/_mapping.cpython-39.pyc | Bin 0 -> 5417 bytes .../__pycache__/bbcode.cpython-39.pyc | Bin 0 -> 3065 bytes .../__pycache__/groff.cpython-39.pyc | Bin 0 -> 4338 bytes .../__pycache__/html.cpython-39.pyc | Bin 0 -> 29050 bytes .../formatters/__pycache__/img.cpython-39.pyc | Bin 0 -> 17492 bytes .../formatters/__pycache__/irc.cpython-39.pyc | Bin 0 -> 4404 bytes .../__pycache__/latex.cpython-39.pyc | Bin 0 -> 13486 bytes .../__pycache__/other.cpython-39.pyc | Bin 0 -> 4788 bytes .../__pycache__/pangomarkup.cpython-39.pyc | Bin 0 -> 2090 bytes .../formatters/__pycache__/rtf.cpython-39.pyc | Bin 0 -> 4124 bytes .../formatters/__pycache__/svg.cpython-39.pyc | Bin 0 -> 6336 bytes .../__pycache__/terminal.cpython-39.pyc | Bin 0 -> 3905 bytes .../__pycache__/terminal256.cpython-39.pyc | Bin 0 -> 9215 bytes .../_vendor/pygments/formatters/_mapping.py | 84 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 168 + .../pip/_vendor/pygments/formatters/html.py | 983 ++ .../pip/_vendor/pygments/formatters/img.py | 641 ++ .../pip/_vendor/pygments/formatters/irc.py | 179 + .../pip/_vendor/pygments/formatters/latex.py | 511 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 879 ++ .../pip/_vendor/pygments/lexers/__init__.py | 341 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 9138 bytes .../__pycache__/_mapping.cpython-39.pyc | Bin 0 -> 50821 bytes .../lexers/__pycache__/python.cpython-39.pyc | Bin 0 -> 28966 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 580 ++ .../pip/_vendor/pygments/lexers/python.py | 1188 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 69 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 155 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 93 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3006 bytes .../pip/_vendor/pygments/token.py | 212 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 308 + .../pip/_vendor/pyparsing/__init__.py | 328 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 7117 bytes .../__pycache__/actions.cpython-39.pyc | Bin 0 -> 7168 bytes .../__pycache__/common.cpython-39.pyc | Bin 0 -> 10059 bytes .../pyparsing/__pycache__/core.cpython-39.pyc | Bin 0 -> 176669 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 9156 bytes .../__pycache__/helpers.cpython-39.pyc | Bin 0 -> 34704 bytes .../__pycache__/results.cpython-39.pyc | Bin 0 -> 24780 bytes .../__pycache__/testing.cpython-39.pyc | Bin 0 -> 12109 bytes .../__pycache__/unicode.cpython-39.pyc | Bin 0 -> 10250 bytes .../pyparsing/__pycache__/util.cpython-39.pyc | Bin 0 -> 8619 bytes .../pip/_vendor/pyparsing/actions.py | 207 + .../pip/_vendor/pyparsing/common.py | 424 + .../pip/_vendor/pyparsing/core.py | 5789 +++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 593 ++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 15587 bytes .../pip/_vendor/pyparsing/exceptions.py | 267 + .../pip/_vendor/pyparsing/helpers.py | 1069 +++ .../pip/_vendor/pyparsing/results.py | 760 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 332 + .../pip/_vendor/pyparsing/util.py | 235 + .../pip/_vendor/requests/__init__.py | 154 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 4028 bytes .../__pycache__/__version__.cpython-39.pyc | Bin 0 -> 555 bytes .../_internal_utils.cpython-39.pyc | Bin 0 -> 1302 bytes .../__pycache__/adapters.cpython-39.pyc | Bin 0 -> 17112 bytes .../requests/__pycache__/api.cpython-39.pyc | Bin 0 -> 6719 bytes .../requests/__pycache__/auth.cpython-39.pyc | Bin 0 -> 8331 bytes .../requests/__pycache__/certs.cpython-39.pyc | Bin 0 -> 633 bytes .../__pycache__/compat.cpython-39.pyc | Bin 0 -> 1668 bytes .../__pycache__/cookies.cpython-39.pyc | Bin 0 -> 18822 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 5658 bytes .../requests/__pycache__/help.cpython-39.pyc | Bin 0 -> 2893 bytes .../requests/__pycache__/hooks.cpython-39.pyc | Bin 0 -> 990 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 24371 bytes .../__pycache__/packages.cpython-39.pyc | Bin 0 -> 502 bytes .../__pycache__/sessions.cpython-39.pyc | Bin 0 -> 19706 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 0 -> 4239 bytes .../__pycache__/structures.cpython-39.pyc | Bin 0 -> 4460 bytes .../requests/__pycache__/utils.cpython-39.pyc | Bin 0 -> 24287 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 538 ++ .../site-packages/pip/_vendor/requests/api.py | 159 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 77 + .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/exceptions.py | 133 + .../pip/_vendor/requests/help.py | 132 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 973 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 771 ++ .../pip/_vendor/requests/status_codes.py | 123 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 1060 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 606 bytes .../__pycache__/providers.cpython-39.pyc | Bin 0 -> 6705 bytes .../__pycache__/reporters.cpython-39.pyc | Bin 0 -> 2617 bytes .../__pycache__/resolvers.cpython-39.pyc | Bin 0 -> 15308 bytes .../__pycache__/structs.cpython-39.pyc | Bin 0 -> 7279 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 201 bytes .../collections_abc.cpython-39.pyc | Bin 0 -> 375 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 482 + .../pip/_vendor/resolvelib/structs.py | 165 + .../pip/_vendor/rich/__init__.py | 172 + .../pip/_vendor/rich/__main__.py | 280 + .../rich/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 5799 bytes .../rich/__pycache__/__main__.cpython-39.pyc | Bin 0 -> 7291 bytes .../__pycache__/_cell_widths.cpython-39.pyc | Bin 0 -> 7814 bytes .../__pycache__/_emoji_codes.cpython-39.pyc | Bin 0 -> 132701 bytes .../__pycache__/_emoji_replace.cpython-39.pyc | Bin 0 -> 1186 bytes .../__pycache__/_extension.cpython-39.pyc | Bin 0 -> 495 bytes .../rich/__pycache__/_inspect.cpython-39.pyc | Bin 0 -> 6640 bytes .../__pycache__/_log_render.cpython-39.pyc | Bin 0 -> 2578 bytes .../rich/__pycache__/_loop.cpython-39.pyc | Bin 0 -> 1268 bytes .../__pycache__/_lru_cache.cpython-39.pyc | Bin 0 -> 1584 bytes .../rich/__pycache__/_palettes.cpython-39.pyc | Bin 0 -> 5097 bytes .../rich/__pycache__/_pick.cpython-39.pyc | Bin 0 -> 638 bytes .../rich/__pycache__/_ratio.cpython-39.pyc | Bin 0 -> 5122 bytes .../rich/__pycache__/_spinners.cpython-39.pyc | Bin 0 -> 13917 bytes .../rich/__pycache__/_stack.cpython-39.pyc | Bin 0 -> 843 bytes .../rich/__pycache__/_timer.cpython-39.pyc | Bin 0 -> 690 bytes .../rich/__pycache__/_windows.cpython-39.pyc | Bin 0 -> 1866 bytes .../rich/__pycache__/_wrap.cpython-39.pyc | Bin 0 -> 1496 bytes .../rich/__pycache__/abc.cpython-39.pyc | Bin 0 -> 1304 bytes .../rich/__pycache__/align.cpython-39.pyc | Bin 0 -> 7872 bytes .../rich/__pycache__/ansi.cpython-39.pyc | Bin 0 -> 5674 bytes .../rich/__pycache__/bar.cpython-39.pyc | Bin 0 -> 2942 bytes .../rich/__pycache__/box.cpython-39.pyc | Bin 0 -> 7856 bytes .../rich/__pycache__/cells.cpython-39.pyc | Bin 0 -> 3491 bytes .../rich/__pycache__/color.cpython-39.pyc | Bin 0 -> 14750 bytes .../__pycache__/color_triplet.cpython-39.pyc | Bin 0 -> 1425 bytes .../rich/__pycache__/columns.cpython-39.pyc | Bin 0 -> 6129 bytes .../rich/__pycache__/console.cpython-39.pyc | Bin 0 -> 69751 bytes .../rich/__pycache__/constrain.cpython-39.pyc | Bin 0 -> 1663 bytes .../__pycache__/containers.cpython-39.pyc | Bin 0 -> 6424 bytes .../rich/__pycache__/control.cpython-39.pyc | Bin 0 -> 6849 bytes .../__pycache__/default_styles.cpython-39.pyc | Bin 0 -> 5116 bytes .../rich/__pycache__/diagnose.cpython-39.pyc | Bin 0 -> 349 bytes .../rich/__pycache__/emoji.cpython-39.pyc | Bin 0 -> 3202 bytes .../rich/__pycache__/errors.cpython-39.pyc | Bin 0 -> 1669 bytes .../__pycache__/file_proxy.cpython-39.pyc | Bin 0 -> 2243 bytes .../rich/__pycache__/filesize.cpython-39.pyc | Bin 0 -> 2612 bytes .../__pycache__/highlighter.cpython-39.pyc | Bin 0 -> 5317 bytes .../rich/__pycache__/json.cpython-39.pyc | Bin 0 -> 4703 bytes .../rich/__pycache__/jupyter.cpython-39.pyc | Bin 0 -> 3843 bytes .../rich/__pycache__/layout.cpython-39.pyc | Bin 0 -> 14685 bytes .../rich/__pycache__/live.cpython-39.pyc | Bin 0 -> 11285 bytes .../__pycache__/live_render.cpython-39.pyc | Bin 0 -> 3390 bytes .../rich/__pycache__/logging.cpython-39.pyc | Bin 0 -> 9229 bytes .../rich/__pycache__/markup.cpython-39.pyc | Bin 0 -> 5896 bytes .../rich/__pycache__/measure.cpython-39.pyc | Bin 0 -> 4977 bytes .../rich/__pycache__/padding.cpython-39.pyc | Bin 0 -> 4406 bytes .../rich/__pycache__/pager.cpython-39.pyc | Bin 0 -> 1472 bytes .../rich/__pycache__/palette.cpython-39.pyc | Bin 0 -> 3688 bytes .../rich/__pycache__/panel.cpython-39.pyc | Bin 0 -> 6393 bytes .../rich/__pycache__/pretty.cpython-39.pyc | Bin 0 -> 24918 bytes .../rich/__pycache__/progress.cpython-39.pyc | Bin 0 -> 32952 bytes .../__pycache__/progress_bar.cpython-39.pyc | Bin 0 -> 6617 bytes .../rich/__pycache__/prompt.cpython-39.pyc | Bin 0 -> 11357 bytes .../rich/__pycache__/protocol.cpython-39.pyc | Bin 0 -> 1358 bytes .../rich/__pycache__/region.cpython-39.pyc | Bin 0 -> 525 bytes .../rich/__pycache__/repr.cpython-39.pyc | Bin 0 -> 4037 bytes .../rich/__pycache__/rule.cpython-39.pyc | Bin 0 -> 3701 bytes .../rich/__pycache__/scope.cpython-39.pyc | Bin 0 -> 2963 bytes .../rich/__pycache__/screen.cpython-39.pyc | Bin 0 -> 1822 bytes .../rich/__pycache__/segment.cpython-39.pyc | Bin 0 -> 20303 bytes .../rich/__pycache__/spinner.cpython-39.pyc | Bin 0 -> 4343 bytes .../rich/__pycache__/status.cpython-39.pyc | Bin 0 -> 4575 bytes .../rich/__pycache__/style.cpython-39.pyc | Bin 0 -> 20603 bytes .../rich/__pycache__/styled.cpython-39.pyc | Bin 0 -> 1688 bytes .../rich/__pycache__/syntax.cpython-39.pyc | Bin 0 -> 18804 bytes .../rich/__pycache__/table.cpython-39.pyc | Bin 0 -> 26670 bytes .../rich/__pycache__/tabulate.cpython-39.pyc | Bin 0 -> 1730 bytes .../__pycache__/terminal_theme.cpython-39.pyc | Bin 0 -> 1700 bytes .../rich/__pycache__/text.cpython-39.pyc | Bin 0 -> 39450 bytes .../rich/__pycache__/theme.cpython-39.pyc | Bin 0 -> 4680 bytes .../rich/__pycache__/themes.cpython-39.pyc | Bin 0 -> 293 bytes .../rich/__pycache__/traceback.cpython-39.pyc | Bin 0 -> 19360 bytes .../rich/__pycache__/tree.cpython-39.pyc | Bin 0 -> 7210 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_extension.py | 10 + .../pip/_vendor/rich/_inspect.py | 210 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_lru_cache.py | 34 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 848 ++ .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_windows.py | 72 + .../site-packages/pip/_vendor/rich/_wrap.py | 55 + .../Lib/site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 312 + .../site-packages/pip/_vendor/rich/ansi.py | 228 + .../Lib/site-packages/pip/_vendor/rich/bar.py | 94 + .../Lib/site-packages/pip/_vendor/rich/box.py | 483 + .../site-packages/pip/_vendor/rich/cells.py | 147 + .../site-packages/pip/_vendor/rich/color.py | 581 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2211 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 175 + .../pip/_vendor/rich/default_styles.py | 183 + .../pip/_vendor/rich/diagnose.py | 6 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 54 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 147 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 92 + .../site-packages/pip/_vendor/rich/layout.py | 444 + .../site-packages/pip/_vendor/rich/live.py | 365 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 268 + .../site-packages/pip/_vendor/rich/markup.py | 244 + .../site-packages/pip/_vendor/rich/measure.py | 149 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 250 + .../site-packages/pip/_vendor/rich/pretty.py | 903 ++ .../pip/_vendor/rich/progress.py | 1036 ++ .../pip/_vendor/rich/progress_bar.py | 216 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 151 + .../site-packages/pip/_vendor/rich/rule.py | 115 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 720 ++ .../site-packages/pip/_vendor/rich/spinner.py | 134 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 785 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 735 ++ .../site-packages/pip/_vendor/rich/table.py | 968 ++ .../pip/_vendor/rich/tabulate.py | 51 + .../pip/_vendor/rich/terminal_theme.py | 55 + .../site-packages/pip/_vendor/rich/text.py | 1282 +++ .../site-packages/pip/_vendor/rich/theme.py | 112 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 678 ++ .../site-packages/pip/_vendor/rich/tree.py | 249 + .../Lib/site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 517 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 16279 bytes .../__pycache__/_asyncio.cpython-39.pyc | Bin 0 -> 2594 bytes .../__pycache__/_utils.cpython-39.pyc | Bin 0 -> 1231 bytes .../tenacity/__pycache__/after.cpython-39.pyc | Bin 0 -> 1210 bytes .../__pycache__/before.cpython-39.pyc | Bin 0 -> 1098 bytes .../__pycache__/before_sleep.cpython-39.pyc | Bin 0 -> 1390 bytes .../tenacity/__pycache__/nap.cpython-39.pyc | Bin 0 -> 1192 bytes .../tenacity/__pycache__/retry.cpython-39.pyc | Bin 0 -> 8780 bytes .../tenacity/__pycache__/stop.cpython-39.pyc | Bin 0 -> 4244 bytes .../__pycache__/tornadoweb.cpython-39.pyc | Bin 0 -> 1744 bytes .../tenacity/__pycache__/wait.cpython-39.pyc | Bin 0 -> 7956 bytes .../pip/_vendor/tenacity/_asyncio.py | 92 + .../pip/_vendor/tenacity/_utils.py | 68 + .../pip/_vendor/tenacity/after.py | 46 + .../pip/_vendor/tenacity/before.py | 41 + .../pip/_vendor/tenacity/before_sleep.py | 58 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 213 + .../pip/_vendor/tenacity/stop.py | 96 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 191 + .../pip/_vendor/tomli/__init__.py | 6 + .../tomli/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 379 bytes .../tomli/__pycache__/_parser.cpython-39.pyc | Bin 0 -> 16354 bytes .../tomli/__pycache__/_re.cpython-39.pyc | Bin 0 -> 2429 bytes .../pip/_vendor/tomli/_parser.py | 703 ++ .../site-packages/pip/_vendor/tomli/_re.py | 83 + .../pip/_vendor/typing_extensions.py | 2296 +++++ .../pip/_vendor/urllib3/__init__.py | 85 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2189 bytes .../__pycache__/_collections.cpython-39.pyc | Bin 0 -> 10784 bytes .../__pycache__/_version.cpython-39.pyc | Bin 0 -> 213 bytes .../__pycache__/connection.cpython-39.pyc | Bin 0 -> 13678 bytes .../__pycache__/connectionpool.cpython-39.pyc | Bin 0 -> 25362 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 11646 bytes .../urllib3/__pycache__/fields.cpython-39.pyc | Bin 0 -> 8161 bytes .../__pycache__/filepost.cpython-39.pyc | Bin 0 -> 2762 bytes .../__pycache__/poolmanager.cpython-39.pyc | Bin 0 -> 15164 bytes .../__pycache__/request.cpython-39.pyc | Bin 0 -> 5625 bytes .../__pycache__/response.cpython-39.pyc | Bin 0 -> 20836 bytes .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 569 ++ .../pip/_vendor/urllib3/connectionpool.py | 1108 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 199 bytes .../_appengine_environ.cpython-39.pyc | Bin 0 -> 1419 bytes .../__pycache__/appengine.cpython-39.pyc | Bin 0 -> 8272 bytes .../__pycache__/ntlmpool.cpython-39.pyc | Bin 0 -> 3626 bytes .../__pycache__/pyopenssl.cpython-39.pyc | Bin 0 -> 15603 bytes .../securetransport.cpython-39.pyc | Bin 0 -> 21925 bytes .../contrib/__pycache__/socks.cpython-39.pyc | Bin 0 -> 5635 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 216 bytes .../__pycache__/bindings.cpython-39.pyc | Bin 0 -> 10708 bytes .../__pycache__/low_level.cpython-39.pyc | Bin 0 -> 9176 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 511 + .../urllib3/contrib/securetransport.py | 922 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 200 bytes .../packages/__pycache__/six.cpython-39.pyc | Bin 0 -> 27583 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 210 bytes .../__pycache__/makefile.cpython-39.pyc | Bin 0 -> 1308 bytes .../urllib3/packages/backports/makefile.py | 51 + .../pip/_vendor/urllib3/packages/six.py | 1077 +++ .../pip/_vendor/urllib3/poolmanager.py | 536 ++ .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 821 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1109 bytes .../__pycache__/connection.cpython-39.pyc | Bin 0 -> 3441 bytes .../util/__pycache__/proxy.cpython-39.pyc | Bin 0 -> 1345 bytes .../util/__pycache__/queue.cpython-39.pyc | Bin 0 -> 1064 bytes .../util/__pycache__/request.cpython-39.pyc | Bin 0 -> 3452 bytes .../util/__pycache__/response.cpython-39.pyc | Bin 0 -> 2349 bytes .../util/__pycache__/retry.cpython-39.pyc | Bin 0 -> 16256 bytes .../util/__pycache__/ssl_.cpython-39.pyc | Bin 0 -> 11333 bytes .../ssl_match_hostname.cpython-39.pyc | Bin 0 -> 3283 bytes .../__pycache__/ssltransport.cpython-39.pyc | Bin 0 -> 7479 bytes .../util/__pycache__/timeout.cpython-39.pyc | Bin 0 -> 8947 bytes .../util/__pycache__/url.cpython-39.pyc | Bin 0 -> 10672 bytes .../util/__pycache__/wait.cpython-39.pyc | Bin 0 -> 3132 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 143 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 620 ++ .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 161 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 268 + .../pip/_vendor/urllib3/util/url.py | 432 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../Lib/site-packages/pip/_vendor/vendor.txt | 25 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 9723 bytes .../__pycache__/labels.cpython-39.pyc | Bin 0 -> 3837 bytes .../__pycache__/mklabels.cpython-39.pyc | Bin 0 -> 1907 bytes .../__pycache__/tests.cpython-39.pyc | Bin 0 -> 5071 bytes .../__pycache__/x_user_defined.cpython-39.pyc | Bin 0 -> 2667 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../gmapenv/Lib/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3288 +++++++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 100439 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 193 bytes .../__pycache__/appdirs.cpython-39.pyc | Bin 0 -> 20510 bytes .../__pycache__/pyparsing.cpython-39.pyc | Bin 0 -> 201347 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 27 + .../_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-39.pyc | Bin 0 -> 709 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 555 bytes .../__pycache__/_compat.cpython-39.pyc | Bin 0 -> 1153 bytes .../__pycache__/_structures.cpython-39.pyc | Bin 0 -> 2907 bytes .../__pycache__/_typing.cpython-39.pyc | Bin 0 -> 1498 bytes .../__pycache__/markers.cpython-39.pyc | Bin 0 -> 9314 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 0 -> 4091 bytes .../__pycache__/specifiers.cpython-39.pyc | Bin 0 -> 20590 bytes .../packaging/__pycache__/tags.cpython-39.pyc | Bin 0 -> 17269 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 1660 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 13327 bytes .../_vendor/packaging/_compat.py | 38 + .../_vendor/packaging/_structures.py | 86 + .../_vendor/packaging/_typing.py | 48 + .../_vendor/packaging/markers.py | 328 + .../_vendor/packaging/requirements.py | 145 + .../_vendor/packaging/specifiers.py | 863 ++ .../pkg_resources/_vendor/packaging/tags.py | 751 ++ .../pkg_resources/_vendor/packaging/utils.py | 65 + .../_vendor/packaging/version.py | 535 ++ .../pkg_resources/_vendor/pyparsing.py | 5742 +++++++++++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2882 bytes .../__pycache__/setup.cpython-39.pyc | Bin 0 -> 321 bytes .../data/my-test-package-source/setup.py | 6 + .../setuptools-58.1.0.dist-info/INSTALLER | 1 + .../setuptools-58.1.0.dist-info/LICENSE | 19 + .../setuptools-58.1.0.dist-info/METADATA | 119 + .../setuptools-58.1.0.dist-info/RECORD | 296 + .../setuptools-58.1.0.dist-info/REQUESTED | 0 .../setuptools-58.1.0.dist-info/WHEEL | 5 + .../entry_points.txt | 56 + .../setuptools-58.1.0.dist-info/top_level.txt | 3 + .../Lib/site-packages/setuptools/__init__.py | 242 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 8542 bytes .../_deprecation_warning.cpython-39.pyc | Bin 0 -> 552 bytes .../__pycache__/_imp.cpython-39.pyc | Bin 0 -> 2087 bytes .../__pycache__/archive_util.cpython-39.pyc | Bin 0 -> 5816 bytes .../__pycache__/build_meta.cpython-39.pyc | Bin 0 -> 9075 bytes .../__pycache__/config.cpython-39.pyc | Bin 0 -> 20828 bytes .../__pycache__/dep_util.cpython-39.pyc | Bin 0 -> 859 bytes .../__pycache__/depends.cpython-39.pyc | Bin 0 -> 5251 bytes .../__pycache__/dist.cpython-39.pyc | Bin 0 -> 36449 bytes .../__pycache__/errors.cpython-39.pyc | Bin 0 -> 852 bytes .../__pycache__/extension.cpython-39.pyc | Bin 0 -> 1946 bytes .../__pycache__/glob.cpython-39.pyc | Bin 0 -> 3696 bytes .../__pycache__/installer.cpython-39.pyc | Bin 0 -> 2773 bytes .../__pycache__/launch.cpython-39.pyc | Bin 0 -> 903 bytes .../__pycache__/monkey.cpython-39.pyc | Bin 0 -> 4615 bytes .../__pycache__/msvc.cpython-39.pyc | Bin 0 -> 42841 bytes .../__pycache__/namespaces.cpython-39.pyc | Bin 0 -> 3602 bytes .../__pycache__/package_index.cpython-39.pyc | Bin 0 -> 32638 bytes .../__pycache__/py34compat.cpython-39.pyc | Bin 0 -> 482 bytes .../__pycache__/sandbox.cpython-39.pyc | Bin 0 -> 15758 bytes .../__pycache__/unicode_utils.cpython-39.pyc | Bin 0 -> 1116 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 326 bytes .../__pycache__/wheel.cpython-39.pyc | Bin 0 -> 7282 bytes .../windows_support.cpython-39.pyc | Bin 0 -> 1025 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 15 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 460 bytes .../__pycache__/_msvccompiler.cpython-39.pyc | Bin 0 -> 13815 bytes .../__pycache__/archive_util.cpython-39.pyc | Bin 0 -> 6647 bytes .../__pycache__/bcppcompiler.cpython-39.pyc | Bin 0 -> 6558 bytes .../__pycache__/ccompiler.cpython-39.pyc | Bin 0 -> 33426 bytes .../_distutils/__pycache__/cmd.cpython-39.pyc | Bin 0 -> 13986 bytes .../__pycache__/config.cpython-39.pyc | Bin 0 -> 3589 bytes .../__pycache__/core.cpython-39.pyc | Bin 0 -> 6714 bytes .../cygwinccompiler.cpython-39.pyc | Bin 0 -> 8794 bytes .../__pycache__/debug.cpython-39.pyc | Bin 0 -> 256 bytes .../__pycache__/dep_util.cpython-39.pyc | Bin 0 -> 2776 bytes .../__pycache__/dir_util.cpython-39.pyc | Bin 0 -> 5877 bytes .../__pycache__/dist.cpython-39.pyc | Bin 0 -> 34447 bytes .../__pycache__/errors.cpython-39.pyc | Bin 0 -> 5312 bytes .../__pycache__/extension.cpython-39.pyc | Bin 0 -> 6977 bytes .../__pycache__/fancy_getopt.cpython-39.pyc | Bin 0 -> 10685 bytes .../__pycache__/file_util.cpython-39.pyc | Bin 0 -> 6043 bytes .../__pycache__/filelist.cpython-39.pyc | Bin 0 -> 10835 bytes .../_distutils/__pycache__/log.cpython-39.pyc | Bin 0 -> 2375 bytes .../__pycache__/msvc9compiler.cpython-39.pyc | Bin 0 -> 17572 bytes .../__pycache__/msvccompiler.cpython-39.pyc | Bin 0 -> 14767 bytes .../__pycache__/py35compat.cpython-39.pyc | Bin 0 -> 632 bytes .../__pycache__/py38compat.cpython-39.pyc | Bin 0 -> 427 bytes .../__pycache__/spawn.cpython-39.pyc | Bin 0 -> 2903 bytes .../__pycache__/sysconfig.cpython-39.pyc | Bin 0 -> 12587 bytes .../__pycache__/text_file.cpython-39.pyc | Bin 0 -> 8501 bytes .../__pycache__/unixccompiler.cpython-39.pyc | Bin 0 -> 6877 bytes .../__pycache__/util.cpython-39.pyc | Bin 0 -> 14240 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 7401 bytes .../versionpredicate.cpython-39.pyc | Bin 0 -> 5185 bytes .../setuptools/_distutils/_msvccompiler.py | 561 ++ .../setuptools/_distutils/archive_util.py | 256 + .../setuptools/_distutils/bcppcompiler.py | 393 + .../setuptools/_distutils/ccompiler.py | 1123 +++ .../setuptools/_distutils/cmd.py | 403 + .../setuptools/_distutils/command/__init__.py | 31 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 535 bytes .../command/__pycache__/bdist.cpython-39.pyc | Bin 0 -> 3665 bytes .../__pycache__/bdist_dumb.cpython-39.pyc | Bin 0 -> 3648 bytes .../__pycache__/bdist_msi.cpython-39.pyc | Bin 0 -> 19830 bytes .../__pycache__/bdist_rpm.cpython-39.pyc | Bin 0 -> 12285 bytes .../__pycache__/bdist_wininst.cpython-39.pyc | Bin 0 -> 8605 bytes .../command/__pycache__/build.cpython-39.pyc | Bin 0 -> 3937 bytes .../__pycache__/build_clib.cpython-39.pyc | Bin 0 -> 4860 bytes .../__pycache__/build_ext.cpython-39.pyc | Bin 0 -> 16272 bytes .../__pycache__/build_py.cpython-39.pyc | Bin 0 -> 9855 bytes .../__pycache__/build_scripts.cpython-39.pyc | Bin 0 -> 4020 bytes .../command/__pycache__/check.cpython-39.pyc | Bin 0 -> 4969 bytes .../command/__pycache__/clean.cpython-39.pyc | Bin 0 -> 2142 bytes .../command/__pycache__/config.cpython-39.pyc | Bin 0 -> 10272 bytes .../__pycache__/install.cpython-39.pyc | Bin 0 -> 13884 bytes .../__pycache__/install_data.cpython-39.pyc | Bin 0 -> 2345 bytes .../install_egg_info.cpython-39.pyc | Bin 0 -> 3080 bytes .../install_headers.cpython-39.pyc | Bin 0 -> 1770 bytes .../__pycache__/install_lib.cpython-39.pyc | Bin 0 -> 5142 bytes .../install_scripts.cpython-39.pyc | Bin 0 -> 2193 bytes .../__pycache__/py37compat.cpython-39.pyc | Bin 0 -> 1036 bytes .../__pycache__/register.cpython-39.pyc | Bin 0 -> 8513 bytes .../command/__pycache__/sdist.cpython-39.pyc | Bin 0 -> 14540 bytes .../command/__pycache__/upload.cpython-39.pyc | Bin 0 -> 5263 bytes .../setuptools/_distutils/command/bdist.py | 143 + .../_distutils/command/bdist_dumb.py | 123 + .../_distutils/command/bdist_msi.py | 749 ++ .../_distutils/command/bdist_rpm.py | 579 ++ .../_distutils/command/bdist_wininst.py | 377 + .../setuptools/_distutils/command/build.py | 157 + .../_distutils/command/build_clib.py | 209 + .../_distutils/command/build_ext.py | 757 ++ .../setuptools/_distutils/command/build_py.py | 392 + .../_distutils/command/build_scripts.py | 152 + .../setuptools/_distutils/command/check.py | 148 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 344 + .../setuptools/_distutils/command/install.py | 678 ++ .../_distutils/command/install_data.py | 79 + .../_distutils/command/install_egg_info.py | 77 + .../_distutils/command/install_headers.py | 47 + .../_distutils/command/install_lib.py | 217 + .../_distutils/command/install_scripts.py | 60 + .../_distutils/command/py37compat.py | 30 + .../setuptools/_distutils/command/register.py | 304 + .../setuptools/_distutils/command/sdist.py | 494 + .../setuptools/_distutils/command/upload.py | 214 + .../setuptools/_distutils/config.py | 130 + .../setuptools/_distutils/core.py | 234 + .../setuptools/_distutils/cygwinccompiler.py | 414 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 92 + .../setuptools/_distutils/dir_util.py | 210 + .../setuptools/_distutils/dist.py | 1257 +++ .../setuptools/_distutils/errors.py | 97 + .../setuptools/_distutils/extension.py | 240 + .../setuptools/_distutils/fancy_getopt.py | 457 + .../setuptools/_distutils/file_util.py | 238 + .../setuptools/_distutils/filelist.py | 355 + .../setuptools/_distutils/log.py | 77 + .../setuptools/_distutils/msvc9compiler.py | 788 ++ .../setuptools/_distutils/msvccompiler.py | 643 ++ .../setuptools/_distutils/py35compat.py | 19 + .../setuptools/_distutils/py38compat.py | 7 + .../setuptools/_distutils/spawn.py | 106 + .../setuptools/_distutils/sysconfig.py | 578 ++ .../setuptools/_distutils/text_file.py | 286 + .../setuptools/_distutils/unixccompiler.py | 332 + .../setuptools/_distutils/util.py | 535 ++ .../setuptools/_distutils/version.py | 347 + .../setuptools/_distutils/versionpredicate.py | 166 + .../Lib/site-packages/setuptools/_imp.py | 82 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 190 bytes .../__pycache__/ordered_set.cpython-39.pyc | Bin 0 -> 16384 bytes .../__pycache__/pyparsing.cpython-39.pyc | Bin 0 -> 201344 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 271 bytes .../__pycache__/more.cpython-39.pyc | Bin 0 -> 110016 bytes .../__pycache__/recipes.cpython-39.pyc | Bin 0 -> 17936 bytes .../setuptools/_vendor/more_itertools/more.py | 3825 ++++++++ .../_vendor/more_itertools/recipes.py | 620 ++ .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-39.pyc | Bin 0 -> 706 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 552 bytes .../__pycache__/_compat.cpython-39.pyc | Bin 0 -> 1150 bytes .../__pycache__/_structures.cpython-39.pyc | Bin 0 -> 2904 bytes .../__pycache__/_typing.cpython-39.pyc | Bin 0 -> 1495 bytes .../__pycache__/markers.cpython-39.pyc | Bin 0 -> 9308 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 0 -> 4085 bytes .../__pycache__/specifiers.cpython-39.pyc | Bin 0 -> 20587 bytes .../packaging/__pycache__/tags.cpython-39.pyc | Bin 0 -> 17266 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 1657 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 13324 bytes .../setuptools/_vendor/packaging/_compat.py | 38 + .../_vendor/packaging/_structures.py | 86 + .../setuptools/_vendor/packaging/_typing.py | 48 + .../setuptools/_vendor/packaging/markers.py | 328 + .../_vendor/packaging/requirements.py | 145 + .../_vendor/packaging/specifiers.py | 863 ++ .../setuptools/_vendor/packaging/tags.py | 751 ++ .../setuptools/_vendor/packaging/utils.py | 65 + .../setuptools/_vendor/packaging/version.py | 535 ++ .../setuptools/_vendor/pyparsing.py | 5742 +++++++++++ .../site-packages/setuptools/archive_util.py | 205 + .../site-packages/setuptools/build_meta.py | 281 + .../Lib/site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../Lib/site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 8 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 379 bytes .../command/__pycache__/alias.cpython-39.pyc | Bin 0 -> 2373 bytes .../__pycache__/bdist_egg.cpython-39.pyc | Bin 0 -> 13039 bytes .../__pycache__/bdist_rpm.cpython-39.pyc | Bin 0 -> 1586 bytes .../__pycache__/build_clib.cpython-39.pyc | Bin 0 -> 2470 bytes .../__pycache__/build_ext.cpython-39.pyc | Bin 0 -> 9829 bytes .../__pycache__/build_py.cpython-39.pyc | Bin 0 -> 7820 bytes .../__pycache__/develop.cpython-39.pyc | Bin 0 -> 6139 bytes .../__pycache__/dist_info.cpython-39.pyc | Bin 0 -> 1397 bytes .../__pycache__/easy_install.cpython-39.pyc | Bin 0 -> 63590 bytes .../__pycache__/egg_info.cpython-39.pyc | Bin 0 -> 21980 bytes .../__pycache__/install.cpython-39.pyc | Bin 0 -> 4038 bytes .../install_egg_info.cpython-39.pyc | Bin 0 -> 2429 bytes .../__pycache__/install_lib.cpython-39.pyc | Bin 0 -> 4136 bytes .../install_scripts.cpython-39.pyc | Bin 0 -> 2424 bytes .../__pycache__/py36compat.cpython-39.pyc | Bin 0 -> 4591 bytes .../__pycache__/register.cpython-39.pyc | Bin 0 -> 847 bytes .../command/__pycache__/rotate.cpython-39.pyc | Bin 0 -> 2506 bytes .../__pycache__/saveopts.cpython-39.pyc | Bin 0 -> 925 bytes .../command/__pycache__/sdist.cpython-39.pyc | Bin 0 -> 6466 bytes .../command/__pycache__/setopt.cpython-39.pyc | Bin 0 -> 4676 bytes .../command/__pycache__/test.cpython-39.pyc | Bin 0 -> 8031 bytes .../command/__pycache__/upload.cpython-39.pyc | Bin 0 -> 820 bytes .../__pycache__/upload_docs.cpython-39.pyc | Bin 0 -> 6163 bytes .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 456 + .../setuptools/command/bdist_rpm.py | 40 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 232 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2290 +++++ .../setuptools/command/egg_info.py | 734 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 69 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 189 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 252 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 202 + .../Lib/site-packages/setuptools/config.py | 749 ++ .../Lib/site-packages/setuptools/dep_util.py | 25 + .../Lib/site-packages/setuptools/depends.py | 175 + .../Lib/site-packages/setuptools/dist.py | 1150 +++ .../Lib/site-packages/setuptools/errors.py | 16 + .../Lib/site-packages/setuptools/extension.py | 55 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2921 bytes .../Lib/site-packages/setuptools/glob.py | 167 + .../Lib/site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../Lib/site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/installer.py | 97 + .../Lib/site-packages/setuptools/launch.py | 36 + .../Lib/site-packages/setuptools/monkey.py | 177 + .../Lib/site-packages/setuptools/msvc.py | 1805 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1119 +++ .../site-packages/setuptools/py34compat.py | 13 + .../Lib/site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../Lib/site-packages/setuptools/version.py | 6 + .../Lib/site-packages/setuptools/wheel.py | 213 + .../setuptools/windows_support.py | 29 + .../Lib/site-packages/sqlalchemy/__init__.py | 285 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 9018 bytes .../__pycache__/events.cpython-39.pyc | Bin 0 -> 543 bytes .../sqlalchemy/__pycache__/exc.cpython-39.pyc | Bin 0 -> 24632 bytes .../__pycache__/inspection.cpython-39.pyc | Bin 0 -> 5789 bytes .../sqlalchemy/__pycache__/log.cpython-39.pyc | Bin 0 -> 8328 bytes .../__pycache__/schema.cpython-39.pyc | Bin 0 -> 2264 bytes .../__pycache__/types.cpython-39.pyc | Bin 0 -> 2212 bytes .../sqlalchemy/connectors/__init__.py | 18 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 567 bytes .../__pycache__/pyodbc.cpython-39.pyc | Bin 0 -> 6625 bytes .../sqlalchemy/connectors/pyodbc.py | 247 + .../sqlalchemy/cyextension/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 194 bytes .../collections.cp39-win_amd64.pyd | Bin 0 -> 174080 bytes .../sqlalchemy/cyextension/collections.pyx | 403 + .../immutabledict.cp39-win_amd64.pyd | Bin 0 -> 73728 bytes .../sqlalchemy/cyextension/immutabledict.pxd | 2 + .../sqlalchemy/cyextension/immutabledict.pyx | 127 + .../cyextension/processors.cp39-win_amd64.pyd | Bin 0 -> 59904 bytes .../sqlalchemy/cyextension/processors.pyx | 62 + .../resultproxy.cp39-win_amd64.pyd | Bin 0 -> 61952 bytes .../sqlalchemy/cyextension/resultproxy.pyx | 96 + .../cyextension/util.cp39-win_amd64.pyd | Bin 0 -> 73728 bytes .../sqlalchemy/cyextension/util.pyx | 85 + .../sqlalchemy/dialects/__init__.py | 61 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1382 bytes .../__pycache__/_typing.cpython-39.pyc | Bin 0 -> 786 bytes .../sqlalchemy/dialects/_typing.py | 19 + .../sqlalchemy/dialects/mssql/__init__.py | 87 + .../mssql/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1543 bytes .../mssql/__pycache__/base.cpython-39.pyc | Bin 0 -> 111717 bytes .../information_schema.cpython-39.pyc | Bin 0 -> 5765 bytes .../mssql/__pycache__/json.cpython-39.pyc | Bin 0 -> 4763 bytes .../__pycache__/provision.cpython-39.pyc | Bin 0 -> 4278 bytes .../mssql/__pycache__/pymssql.cpython-39.pyc | Bin 0 -> 4469 bytes .../mssql/__pycache__/pyodbc.cpython-39.pyc | Bin 0 -> 25808 bytes .../sqlalchemy/dialects/mssql/base.py | 4054 ++++++++ .../dialects/mssql/information_schema.py | 253 + .../sqlalchemy/dialects/mssql/json.py | 127 + .../sqlalchemy/dialects/mssql/provision.py | 146 + .../sqlalchemy/dialects/mssql/pymssql.py | 125 + .../sqlalchemy/dialects/mssql/pyodbc.py | 740 ++ .../sqlalchemy/dialects/mysql/__init__.py | 101 + .../mysql/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1857 bytes .../mysql/__pycache__/aiomysql.cpython-39.pyc | Bin 0 -> 11292 bytes .../mysql/__pycache__/asyncmy.cpython-39.pyc | Bin 0 -> 11133 bytes .../mysql/__pycache__/base.cpython-39.pyc | Bin 0 -> 100828 bytes .../mysql/__pycache__/cymysql.cpython-39.pyc | Bin 0 -> 2596 bytes .../mysql/__pycache__/dml.cpython-39.pyc | Bin 0 -> 7353 bytes .../__pycache__/enumerated.cpython-39.pyc | Bin 0 -> 7968 bytes .../__pycache__/expression.cpython-39.pyc | Bin 0 -> 3943 bytes .../mysql/__pycache__/json.cpython-39.pyc | Bin 0 -> 2923 bytes .../mysql/__pycache__/mariadb.cpython-39.pyc | Bin 0 -> 847 bytes .../mariadbconnector.cpython-39.pyc | Bin 0 -> 8470 bytes .../__pycache__/mysqlconnector.cpython-39.pyc | Bin 0 -> 6380 bytes .../mysql/__pycache__/mysqldb.cpython-39.pyc | Bin 0 -> 8955 bytes .../__pycache__/provision.cpython-39.pyc | Bin 0 -> 2561 bytes .../mysql/__pycache__/pymysql.cpython-39.pyc | Bin 0 -> 3199 bytes .../mysql/__pycache__/pyodbc.cpython-39.pyc | Bin 0 -> 4293 bytes .../__pycache__/reflection.cpython-39.pyc | Bin 0 -> 15492 bytes .../__pycache__/reserved_words.cpython-39.pyc | Bin 0 -> 4317 bytes .../mysql/__pycache__/types.cpython-39.pyc | Bin 0 -> 26490 bytes .../sqlalchemy/dialects/mysql/aiomysql.py | 317 + .../sqlalchemy/dialects/mysql/asyncmy.py | 324 + .../sqlalchemy/dialects/mysql/base.py | 3406 +++++++ .../sqlalchemy/dialects/mysql/cymysql.py | 84 + .../sqlalchemy/dialects/mysql/dml.py | 219 + .../sqlalchemy/dialects/mysql/enumerated.py | 244 + .../sqlalchemy/dialects/mysql/expression.py | 140 + .../sqlalchemy/dialects/mysql/json.py | 81 + .../sqlalchemy/dialects/mysql/mariadb.py | 32 + .../dialects/mysql/mariadbconnector.py | 280 + .../dialects/mysql/mysqlconnector.py | 179 + .../sqlalchemy/dialects/mysql/mysqldb.py | 308 + .../sqlalchemy/dialects/mysql/provision.py | 101 + .../sqlalchemy/dialects/mysql/pymysql.py | 101 + .../sqlalchemy/dialects/mysql/pyodbc.py | 138 + .../sqlalchemy/dialects/mysql/reflection.py | 672 ++ .../dialects/mysql/reserved_words.py | 567 ++ .../sqlalchemy/dialects/mysql/types.py | 773 ++ .../sqlalchemy/dialects/oracle/__init__.py | 63 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1099 bytes .../oracle/__pycache__/base.cpython-39.pyc | Bin 0 -> 82693 bytes .../__pycache__/cx_oracle.cpython-39.pyc | Bin 0 -> 45764 bytes .../__pycache__/dictionary.cpython-39.pyc | Bin 0 -> 11217 bytes .../__pycache__/oracledb.cpython-39.pyc | Bin 0 -> 3645 bytes .../__pycache__/provision.cpython-39.pyc | Bin 0 -> 6664 bytes .../oracle/__pycache__/types.cpython-39.pyc | Bin 0 -> 8830 bytes .../sqlalchemy/dialects/oracle/base.py | 3232 +++++++ .../sqlalchemy/dialects/oracle/cx_oracle.py | 1484 +++ .../sqlalchemy/dialects/oracle/dictionary.py | 506 + .../sqlalchemy/dialects/oracle/oracledb.py | 109 + .../sqlalchemy/dialects/oracle/provision.py | 214 + .../sqlalchemy/dialects/oracle/types.py | 257 + .../dialects/postgresql/__init__.py | 163 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3146 bytes .../_psycopg_common.cpython-39.pyc | Bin 0 -> 5723 bytes .../__pycache__/array.cpython-39.pyc | Bin 0 -> 13390 bytes .../__pycache__/asyncpg.cpython-39.pyc | Bin 0 -> 40514 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 133808 bytes .../postgresql/__pycache__/dml.cpython-39.pyc | Bin 0 -> 9758 bytes .../postgresql/__pycache__/ext.cpython-39.pyc | Bin 0 -> 16028 bytes .../__pycache__/hstore.cpython-39.pyc | Bin 0 -> 12214 bytes .../__pycache__/json.cpython-39.pyc | Bin 0 -> 11483 bytes .../__pycache__/named_types.cpython-39.pyc | Bin 0 -> 17760 bytes .../__pycache__/operators.cpython-39.pyc | Bin 0 -> 1236 bytes .../__pycache__/pg8000.cpython-39.pyc | Bin 0 -> 21476 bytes .../__pycache__/pg_catalog.cpython-39.pyc | Bin 0 -> 6539 bytes .../__pycache__/provision.cpython-39.pyc | Bin 0 -> 4907 bytes .../__pycache__/psycopg.cpython-39.pyc | Bin 0 -> 25365 bytes .../__pycache__/psycopg2.cpython-39.pyc | Bin 0 -> 30702 bytes .../__pycache__/psycopg2cffi.cpython-39.pyc | Bin 0 -> 1854 bytes .../__pycache__/ranges.cpython-39.pyc | Bin 0 -> 21940 bytes .../__pycache__/types.cpython-39.pyc | Bin 0 -> 8649 bytes .../dialects/postgresql/_psycopg_common.py | 186 + .../sqlalchemy/dialects/postgresql/array.py | 426 + .../sqlalchemy/dialects/postgresql/asyncpg.py | 1255 +++ .../sqlalchemy/dialects/postgresql/base.py | 4890 ++++++++++ .../sqlalchemy/dialects/postgresql/dml.py | 310 + .../sqlalchemy/dialects/postgresql/ext.py | 496 + .../sqlalchemy/dialects/postgresql/hstore.py | 397 + .../sqlalchemy/dialects/postgresql/json.py | 325 + .../dialects/postgresql/named_types.py | 496 + .../dialects/postgresql/operators.py | 129 + .../sqlalchemy/dialects/postgresql/pg8000.py | 664 ++ .../dialects/postgresql/pg_catalog.py | 294 + .../dialects/postgresql/provision.py | 169 + .../sqlalchemy/dialects/postgresql/psycopg.py | 746 ++ .../dialects/postgresql/psycopg2.py | 876 ++ .../dialects/postgresql/psycopg2cffi.py | 61 + .../sqlalchemy/dialects/postgresql/ranges.py | 946 ++ .../sqlalchemy/dialects/postgresql/types.py | 302 + .../sqlalchemy/dialects/sqlite/__init__.py | 57 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 983 bytes .../__pycache__/aiosqlite.cpython-39.pyc | Bin 0 -> 11273 bytes .../sqlite/__pycache__/base.cpython-39.pyc | Bin 0 -> 77349 bytes .../sqlite/__pycache__/dml.cpython-39.pyc | Bin 0 -> 8163 bytes .../sqlite/__pycache__/json.cpython-39.pyc | Bin 0 -> 3254 bytes .../__pycache__/provision.cpython-39.pyc | Bin 0 -> 4720 bytes .../__pycache__/pysqlcipher.cpython-39.pyc | Bin 0 -> 5445 bytes .../__pycache__/pysqlite.cpython-39.pyc | Bin 0 -> 28255 bytes .../sqlalchemy/dialects/sqlite/aiosqlite.py | 361 + .../sqlalchemy/dialects/sqlite/base.py | 2781 ++++++ .../sqlalchemy/dialects/sqlite/dml.py | 240 + .../sqlalchemy/dialects/sqlite/json.py | 86 + .../sqlalchemy/dialects/sqlite/provision.py | 192 + .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 155 + .../sqlalchemy/dialects/sqlite/pysqlite.py | 753 ++ .../dialects/type_migration_guidelines.txt | 145 + .../sqlalchemy/engine/__init__.py | 62 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2221 bytes .../__pycache__/_py_processors.cpython-39.pyc | Bin 0 -> 3393 bytes .../engine/__pycache__/_py_row.cpython-39.pyc | Bin 0 -> 4189 bytes .../__pycache__/_py_util.cpython-39.pyc | Bin 0 -> 1506 bytes .../engine/__pycache__/base.cpython-39.pyc | Bin 0 -> 96624 bytes .../characteristics.cpython-39.pyc | Bin 0 -> 3128 bytes .../engine/__pycache__/create.cpython-39.pyc | Bin 0 -> 28941 bytes .../engine/__pycache__/cursor.cpython-39.pyc | Bin 0 -> 59088 bytes .../engine/__pycache__/default.cpython-39.pyc | Bin 0 -> 58738 bytes .../engine/__pycache__/events.cpython-39.pyc | Bin 0 -> 37184 bytes .../__pycache__/interfaces.cpython-39.pyc | Bin 0 -> 90592 bytes .../engine/__pycache__/mock.cpython-39.pyc | Bin 0 -> 4824 bytes .../__pycache__/processors.cpython-39.pyc | Bin 0 -> 1155 bytes .../__pycache__/reflection.cpython-39.pyc | Bin 0 -> 61582 bytes .../engine/__pycache__/result.cpython-39.pyc | Bin 0 -> 74944 bytes .../engine/__pycache__/row.cpython-39.pyc | Bin 0 -> 14825 bytes .../__pycache__/strategies.cpython-39.pyc | Bin 0 -> 527 bytes .../engine/__pycache__/url.cpython-39.pyc | Bin 0 -> 26685 bytes .../engine/__pycache__/util.cpython-39.pyc | Bin 0 -> 5074 bytes .../sqlalchemy/engine/_py_processors.py | 136 + .../sqlalchemy/engine/_py_row.py | 122 + .../sqlalchemy/engine/_py_util.py | 68 + .../site-packages/sqlalchemy/engine/base.py | 3365 +++++++ .../sqlalchemy/engine/characteristics.py | 75 + .../site-packages/sqlalchemy/engine/create.py | 860 ++ .../site-packages/sqlalchemy/engine/cursor.py | 2149 +++++ .../sqlalchemy/engine/default.py | 2323 +++++ .../site-packages/sqlalchemy/engine/events.py | 951 ++ .../sqlalchemy/engine/interfaces.py | 3406 +++++++ .../site-packages/sqlalchemy/engine/mock.py | 131 + .../sqlalchemy/engine/processors.py | 61 + .../sqlalchemy/engine/reflection.py | 2089 ++++ .../site-packages/sqlalchemy/engine/result.py | 2405 +++++ .../site-packages/sqlalchemy/engine/row.py | 405 + .../sqlalchemy/engine/strategies.py | 19 + .../site-packages/sqlalchemy/engine/url.py | 913 ++ .../site-packages/sqlalchemy/engine/util.py | 166 + .../sqlalchemy/event/__init__.py | 25 + .../event/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 815 bytes .../event/__pycache__/api.cpython-39.pyc | Bin 0 -> 8418 bytes .../event/__pycache__/attr.cpython-39.pyc | Bin 0 -> 22962 bytes .../event/__pycache__/base.cpython-39.pyc | Bin 0 -> 14437 bytes .../event/__pycache__/legacy.cpython-39.pyc | Bin 0 -> 6763 bytes .../event/__pycache__/registry.cpython-39.pyc | Bin 0 -> 8013 bytes .../Lib/site-packages/sqlalchemy/event/api.py | 225 + .../site-packages/sqlalchemy/event/attr.py | 641 ++ .../site-packages/sqlalchemy/event/base.py | 465 + .../site-packages/sqlalchemy/event/legacy.py | 246 + .../sqlalchemy/event/registry.py | 386 + .../Lib/site-packages/sqlalchemy/events.py | 17 + .../Lib/site-packages/sqlalchemy/exc.py | 833 ++ .../site-packages/sqlalchemy/ext/__init__.py | 11 + .../ext/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 281 bytes .../associationproxy.cpython-39.pyc | Bin 0 -> 62469 bytes .../ext/__pycache__/automap.cpython-39.pyc | Bin 0 -> 50206 bytes .../ext/__pycache__/baked.cpython-39.pyc | Bin 0 -> 17105 bytes .../ext/__pycache__/compiler.cpython-39.pyc | Bin 0 -> 19485 bytes .../horizontal_shard.cpython-39.pyc | Bin 0 -> 13931 bytes .../ext/__pycache__/hybrid.cpython-39.pyc | Bin 0 -> 54324 bytes .../ext/__pycache__/indexable.cpython-39.pyc | Bin 0 -> 10749 bytes .../instrumentation.cpython-39.pyc | Bin 0 -> 14794 bytes .../ext/__pycache__/mutable.cpython-39.pyc | Bin 0 -> 38515 bytes .../__pycache__/orderinglist.cpython-39.pyc | Bin 0 -> 14720 bytes .../ext/__pycache__/serializer.cpython-39.pyc | Bin 0 -> 5310 bytes .../sqlalchemy/ext/associationproxy.py | 2028 ++++ .../sqlalchemy/ext/asyncio/__init__.py | 24 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 908 bytes .../asyncio/__pycache__/base.cpython-39.pyc | Bin 0 -> 8099 bytes .../asyncio/__pycache__/engine.cpython-39.pyc | Bin 0 -> 44800 bytes .../asyncio/__pycache__/exc.cpython-39.pyc | Bin 0 -> 893 bytes .../asyncio/__pycache__/result.cpython-39.pyc | Bin 0 -> 31621 bytes .../__pycache__/scoping.cpython-39.pyc | Bin 0 -> 47767 bytes .../__pycache__/session.cpython-39.pyc | Bin 0 -> 57668 bytes .../sqlalchemy/ext/asyncio/base.py | 283 + .../sqlalchemy/ext/asyncio/engine.py | 1468 +++ .../sqlalchemy/ext/asyncio/exc.py | 21 + .../sqlalchemy/ext/asyncio/result.py | 976 ++ .../sqlalchemy/ext/asyncio/scoping.py | 1617 ++++ .../sqlalchemy/ext/asyncio/session.py | 1914 ++++ .../site-packages/sqlalchemy/ext/automap.py | 1658 ++++ .../Lib/site-packages/sqlalchemy/ext/baked.py | 574 ++ .../site-packages/sqlalchemy/ext/compiler.py | 555 ++ .../sqlalchemy/ext/declarative/__init__.py | 65 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1653 bytes .../__pycache__/extensions.cpython-39.pyc | Bin 0 -> 17130 bytes .../sqlalchemy/ext/declarative/extensions.py | 548 ++ .../sqlalchemy/ext/horizontal_shard.py | 483 + .../site-packages/sqlalchemy/ext/hybrid.py | 1524 +++ .../site-packages/sqlalchemy/ext/indexable.py | 341 + .../sqlalchemy/ext/instrumentation.py | 452 + .../site-packages/sqlalchemy/ext/mutable.py | 1078 +++ .../sqlalchemy/ext/mypy/__init__.py | 0 .../mypy/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 191 bytes .../ext/mypy/__pycache__/apply.cpython-39.pyc | Bin 0 -> 6157 bytes .../__pycache__/decl_class.cpython-39.pyc | Bin 0 -> 8197 bytes .../ext/mypy/__pycache__/infer.cpython-39.pyc | Bin 0 -> 9240 bytes .../ext/mypy/__pycache__/names.cpython-39.pyc | Bin 0 -> 6855 bytes .../mypy/__pycache__/plugin.cpython-39.pyc | Bin 0 -> 7802 bytes .../ext/mypy/__pycache__/util.cpython-39.pyc | Bin 0 -> 9185 bytes .../sqlalchemy/ext/mypy/apply.py | 318 + .../sqlalchemy/ext/mypy/decl_class.py | 515 + .../sqlalchemy/ext/mypy/infer.py | 590 ++ .../sqlalchemy/ext/mypy/names.py | 342 + .../sqlalchemy/ext/mypy/plugin.py | 303 + .../site-packages/sqlalchemy/ext/mypy/util.py | 338 + .../sqlalchemy/ext/orderinglist.py | 416 + .../sqlalchemy/ext/serializer.py | 185 + .../sqlalchemy/future/__init__.py | 16 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 448 bytes .../future/__pycache__/engine.cpython-39.pyc | Bin 0 -> 382 bytes .../site-packages/sqlalchemy/future/engine.py | 15 + .../site-packages/sqlalchemy/inspection.py | 181 + .../Lib/site-packages/sqlalchemy/log.py | 290 + .../site-packages/sqlalchemy/orm/__init__.py | 170 + .../orm/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 6025 bytes .../_orm_constructors.cpython-39.pyc | Bin 0 -> 93157 bytes .../orm/__pycache__/_typing.cpython-39.pyc | Bin 0 -> 5558 bytes .../orm/__pycache__/attributes.cpython-39.pyc | Bin 0 -> 66958 bytes .../orm/__pycache__/base.cpython-39.pyc | Bin 0 -> 24637 bytes .../bulk_persistence.cpython-39.pyc | Bin 0 -> 41211 bytes .../__pycache__/clsregistry.cpython-39.pyc | Bin 0 -> 16049 bytes .../__pycache__/collections.cpython-39.pyc | Bin 0 -> 47005 bytes .../orm/__pycache__/context.cpython-39.pyc | Bin 0 -> 61615 bytes .../orm/__pycache__/decl_api.cpython-39.pyc | Bin 0 -> 55429 bytes .../orm/__pycache__/decl_base.cpython-39.pyc | Bin 0 -> 43995 bytes .../orm/__pycache__/dependency.cpython-39.pyc | Bin 0 -> 23654 bytes .../descriptor_props.cpython-39.pyc | Bin 0 -> 33220 bytes .../orm/__pycache__/dynamic.cpython-39.pyc | Bin 0 -> 9306 bytes .../orm/__pycache__/evaluator.cpython-39.pyc | Bin 0 -> 12216 bytes .../orm/__pycache__/events.cpython-39.pyc | Bin 0 -> 126029 bytes .../orm/__pycache__/exc.cpython-39.pyc | Bin 0 -> 7678 bytes .../orm/__pycache__/identity.cpython-39.pyc | Bin 0 -> 9149 bytes .../instrumentation.cpython-39.pyc | Bin 0 -> 22220 bytes .../orm/__pycache__/interfaces.cpython-39.pyc | Bin 0 -> 44953 bytes .../orm/__pycache__/loading.cpython-39.pyc | Bin 0 -> 29375 bytes .../mapped_collection.cpython-39.pyc | Bin 0 -> 17913 bytes .../orm/__pycache__/mapper.cpython-39.pyc | Bin 0 -> 118403 bytes .../__pycache__/path_registry.cpython-39.pyc | Bin 0 -> 21599 bytes .../__pycache__/persistence.cpython-39.pyc | Bin 0 -> 27720 bytes .../orm/__pycache__/properties.cpython-39.pyc | Bin 0 -> 21605 bytes .../orm/__pycache__/query.cpython-39.pyc | Bin 0 -> 104904 bytes .../__pycache__/relationships.cpython-39.pyc | Bin 0 -> 83636 bytes .../orm/__pycache__/scoping.cpython-39.pyc | Bin 0 -> 74947 bytes .../orm/__pycache__/session.cpython-39.pyc | Bin 0 -> 152903 bytes .../orm/__pycache__/state.cpython-39.pyc | Bin 0 -> 32929 bytes .../__pycache__/state_changes.cpython-39.pyc | Bin 0 -> 4937 bytes .../orm/__pycache__/strategies.cpython-39.pyc | Bin 0 -> 59449 bytes .../strategy_options.cpython-39.pyc | Bin 0 -> 63749 bytes .../orm/__pycache__/sync.cpython-39.pyc | Bin 0 -> 3924 bytes .../orm/__pycache__/unitofwork.cpython-39.pyc | Bin 0 -> 21310 bytes .../orm/__pycache__/util.cpython-39.pyc | Bin 0 -> 60343 bytes .../orm/__pycache__/writeonly.cpython-39.pyc | Bin 0 -> 19211 bytes .../sqlalchemy/orm/_orm_constructors.py | 2483 +++++ .../site-packages/sqlalchemy/orm/_typing.py | 184 + .../sqlalchemy/orm/attributes.py | 2842 ++++++ .../Lib/site-packages/sqlalchemy/orm/base.py | 995 ++ .../sqlalchemy/orm/bulk_persistence.py | 2048 ++++ .../sqlalchemy/orm/clsregistry.py | 572 ++ .../sqlalchemy/orm/collections.py | 1619 ++++ .../site-packages/sqlalchemy/orm/context.py | 3227 +++++++ .../site-packages/sqlalchemy/orm/decl_api.py | 1886 ++++ .../site-packages/sqlalchemy/orm/decl_base.py | 2147 +++++ .../sqlalchemy/orm/dependency.py | 1302 +++ .../sqlalchemy/orm/descriptor_props.py | 1074 +++ .../site-packages/sqlalchemy/orm/dynamic.py | 299 + .../site-packages/sqlalchemy/orm/evaluator.py | 368 + .../site-packages/sqlalchemy/orm/events.py | 3248 +++++++ .../Lib/site-packages/sqlalchemy/orm/exc.py | 227 + .../site-packages/sqlalchemy/orm/identity.py | 302 + .../sqlalchemy/orm/instrumentation.py | 756 ++ .../sqlalchemy/orm/interfaces.py | 1465 +++ .../site-packages/sqlalchemy/orm/loading.py | 1661 ++++ .../sqlalchemy/orm/mapped_collection.py | 562 ++ .../site-packages/sqlalchemy/orm/mapper.py | 4416 +++++++++ .../sqlalchemy/orm/path_registry.py | 819 ++ .../sqlalchemy/orm/persistence.py | 1755 ++++ .../sqlalchemy/orm/properties.py | 879 ++ .../Lib/site-packages/sqlalchemy/orm/query.py | 3414 +++++++ .../sqlalchemy/orm/relationships.py | 3466 +++++++ .../site-packages/sqlalchemy/orm/scoping.py | 2182 +++++ .../site-packages/sqlalchemy/orm/session.py | 5254 ++++++++++ .../Lib/site-packages/sqlalchemy/orm/state.py | 1138 +++ .../sqlalchemy/orm/state_changes.py | 198 + .../sqlalchemy/orm/strategies.py | 3337 +++++++ .../sqlalchemy/orm/strategy_options.py | 2505 +++++ .../Lib/site-packages/sqlalchemy/orm/sync.py | 163 + .../sqlalchemy/orm/unitofwork.py | 796 ++ .../Lib/site-packages/sqlalchemy/orm/util.py | 2404 +++++ .../site-packages/sqlalchemy/orm/writeonly.py | 681 ++ .../site-packages/sqlalchemy/pool/__init__.py | 44 + .../pool/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1476 bytes .../pool/__pycache__/base.cpython-39.pyc | Bin 0 -> 40787 bytes .../pool/__pycache__/events.cpython-39.pyc | Bin 0 -> 13069 bytes .../pool/__pycache__/impl.cpython-39.pyc | Bin 0 -> 17448 bytes .../Lib/site-packages/sqlalchemy/pool/base.py | 1521 +++ .../site-packages/sqlalchemy/pool/events.py | 370 + .../Lib/site-packages/sqlalchemy/pool/impl.py | 552 ++ .../Lib/site-packages/sqlalchemy/py.typed | 0 .../Lib/site-packages/sqlalchemy/schema.py | 70 + .../site-packages/sqlalchemy/sql/__init__.py | 145 + .../sql/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 4259 bytes .../_dml_constructors.cpython-39.pyc | Bin 0 -> 3984 bytes .../_elements_constructors.cpython-39.pyc | Bin 0 -> 63001 bytes .../sql/__pycache__/_orm_types.cpython-39.pyc | Bin 0 -> 590 bytes .../sql/__pycache__/_py_util.cpython-39.pyc | Bin 0 -> 2433 bytes .../_selectable_constructors.cpython-39.pyc | Bin 0 -> 18753 bytes .../sql/__pycache__/_typing.cpython-39.pyc | Bin 0 -> 10955 bytes .../sql/__pycache__/annotation.cpython-39.pyc | Bin 0 -> 14719 bytes .../sql/__pycache__/base.cpython-39.pyc | Bin 0 -> 75376 bytes .../sql/__pycache__/cache_key.cpython-39.pyc | Bin 0 -> 25709 bytes .../sql/__pycache__/coercions.cpython-39.pyc | Bin 0 -> 33454 bytes .../sql/__pycache__/compiler.cpython-39.pyc | Bin 0 -> 171804 bytes .../sql/__pycache__/crud.cpython-39.pyc | Bin 0 -> 26053 bytes .../sql/__pycache__/ddl.cpython-39.pyc | Bin 0 -> 43938 bytes .../default_comparator.cpython-39.pyc | Bin 0 -> 9764 bytes .../sql/__pycache__/dml.cpython-39.pyc | Bin 0 -> 59692 bytes .../sql/__pycache__/elements.cpython-39.pyc | Bin 0 -> 151281 bytes .../sql/__pycache__/events.cpython-39.pyc | Bin 0 -> 18838 bytes .../sql/__pycache__/expression.cpython-39.pyc | Bin 0 -> 4979 bytes .../sql/__pycache__/functions.cpython-39.pyc | Bin 0 -> 58442 bytes .../sql/__pycache__/lambdas.cpython-39.pyc | Bin 0 -> 38525 bytes .../sql/__pycache__/naming.cpython-39.pyc | Bin 0 -> 5279 bytes .../sql/__pycache__/operators.cpython-39.pyc | Bin 0 -> 76442 bytes .../sql/__pycache__/roles.cpython-39.pyc | Bin 0 -> 10849 bytes .../sql/__pycache__/schema.cpython-39.pyc | Bin 0 -> 192063 bytes .../sql/__pycache__/selectable.cpython-39.pyc | Bin 0 -> 204094 bytes .../sql/__pycache__/sqltypes.cpython-39.pyc | Bin 0 -> 117771 bytes .../sql/__pycache__/traversals.cpython-39.pyc | Bin 0 -> 31484 bytes .../sql/__pycache__/type_api.cpython-39.pyc | Bin 0 -> 71927 bytes .../sql/__pycache__/util.cpython-39.pyc | Bin 0 -> 36212 bytes .../sql/__pycache__/visitors.cpython-39.pyc | Bin 0 -> 28884 bytes .../sqlalchemy/sql/_dml_constructors.py | 140 + .../sqlalchemy/sql/_elements_constructors.py | 1850 ++++ .../sqlalchemy/sql/_orm_types.py | 20 + .../site-packages/sqlalchemy/sql/_py_util.py | 75 + .../sql/_selectable_constructors.py | 642 ++ .../site-packages/sqlalchemy/sql/_typing.py | 456 + .../sqlalchemy/sql/annotation.py | 594 ++ .../Lib/site-packages/sqlalchemy/sql/base.py | 2195 +++++ .../site-packages/sqlalchemy/sql/cache_key.py | 1026 ++ .../site-packages/sqlalchemy/sql/coercions.py | 1406 +++ .../site-packages/sqlalchemy/sql/compiler.py | 7650 +++++++++++++++ .../Lib/site-packages/sqlalchemy/sql/crud.py | 1671 ++++ .../Lib/site-packages/sqlalchemy/sql/ddl.py | 1377 +++ .../sqlalchemy/sql/default_comparator.py | 549 ++ .../Lib/site-packages/sqlalchemy/sql/dml.py | 1835 ++++ .../site-packages/sqlalchemy/sql/elements.py | 5405 +++++++++++ .../site-packages/sqlalchemy/sql/events.py | 455 + .../sqlalchemy/sql/expression.py | 162 + .../site-packages/sqlalchemy/sql/functions.py | 1828 ++++ .../site-packages/sqlalchemy/sql/lambdas.py | 1450 +++ .../site-packages/sqlalchemy/sql/naming.py | 212 + .../site-packages/sqlalchemy/sql/operators.py | 2596 +++++ .../Lib/site-packages/sqlalchemy/sql/roles.py | 325 + .../site-packages/sqlalchemy/sql/schema.py | 6118 ++++++++++++ .../sqlalchemy/sql/selectable.py | 6934 ++++++++++++++ .../site-packages/sqlalchemy/sql/sqltypes.py | 3859 ++++++++ .../sqlalchemy/sql/traversals.py | 1021 ++ .../site-packages/sqlalchemy/sql/type_api.py | 2353 +++++ .../Lib/site-packages/sqlalchemy/sql/util.py | 1499 +++ .../site-packages/sqlalchemy/sql/visitors.py | 1181 +++ .../sqlalchemy/testing/__init__.py | 95 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3147 bytes .../__pycache__/assertions.cpython-39.pyc | Bin 0 -> 29130 bytes .../__pycache__/assertsql.cpython-39.pyc | Bin 0 -> 13109 bytes .../__pycache__/asyncio.cpython-39.pyc | Bin 0 -> 3101 bytes .../testing/__pycache__/config.cpython-39.pyc | Bin 0 -> 13959 bytes .../__pycache__/engines.cpython-39.pyc | Bin 0 -> 13855 bytes .../__pycache__/entities.cpython-39.pyc | Bin 0 -> 2984 bytes .../__pycache__/exclusions.cpython-39.pyc | Bin 0 -> 14119 bytes .../__pycache__/pickleable.cpython-39.pyc | Bin 0 -> 5520 bytes .../__pycache__/profiling.cpython-39.pyc | Bin 0 -> 8167 bytes .../__pycache__/provision.cpython-39.pyc | Bin 0 -> 13539 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 0 -> 68528 bytes .../testing/__pycache__/schema.cpython-39.pyc | Bin 0 -> 6479 bytes .../testing/__pycache__/util.cpython-39.pyc | Bin 0 -> 14611 bytes .../__pycache__/warnings.cpython-39.pyc | Bin 0 -> 1673 bytes .../sqlalchemy/testing/assertions.py | 989 ++ .../sqlalchemy/testing/assertsql.py | 515 + .../sqlalchemy/testing/asyncio.py | 130 + .../sqlalchemy/testing/config.py | 424 + .../sqlalchemy/testing/engines.py | 469 + .../sqlalchemy/testing/entities.py | 117 + .../sqlalchemy/testing/exclusions.py | 435 + .../sqlalchemy/testing/fixtures/__init__.py | 28 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 878 bytes .../fixtures/__pycache__/base.cpython-39.pyc | Bin 0 -> 7680 bytes .../fixtures/__pycache__/mypy.cpython-39.pyc | Bin 0 -> 7642 bytes .../fixtures/__pycache__/orm.cpython-39.pyc | Bin 0 -> 7735 bytes .../fixtures/__pycache__/sql.cpython-39.pyc | Bin 0 -> 13031 bytes .../sqlalchemy/testing/fixtures/base.py | 366 + .../sqlalchemy/testing/fixtures/mypy.py | 308 + .../sqlalchemy/testing/fixtures/orm.py | 227 + .../sqlalchemy/testing/fixtures/sql.py | 492 + .../sqlalchemy/testing/pickleable.py | 155 + .../sqlalchemy/testing/plugin/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 197 bytes .../__pycache__/bootstrap.cpython-39.pyc | Bin 0 -> 1543 bytes .../__pycache__/plugin_base.cpython-39.pyc | Bin 0 -> 18447 bytes .../__pycache__/pytestplugin.cpython-39.pyc | Bin 0 -> 20439 bytes .../sqlalchemy/testing/plugin/bootstrap.py | 45 + .../sqlalchemy/testing/plugin/plugin_base.py | 772 ++ .../sqlalchemy/testing/plugin/pytestplugin.py | 856 ++ .../sqlalchemy/testing/profiling.py | 324 + .../sqlalchemy/testing/provision.py | 486 + .../sqlalchemy/testing/requirements.py | 1757 ++++ .../sqlalchemy/testing/schema.py | 224 + .../sqlalchemy/testing/suite/__init__.py | 13 + .../suite/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 521 bytes .../suite/__pycache__/test_cte.cpython-39.pyc | Bin 0 -> 4566 bytes .../suite/__pycache__/test_ddl.cpython-39.pyc | Bin 0 -> 11424 bytes .../test_deprecations.cpython-39.pyc | Bin 0 -> 4405 bytes .../__pycache__/test_dialect.cpython-39.pyc | Bin 0 -> 20044 bytes .../__pycache__/test_insert.cpython-39.pyc | Bin 0 -> 13648 bytes .../test_reflection.cpython-39.pyc | Bin 0 -> 76283 bytes .../__pycache__/test_results.cpython-39.pyc | Bin 0 -> 12000 bytes .../__pycache__/test_rowcount.cpython-39.pyc | Bin 0 -> 5876 bytes .../__pycache__/test_select.cpython-39.pyc | Bin 0 -> 56828 bytes .../__pycache__/test_sequence.cpython-39.pyc | Bin 0 -> 8829 bytes .../__pycache__/test_types.cpython-39.pyc | Bin 0 -> 52845 bytes .../test_unicode_ddl.cpython-39.pyc | Bin 0 -> 3718 bytes .../test_update_delete.cpython-39.pyc | Bin 0 -> 2056 bytes .../sqlalchemy/testing/suite/test_cte.py | 205 + .../sqlalchemy/testing/suite/test_ddl.py | 383 + .../testing/suite/test_deprecations.py | 147 + .../sqlalchemy/testing/suite/test_dialect.py | 734 ++ .../sqlalchemy/testing/suite/test_insert.py | 616 ++ .../testing/suite/test_reflection.py | 3122 ++++++ .../sqlalchemy/testing/suite/test_results.py | 462 + .../sqlalchemy/testing/suite/test_rowcount.py | 252 + .../sqlalchemy/testing/suite/test_select.py | 1882 ++++ .../sqlalchemy/testing/suite/test_sequence.py | 311 + .../sqlalchemy/testing/suite/test_types.py | 1957 ++++ .../testing/suite/test_unicode_ddl.py | 183 + .../testing/suite/test_update_delete.py | 62 + .../site-packages/sqlalchemy/testing/util.py | 519 + .../sqlalchemy/testing/warnings.py | 52 + .../Lib/site-packages/sqlalchemy/types.py | 76 + .../site-packages/sqlalchemy/util/__init__.py | 159 + .../util/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 5467 bytes .../__pycache__/_collections.cpython-39.pyc | Bin 0 -> 24313 bytes .../_concurrency_py3k.cpython-39.pyc | Bin 0 -> 6628 bytes .../util/__pycache__/_has_cy.cpython-39.pyc | Bin 0 -> 875 bytes .../_py_collections.cpython-39.pyc | Bin 0 -> 21193 bytes .../util/__pycache__/compat.cpython-39.pyc | Bin 0 -> 8685 bytes .../__pycache__/concurrency.cpython-39.pyc | Bin 0 -> 1757 bytes .../__pycache__/deprecations.cpython-39.pyc | Bin 0 -> 9359 bytes .../__pycache__/langhelpers.cpython-39.pyc | Bin 0 -> 59414 bytes .../util/__pycache__/preloaded.cpython-39.pyc | Bin 0 -> 5121 bytes .../util/__pycache__/queue.cpython-39.pyc | Bin 0 -> 10575 bytes .../__pycache__/tool_support.cpython-39.pyc | Bin 0 -> 5378 bytes .../__pycache__/topological.cpython-39.pyc | Bin 0 -> 2856 bytes .../util/__pycache__/typing.cpython-39.pyc | Bin 0 -> 14554 bytes .../sqlalchemy/util/_collections.py | 723 ++ .../sqlalchemy/util/_concurrency_py3k.py | 260 + .../site-packages/sqlalchemy/util/_has_cy.py | 39 + .../sqlalchemy/util/_py_collections.py | 539 ++ .../site-packages/sqlalchemy/util/compat.py | 320 + .../sqlalchemy/util/concurrency.py | 69 + .../sqlalchemy/util/deprecations.py | 401 + .../sqlalchemy/util/langhelpers.py | 2211 +++++ .../sqlalchemy/util/preloaded.py | 150 + .../site-packages/sqlalchemy/util/queue.py | 324 + .../sqlalchemy/util/tool_support.py | 198 + .../sqlalchemy/util/topological.py | 120 + .../site-packages/sqlalchemy/util/typing.py | 574 ++ .../INSTALLER | 1 + .../typing_extensions-4.8.0.dist-info/LICENSE | 279 + .../METADATA | 66 + .../typing_extensions-4.8.0.dist-info/RECORD | 7 + .../typing_extensions-4.8.0.dist-info/WHEEL | 4 + .../Lib/site-packages/typing_extensions.py | 2892 ++++++ .../werkzeug-3.0.0.dist-info/INSTALLER | 1 + .../werkzeug-3.0.0.dist-info/LICENSE.rst | 28 + .../werkzeug-3.0.0.dist-info/METADATA | 118 + .../werkzeug-3.0.0.dist-info/RECORD | 125 + .../werkzeug-3.0.0.dist-info/WHEEL | 4 + .../Lib/site-packages/werkzeug/__init__.py | 25 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 928 bytes .../__pycache__/_internal.cpython-39.pyc | Bin 0 -> 6784 bytes .../__pycache__/_reloader.cpython-39.pyc | Bin 0 -> 12407 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 27682 bytes .../__pycache__/formparser.cpython-39.pyc | Bin 0 -> 12242 bytes .../werkzeug/__pycache__/http.cpython-39.pyc | Bin 0 -> 37739 bytes .../werkzeug/__pycache__/local.cpython-39.pyc | Bin 0 -> 20498 bytes .../__pycache__/security.cpython-39.pyc | Bin 0 -> 5262 bytes .../__pycache__/serving.cpython-39.pyc | Bin 0 -> 29688 bytes .../werkzeug/__pycache__/test.cpython-39.pyc | Bin 0 -> 42133 bytes .../__pycache__/testapp.cpython-39.pyc | Bin 0 -> 6362 bytes .../werkzeug/__pycache__/urls.cpython-39.pyc | Bin 0 -> 6358 bytes .../__pycache__/user_agent.cpython-39.pyc | Bin 0 -> 1839 bytes .../werkzeug/__pycache__/utils.cpython-39.pyc | Bin 0 -> 21959 bytes .../werkzeug/__pycache__/wsgi.cpython-39.pyc | Bin 0 -> 19601 bytes .../Lib/site-packages/werkzeug/_internal.py | 214 + .../Lib/site-packages/werkzeug/_reloader.py | 458 + .../werkzeug/datastructures/__init__.py | 34 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1560 bytes .../__pycache__/accept.cpython-39.pyc | Bin 0 -> 10615 bytes .../__pycache__/auth.cpython-39.pyc | Bin 0 -> 10413 bytes .../__pycache__/cache_control.cpython-39.pyc | Bin 0 -> 6577 bytes .../__pycache__/csp.cpython-39.pyc | Bin 0 -> 4145 bytes .../__pycache__/etag.cpython-39.pyc | Bin 0 -> 3946 bytes .../__pycache__/file_storage.cpython-39.pyc | Bin 0 -> 6042 bytes .../__pycache__/headers.cpython-39.pyc | Bin 0 -> 17707 bytes .../__pycache__/mixins.cpython-39.pyc | Bin 0 -> 9575 bytes .../__pycache__/range.cpython-39.pyc | Bin 0 -> 6081 bytes .../__pycache__/structures.cpython-39.pyc | Bin 0 -> 36237 bytes .../werkzeug/datastructures/accept.py | 326 + .../werkzeug/datastructures/accept.pyi | 54 + .../werkzeug/datastructures/auth.py | 318 + .../werkzeug/datastructures/cache_control.py | 175 + .../werkzeug/datastructures/cache_control.pyi | 109 + .../werkzeug/datastructures/csp.py | 94 + .../werkzeug/datastructures/csp.pyi | 169 + .../werkzeug/datastructures/etag.py | 95 + .../werkzeug/datastructures/etag.pyi | 30 + .../werkzeug/datastructures/file_storage.py | 196 + .../werkzeug/datastructures/file_storage.pyi | 47 + .../werkzeug/datastructures/headers.py | 515 + .../werkzeug/datastructures/headers.pyi | 109 + .../werkzeug/datastructures/mixins.py | 242 + .../werkzeug/datastructures/mixins.pyi | 97 + .../werkzeug/datastructures/range.py | 180 + .../werkzeug/datastructures/range.pyi | 57 + .../werkzeug/datastructures/structures.py | 1006 ++ .../werkzeug/datastructures/structures.pyi | 208 + .../site-packages/werkzeug/debug/__init__.py | 534 ++ .../debug/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 14077 bytes .../debug/__pycache__/console.cpython-39.pyc | Bin 0 -> 8096 bytes .../debug/__pycache__/repr.cpython-39.pyc | Bin 0 -> 8846 bytes .../debug/__pycache__/tbtools.cpython-39.pyc | Bin 0 -> 11505 bytes .../site-packages/werkzeug/debug/console.py | 219 + .../Lib/site-packages/werkzeug/debug/repr.py | 283 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 360 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/style.css | 150 + .../site-packages/werkzeug/debug/tbtools.py | 437 + .../Lib/site-packages/werkzeug/exceptions.py | 879 ++ .../Lib/site-packages/werkzeug/formparser.py | 421 + .../Lib/site-packages/werkzeug/http.py | 1372 +++ .../Lib/site-packages/werkzeug/local.py | 643 ++ .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 191 bytes .../__pycache__/dispatcher.cpython-39.pyc | Bin 0 -> 2787 bytes .../__pycache__/http_proxy.cpython-39.pyc | Bin 0 -> 6810 bytes .../__pycache__/lint.cpython-39.pyc | Bin 0 -> 12707 bytes .../__pycache__/profiler.cpython-39.pyc | Bin 0 -> 5545 bytes .../__pycache__/proxy_fix.cpython-39.pyc | Bin 0 -> 5943 bytes .../__pycache__/shared_data.cpython-39.pyc | Bin 0 -> 9088 bytes .../werkzeug/middleware/dispatcher.py | 80 + .../werkzeug/middleware/http_proxy.py | 235 + .../site-packages/werkzeug/middleware/lint.py | 420 + .../werkzeug/middleware/profiler.py | 154 + .../werkzeug/middleware/proxy_fix.py | 182 + .../werkzeug/middleware/shared_data.py | 282 + .../Lib/site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 133 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 4629 bytes .../__pycache__/converters.cpython-39.pyc | Bin 0 -> 8869 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 5485 bytes .../routing/__pycache__/map.cpython-39.pyc | Bin 0 -> 30331 bytes .../__pycache__/matcher.cpython-39.pyc | Bin 0 -> 5067 bytes .../routing/__pycache__/rules.cpython-39.pyc | Bin 0 -> 27304 bytes .../werkzeug/routing/converters.py | 261 + .../werkzeug/routing/exceptions.py | 148 + .../Lib/site-packages/werkzeug/routing/map.py | 946 ++ .../site-packages/werkzeug/routing/matcher.py | 202 + .../site-packages/werkzeug/routing/rules.py | 909 ++ .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 187 bytes .../sansio/__pycache__/http.cpython-39.pyc | Bin 0 -> 4009 bytes .../__pycache__/multipart.cpython-39.pyc | Bin 0 -> 7409 bytes .../sansio/__pycache__/request.cpython-39.pyc | Bin 0 -> 17249 bytes .../__pycache__/response.cpython-39.pyc | Bin 0 -> 24256 bytes .../sansio/__pycache__/utils.cpython-39.pyc | Bin 0 -> 4504 bytes .../Lib/site-packages/werkzeug/sansio/http.py | 171 + .../werkzeug/sansio/multipart.py | 313 + .../site-packages/werkzeug/sansio/request.py | 536 ++ .../site-packages/werkzeug/sansio/response.py | 751 ++ .../site-packages/werkzeug/sansio/utils.py | 159 + .../Lib/site-packages/werkzeug/security.py | 157 + .../Lib/site-packages/werkzeug/serving.py | 1109 +++ .../Lib/site-packages/werkzeug/test.py | 1462 +++ .../Lib/site-packages/werkzeug/testapp.py | 181 + .../Lib/site-packages/werkzeug/urls.py | 216 + .../Lib/site-packages/werkzeug/user_agent.py | 47 + .../Lib/site-packages/werkzeug/utils.py | 690 ++ .../werkzeug/wrappers/__init__.py | 3 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 306 bytes .../__pycache__/request.cpython-39.pyc | Bin 0 -> 21339 bytes .../__pycache__/response.cpython-39.pyc | Bin 0 -> 28031 bytes .../werkzeug/wrappers/request.py | 650 ++ .../werkzeug/wrappers/response.py | 835 ++ .../Lib/site-packages/werkzeug/wsgi.py | 595 ++ .../zipp-3.17.0.dist-info/INSTALLER | 1 + .../zipp-3.17.0.dist-info/LICENSE | 17 + .../zipp-3.17.0.dist-info/METADATA | 104 + .../zipp-3.17.0.dist-info/RECORD | 12 + .../site-packages/zipp-3.17.0.dist-info/WHEEL | 5 + .../zipp-3.17.0.dist-info/top_level.txt | 1 + .../Lib/site-packages/zipp/__init__.py | 428 + .../zipp/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 13752 bytes .../zipp/__pycache__/glob.cpython-39.pyc | Bin 0 -> 1207 bytes .../__pycache__/py310compat.cpython-39.pyc | Bin 0 -> 415 bytes .../gmapenv/Lib/site-packages/zipp/glob.py | 40 + .../Lib/site-packages/zipp/py310compat.py | 11 + Meliora/gmapenv/Scripts/Activate.ps1 | 241 + Meliora/gmapenv/Scripts/activate | 66 + Meliora/gmapenv/Scripts/activate.bat | 33 + Meliora/gmapenv/Scripts/deactivate.bat | 21 + Meliora/gmapenv/Scripts/flask.exe | Bin 0 -> 106369 bytes Meliora/gmapenv/Scripts/pip.exe | Bin 0 -> 106382 bytes Meliora/gmapenv/Scripts/pip3.9.exe | Bin 0 -> 106382 bytes Meliora/gmapenv/Scripts/pip3.exe | Bin 0 -> 106382 bytes Meliora/gmapenv/Scripts/python.exe | Bin 0 -> 524800 bytes Meliora/gmapenv/Scripts/pythonw.exe | Bin 0 -> 524288 bytes Meliora/gmapenv/pyvenv.cfg | 3 + Meliora/instance/LibraryData.sqlite3 | Bin 0 -> 8192 bytes Meliora/main.py | 104 + Meliora/models.py | 17 + Meliora/req.txt | 13 + 2439 files changed, 565204 insertions(+) create mode 100644 Meliora/.gitattributes create mode 100644 Meliora/README.md create mode 100644 Meliora/Templates/add_marker.html create mode 100644 Meliora/Templates/index.html create mode 100644 Meliora/__pycache__/main.cpython-39.pyc create mode 100644 Meliora/__pycache__/models.cpython-39.pyc create mode 100644 Meliora/gmapenv/Include/site/python3.9/greenlet/greenlet.h create mode 100644 Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst create mode 100644 Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst create mode 100644 Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/LICENSE create mode 100644 Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/REQUESTED create mode 100644 Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/__pycache__/typing_extensions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/_distutils_hack/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/_distutils_hack/override.py create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/LICENSE.rst create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker/__pycache__/_saferef.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker/_saferef.py create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker/_utilities.py create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/blinker/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/LICENSE.rst create mode 100644 Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/_compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/_textwrap.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/_winconsole.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/core.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/decorators.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/exceptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/formatting.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/globals.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/parser.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/shell_completion.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/termui.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/testing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/types.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/click/_compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/_termui_impl.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/_textwrap.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/_winconsole.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/core.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/decorators.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/exceptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/formatting.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/globals.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/parser.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/click/shell_completion.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/termui.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/testing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/types.py create mode 100644 Meliora/gmapenv/Lib/site-packages/click/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/ansi.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/initialise.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/win32.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/winterm.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/ansi.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/ansitowin32.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/initialise.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/ansi_test.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/ansitowin32_test.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/initialise_test.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/isatty_test.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/tests/winterm_test.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/win32.py create mode 100644 Meliora/gmapenv/Lib/site-packages/colorama/winterm.py create mode 100644 Meliora/gmapenv/Lib/site-packages/distutils-precedence.pth create mode 100644 Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/LICENSE.rst create mode 100644 Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/REQUESTED create mode 100644 Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/entry_points.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__main__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/__main__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/app.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/blueprints.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/cli.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/config.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/ctx.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/debughelpers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/globals.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/helpers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/logging.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/sessions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/signals.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/templating.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/testing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/typing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/views.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/__pycache__/wrappers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/app.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/blueprints.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/cli.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/config.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/ctx.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/debughelpers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/globals.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/helpers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/json/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/json/__pycache__/provider.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/json/__pycache__/tag.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/json/provider.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/json/tag.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/logging.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/sansio/README.md create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/sansio/__pycache__/blueprints.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/sansio/__pycache__/scaffold.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/sansio/app.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/sansio/blueprints.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/sansio/scaffold.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/sessions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/signals.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/templating.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/testing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/typing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/views.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask/wrappers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/model.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/pagination.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/query.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/session.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/table.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/cli.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/extension.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/model.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/pagination.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/query.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/record_queries.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/session.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/table.py create mode 100644 Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/track_modifications.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/AUTHORS create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/LICENSE create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/LICENSE.PSF create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/TBrokenGreenlet.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/TExceptionState.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/TGreenlet.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/TGreenletGlobals.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/TMainGreenlet.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/TPythonState.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/TStackState.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/TThreadStateDestroy.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/TUserGreenlet.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/_greenlet.cp39-win_amd64.pyd create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_allocator.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_compiler_compat.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_cpython_add_pending.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_cpython_compat.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_exceptions.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_greenlet.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_internal.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_refs.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_slp_switch.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_state.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_state_dict_cleanup.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_support.hpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/setup_switch_x64_masm.cmd create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_aarch64_gcc.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_alpha_unix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_amd64_unix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm32_ios.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_masm.asm create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_masm.obj create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_msvc.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_csky_gcc.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_loongarch64_linux.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_mips_unix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_aix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_linux.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_unix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_riscv_unix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_s390_unix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x32_unix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_masm.asm create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_masm.obj create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_msvc.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x86_msvc.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x86_unix.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/slp_platformselect.h create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_cpp_exception.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_slp_switch.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets2.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_two_greenlets.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/leakcheck.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_contextvars.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_extension_interface.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_gc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_generator.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_generator_nested.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_greenlet_trash.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_leaks.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_stack_saved.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_throw.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_tracing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension.c create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension.cp39-win_amd64.pyd create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cp39-win_amd64.pyd create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cpp create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_clearing_run_switches.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_cpp_exception.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_initialstub_already_started.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_slp_switch.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets2.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_two_greenlets.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/leakcheck.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_contextvars.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_cpp.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_extension_interface.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_gc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_generator.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_generator_nested.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_greenlet.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_greenlet_trash.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_leaks.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_stack_saved.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_throw.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_tracing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_weakref.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/LICENSE create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_adapters.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_collections.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_functools.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_itertools.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_meta.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_py39compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_text.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/_adapters.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/_collections.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/_compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/_functools.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/_itertools.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/_meta.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/_py39compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/_text.py create mode 100644 Meliora/gmapenv/Lib/site-packages/importlib_metadata/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/_json.py create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/encoding.py create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/exc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/serializer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/signer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/timed.py create mode 100644 Meliora/gmapenv/Lib/site-packages/itsdangerous/url_safe.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/compiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/constants.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/debug.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/environment.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/ext.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/filters.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/meta.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/nativetypes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/nodes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/parser.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/sandbox.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/tests.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/visitor.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/_identifier.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/async_utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/bccache.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/compiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/constants.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/debug.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/defaults.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/environment.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/exceptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/ext.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/filters.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/idtracking.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/lexer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/loaders.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/meta.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/nativetypes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/nodes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/optimizer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/parser.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/runtime.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/sandbox.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/tests.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/jinja2/visitor.py create mode 100644 Meliora/gmapenv/Lib/site-packages/markupsafe/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/markupsafe/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/markupsafe/__pycache__/_native.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/markupsafe/_native.py create mode 100644 Meliora/gmapenv/Lib/site-packages/markupsafe/_speedups.c create mode 100644 Meliora/gmapenv/Lib/site-packages/markupsafe/_speedups.cp39-win_amd64.pyd create mode 100644 Meliora/gmapenv/Lib/site-packages/markupsafe/_speedups.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/markupsafe/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/pip-22.0.4.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/pip-22.0.4.dist-info/LICENSE.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/pip-22.0.4.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/pip-22.0.4.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/pip-22.0.4.dist-info/REQUESTED create mode 100644 Meliora/gmapenv/Lib/site-packages/pip-22.0.4.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/pip-22.0.4.dist-info/entry_points.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/pip-22.0.4.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/__main__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/__pycache__/__main__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/build_env.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cache.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/command_context.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/main.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/req_command.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/spinners.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/cache.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/debug.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/index.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/configuration.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/installed.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/sdist.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/distributions/wheel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/index/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/index/collector.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/index/package_finder.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/index/sources.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/locations/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/locations/_distutils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/locations/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/main.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/metadata/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/metadata/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/direct_url.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/index.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/link.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/scheme.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/search_scope.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/target_python.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/models/wheel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/auth.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/cache.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/download.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/session.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/req_tracker.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/self_outdated_check.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/_log.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/datetime.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/egg_link.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/filetypes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/subprocess.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/unpacking.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/urls.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/utils/wheel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_internal/wheel_builder.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/__pycache__/distro.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/distro.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/tags.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/build.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/check.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/meta.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/__pycache__/colors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/bar.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/colors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/counter.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/console.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/filter.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/style.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/token.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pygments/util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__main__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_lru_cache.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/tabulate.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_extension.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_loop.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_lru_cache.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_pick.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_stack.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_timer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_windows.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/abc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/align.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/ansi.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/bar.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/box.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/cells.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/color.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/columns.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/console.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/constrain.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/containers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/control.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/emoji.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/errors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/filesize.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/json.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/layout.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/live.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/live_render.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/logging.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/markup.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/measure.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/padding.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/pager.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/palette.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/panel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/pretty.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/progress.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/prompt.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/protocol.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/region.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/repr.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/rule.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/scope.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/screen.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/segment.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/spinner.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/status.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/style.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/styled.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/syntax.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/table.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/tabulate.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/text.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/theme.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/themes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/traceback.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/rich/tree.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/six.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/after.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/before.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/tomli/_re.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/typing_extensions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/vendor.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pip/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_typing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/_typing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/__pycache__/setup.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools-58.1.0.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools-58.1.0.dist-info/LICENSE create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools-58.1.0.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools-58.1.0.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools-58.1.0.dist-info/REQUESTED create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools-58.1.0.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools-58.1.0.dist-info/entry_points.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools-58.1.0.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/_imp.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/config.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/depends.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/dist.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/errors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/extension.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/glob.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/installer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/launch.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_deprecation_warning.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/py35compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/archive_util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/cmd.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_msi.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_wininst.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/build.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/check.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/clean.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/config.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/install.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/register.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/command/upload.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/config.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/core.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/debug.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/dep_util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/dir_util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/dist.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/errors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/extension.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/file_util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/filelist.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/log.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/py35compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/py38compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/spawn.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/text_file.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_imp.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_typing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/_typing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/archive_util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/build_meta.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/cli-32.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/cli-64.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/cli.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/alias.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/build_py.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/develop.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/easy_install.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/install.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/register.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/rotate.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/sdist.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/setopt.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/test.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/upload.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/config.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/dep_util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/depends.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/dist.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/errors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/extension.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/glob.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/gui-32.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/gui-64.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/gui.exe create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/installer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/launch.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/monkey.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/msvc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/namespaces.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/package_index.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/py34compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/sandbox.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/script.tmpl create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/version.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/wheel.py create mode 100644 Meliora/gmapenv/Lib/site-packages/setuptools/windows_support.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/__pycache__/events.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/__pycache__/exc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/__pycache__/inspection.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/__pycache__/log.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/__pycache__/schema.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/__pycache__/types.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/connectors/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/connectors/pyodbc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/collections.cp39-win_amd64.pyd create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/collections.pyx create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/immutabledict.cp39-win_amd64.pyd create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/immutabledict.pxd create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/immutabledict.pyx create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/processors.cp39-win_amd64.pyd create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/processors.pyx create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/resultproxy.cp39-win_amd64.pyd create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/resultproxy.pyx create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/util.cp39-win_amd64.pyd create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/cyextension/util.pyx create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/__pycache__/_typing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/_typing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/json.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/provision.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/information_schema.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/json.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/provision.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/pymssql.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mssql/pyodbc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/provision.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/aiomysql.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/asyncmy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/cymysql.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/dml.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/enumerated.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/expression.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/json.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/mariadb.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/mysqldb.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/provision.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/pymysql.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/pyodbc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/reflection.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/reserved_words.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/mysql/types.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/provision.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/__pycache__/types.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/dictionary.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/oracledb.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/provision.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/oracle/types.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/__pycache__/types.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/_psycopg_common.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/array.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/dml.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/ext.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/hstore.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/json.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/named_types.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/operators.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/pg8000.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/pg_catalog.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/provision.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/ranges.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/postgresql/types.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/json.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/dml.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/json.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/provision.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/dialects/type_migration_guidelines.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_row.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/_py_util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/create.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/default.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/events.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/result.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/row.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/url.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/__pycache__/util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/_py_processors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/_py_row.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/_py_util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/characteristics.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/create.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/cursor.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/default.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/events.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/interfaces.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/mock.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/processors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/reflection.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/result.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/row.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/strategies.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/url.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/engine/util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/__pycache__/api.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/__pycache__/attr.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/__pycache__/registry.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/api.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/attr.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/legacy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/event/registry.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/events.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/exc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/associationproxy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/baked.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/compiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/horizontal_shard.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/hybrid.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/indexable.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/instrumentation.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/mutable.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/orderinglist.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/__pycache__/serializer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/associationproxy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/engine.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/exc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/result.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/__pycache__/session.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/engine.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/exc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/result.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/scoping.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/asyncio/session.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/automap.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/baked.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/compiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/declarative/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/declarative/extensions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/horizontal_shard.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/hybrid.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/indexable.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/instrumentation.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mutable.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/apply.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/infer.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/names.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/plugin.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/__pycache__/util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/apply.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/decl_class.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/infer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/names.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/plugin.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/mypy/util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/orderinglist.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/ext/serializer.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/future/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/future/__pycache__/engine.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/future/engine.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/inspection.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/log.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/context.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/events.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/query.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/session.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/state.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/_orm_constructors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/_typing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/attributes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/bulk_persistence.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/clsregistry.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/collections.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/context.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/decl_api.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/decl_base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/dependency.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/descriptor_props.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/dynamic.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/evaluator.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/events.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/exc.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/identity.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/instrumentation.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/interfaces.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/loading.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/mapped_collection.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/mapper.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/path_registry.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/persistence.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/properties.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/query.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/relationships.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/scoping.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/session.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/state.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/state_changes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/strategies.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/strategy_options.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/sync.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/unitofwork.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/orm/writeonly.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/pool/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/pool/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/pool/__pycache__/events.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/pool/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/pool/events.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/pool/impl.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/schema.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/_py_util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/events.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/_dml_constructors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/_elements_constructors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/_orm_types.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/_py_util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/_selectable_constructors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/_typing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/annotation.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/cache_key.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/coercions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/compiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/crud.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/ddl.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/default_comparator.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/dml.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/elements.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/events.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/expression.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/functions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/lambdas.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/naming.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/operators.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/roles.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/schema.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/selectable.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/sqltypes.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/traversals.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/type_api.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/sql/visitors.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/assertions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/assertsql.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/asyncio.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/config.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/engines.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/entities.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/exclusions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/pickleable.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/profiling.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/provision.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/requirements.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/schema.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/util.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/__pycache__/warnings.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/assertions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/assertsql.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/asyncio.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/config.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/engines.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/entities.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/exclusions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/mypy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/orm.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/__pycache__/sql.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/mypy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/orm.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/fixtures/sql.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/pickleable.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/plugin/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/plugin/bootstrap.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/plugin/plugin_base.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/plugin/pytestplugin.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/profiling.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/provision.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/requirements.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/schema.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_cte.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_insert.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_results.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_select.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_types.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_cte.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_ddl.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_deprecations.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_dialect.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_insert.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_reflection.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_results.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_rowcount.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_select.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_sequence.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_types.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_unicode_ddl.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/suite/test_update_delete.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/util.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/testing/warnings.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/types.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/_py_collections.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/queue.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/tool_support.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/topological.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/__pycache__/typing.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/_collections.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/_concurrency_py3k.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/_has_cy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/_py_collections.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/compat.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/concurrency.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/deprecations.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/langhelpers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/preloaded.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/queue.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/tool_support.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/topological.py create mode 100644 Meliora/gmapenv/Lib/site-packages/sqlalchemy/util/typing.py create mode 100644 Meliora/gmapenv/Lib/site-packages/typing_extensions-4.8.0.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/typing_extensions-4.8.0.dist-info/LICENSE create mode 100644 Meliora/gmapenv/Lib/site-packages/typing_extensions-4.8.0.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/typing_extensions-4.8.0.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/typing_extensions-4.8.0.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/typing_extensions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug-3.0.0.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug-3.0.0.dist-info/LICENSE.rst create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug-3.0.0.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug-3.0.0.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug-3.0.0.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/_internal.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/_reloader.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/exceptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/formparser.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/http.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/local.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/security.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/serving.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/test.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/testapp.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/urls.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/user_agent.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/__pycache__/wsgi.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/_internal.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/_reloader.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/range.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/accept.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/accept.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/auth.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/cache_control.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/cache_control.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/csp.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/csp.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/etag.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/etag.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/file_storage.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/file_storage.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/headers.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/headers.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/mixins.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/mixins.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/range.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/range.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/structures.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/datastructures/structures.pyi create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/__pycache__/console.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/__pycache__/repr.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/console.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/repr.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/shared/console.png create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/shared/less.png create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/shared/more.png create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/shared/style.css create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/debug/tbtools.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/exceptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/formparser.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/http.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/local.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/__pycache__/lint.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/lint.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/profiler.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/middleware/shared_data.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/py.typed create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/__pycache__/converters.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/__pycache__/map.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/__pycache__/matcher.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/__pycache__/rules.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/converters.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/exceptions.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/map.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/matcher.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/routing/rules.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/__pycache__/http.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/__pycache__/request.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/__pycache__/response.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/__pycache__/utils.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/http.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/multipart.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/request.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/response.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/sansio/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/security.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/serving.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/test.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/testapp.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/urls.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/user_agent.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/utils.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/wrappers/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/wrappers/request.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/wrappers/response.py create mode 100644 Meliora/gmapenv/Lib/site-packages/werkzeug/wsgi.py create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp-3.17.0.dist-info/INSTALLER create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp-3.17.0.dist-info/LICENSE create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp-3.17.0.dist-info/METADATA create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp-3.17.0.dist-info/RECORD create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp-3.17.0.dist-info/WHEEL create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp-3.17.0.dist-info/top_level.txt create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp/__init__.py create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp/__pycache__/__init__.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp/__pycache__/glob.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp/__pycache__/py310compat.cpython-39.pyc create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp/glob.py create mode 100644 Meliora/gmapenv/Lib/site-packages/zipp/py310compat.py create mode 100644 Meliora/gmapenv/Scripts/Activate.ps1 create mode 100644 Meliora/gmapenv/Scripts/activate create mode 100644 Meliora/gmapenv/Scripts/activate.bat create mode 100644 Meliora/gmapenv/Scripts/deactivate.bat create mode 100644 Meliora/gmapenv/Scripts/flask.exe create mode 100644 Meliora/gmapenv/Scripts/pip.exe create mode 100644 Meliora/gmapenv/Scripts/pip3.9.exe create mode 100644 Meliora/gmapenv/Scripts/pip3.exe create mode 100644 Meliora/gmapenv/Scripts/python.exe create mode 100644 Meliora/gmapenv/Scripts/pythonw.exe create mode 100644 Meliora/gmapenv/pyvenv.cfg create mode 100644 Meliora/instance/LibraryData.sqlite3 create mode 100644 Meliora/main.py create mode 100644 Meliora/models.py create mode 100644 Meliora/req.txt diff --git a/Meliora/.gitattributes b/Meliora/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/Meliora/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/Meliora/README.md b/Meliora/README.md new file mode 100644 index 00000000..9f0372b1 --- /dev/null +++ b/Meliora/README.md @@ -0,0 +1,2 @@ +# Meliora + diff --git a/Meliora/Templates/add_marker.html b/Meliora/Templates/add_marker.html new file mode 100644 index 00000000..0c39bf1e --- /dev/null +++ b/Meliora/Templates/add_marker.html @@ -0,0 +1,257 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Meliora + + + + + +
+
+

Note: Please select a location from the map to get the coordinates automatically.

+
+ + + + +

Add a Marker

+
+
+ + +
+ + + + +
+ + +
+ + +
+ + + + + +
+ + + + +
+
+ + diff --git a/Meliora/Templates/index.html b/Meliora/Templates/index.html new file mode 100644 index 00000000..5af366d9 --- /dev/null +++ b/Meliora/Templates/index.html @@ -0,0 +1,273 @@ + + + + + + Meliora + + + + + +
+
+

Note: Please select a road marker on the map to vote or to view route suitability.

+
+ {% if msg02 %} +

Marker added successfully. Please find it in the map.

+ {% endif %} + + + + +

Welcome to Meliora Maps

+
+
+

Road Suitability Voting for:

+
+ {% if msg01 %} +

Vote counted successfully

+ {% endif %} +
+ + + + + + + + + + + + + + + +
+

+

+
+
+

Add a Marker

+ Add +
+ + diff --git a/Meliora/__pycache__/main.cpython-39.pyc b/Meliora/__pycache__/main.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e9f288eed0b57ba0caf66b1aef4d37395fae339 GIT binary patch literal 2337 zcmb7FJ!~5{6ef8;I-P#(*h$m;_J#t5TEt3Ipa={jh~ub9QO8Xq1wjr*4rh^)PPre2 zq#WxY6$RWOOMna=GTPm;cL+Ln>0Y3~t?iPvW2Qcy6xeP%xOdxiYN|Igk2mFmqePYMY^j;hHFHoYhooQVWEW>X4Wot zi&SI9zD@NNM2&o8t{_(0E3@K0#)uX7D*I@!x{uVjKSvAHqQx$u_H#l@wER5+9rL-Q z0(_kFt8^~spUC<1)SB^6(1o18z%07>nDC!K`=ZiJPc~8Q)EhWGs+pPbMd*vi*&Jsv zW!#f28ic-NS%I@BLndTqaYh5q+A=E)dFXW#o)!8ciG$9lhBN$edOKb$#u2%$9sh0eLO)@qhySz_MCvB z`bK6%qI>z%)DFPHou!_P!dIA=U{OuyN=c^syel%T%Ouxe&dWevAwCD)+be6!oA(9d zVzW2cyqP?W!^Edz^H$^!gmc?(Klb5tvC~eX!Di$K@zP+F8Tn50uv{qph?Fru0ex!J zw-d>ZSfVyGpyiglguxL@rdAQK3QMi8_l+?IyYQa5k0xYH_%pCmhv2S{Nxwji(`Zb* zg0%X@JzIquq$WuFAT76Wq_QHbkbVX&J}0{vJZW!ax;lPZ6)c2& zVDu7ChLXL)uF(o)$kK|4{4l(<&3ZvQWN%cET&?Z%w6qm;-?4K~@yiTh0b*&o3uyk07GZudpR1kzq&Cc}Qw=cxiyeExmGU_j*5ZOq?y|h+!c8t&lm8Zw@4?BZ8DUNynKb ztVpjPbFBkO?f5Zu@`PvnK*QSq(jc6t49?*T2QJ8glKyd(cRc)273yO6CE_KT=y+o~Pag&)cY-bd8RB zZ8-tK^r=zr!$G;q&+M8}LRl!(%Gi&X=ee3c7^p%QcY-cI3rk!phy&>En;IET3MgRwqC{d JBDC`s{u_ItV*mgE literal 0 HcmV?d00001 diff --git a/Meliora/__pycache__/models.cpython-39.pyc b/Meliora/__pycache__/models.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3cb7fa41e99ac0e0d110758e08b1ebc15129ca6 GIT binary patch literal 765 zcmZ8fOK%e~5VqIr&E{1C;s^A|UV1*z$;Mu1dK!yYm{S# zF;aMgSa5-4AjvI~LP1SRwis!@VnXYyfmrn8yK*O?DB<(~QnL=|FK0-+*{ z5R^(RgYN;0cKByYl3!Scl0q!r*R=PzbAY>hO!xWT0q!5*qXYavMzVE_*g(cGO524W zOCc{4%(|7C=fbS{QmyZv!lBP07#Az8#g$eWZVcyrSSK2STEF2MeM1Yp!N7>eN#KaB zjca*kK9{hl&?%TahhAJu8djtjw!4 zFQwAn zQm^uYwcZuAnkr)=pmWirHuGZY=;gfDiqUg8R?WguSxgxjiQ3T#|Ey+?425y@wf9-; zEX(-3kj5`zJ6*%HeT;yip!N}%7!UAc(EE>U^W%iF!L=54$?c66y9Z_bkmd*sqwoC| bwxtbvzf0qLxcJ3x*q8oZtbcgDAPW8i41Tb? literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Include/site/python3.9/greenlet/greenlet.h b/Meliora/gmapenv/Include/site/python3.9/greenlet/greenlet.h new file mode 100644 index 00000000..d02a16e4 --- /dev/null +++ b/Meliora/gmapenv/Include/site/python3.9/greenlet/greenlet.h @@ -0,0 +1,164 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is deprecated and undocumented. It does not change. */ +#define GREENLET_VERSION "1.0.0" + +#ifndef GREENLET_MODULE +#define implementation_ptr_t void* +#endif + +typedef struct _greenlet { + PyObject_HEAD + PyObject* weakreflist; + PyObject* dict; + implementation_ptr_t pimpl; +} PyGreenlet; + +#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) + + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 12 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#define PyGreenlet_MAIN_NUM 8 +#define PyGreenlet_STARTED_NUM 9 +#define PyGreenlet_ACTIVE_NUM 10 +#define PyGreenlet_GET_PARENT_NUM 11 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void** _PyGreenlet_API = NULL; + +# define PyGreenlet_Type \ + (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) + +# define PyExc_GreenletError \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) + +# define PyExc_GreenletExit \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +# define PyGreenlet_New \ + (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +# define PyGreenlet_GetCurrent \ + (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +# define PyGreenlet_Throw \ + (*(PyObject * (*)(PyGreenlet * self, \ + PyObject * typ, \ + PyObject * val, \ + PyObject * tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +# define PyGreenlet_Switch \ + (*(PyObject * \ + (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +# define PyGreenlet_SetParent \ + (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* + * PyGreenlet_GetParent(PyObject* greenlet) + * + * return greenlet.parent; + * + * This could return NULL even if there is no exception active. + * If it does not return NULL, you are responsible for decrementing the + * reference count. + */ +# define PyGreenlet_GetParent \ + (*(PyGreenlet* (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) + +/* + * deprecated, undocumented alias. + */ +# define PyGreenlet_GET_PARENT PyGreenlet_GetParent + +# define PyGreenlet_MAIN \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_MAIN_NUM]) + +# define PyGreenlet_STARTED \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_STARTED_NUM]) + +# define PyGreenlet_ACTIVE \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) + + + + +/* Macro that imports greenlet and initializes C API */ +/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we + keep the older definition to be sure older code that might have a copy of + the header still works. */ +# define PyGreenlet_Import() \ + { \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ + } + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */ diff --git a/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst new file mode 100644 index 00000000..c37cae49 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/METADATA new file mode 100644 index 00000000..f54bb5ca --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/METADATA @@ -0,0 +1,113 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 3.1.2 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/jinja/ +Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe (>=2.0) +Provides-Extra: i18n +Requires-Dist: Babel (>=2.7) ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} + + {% endblock %} + + +Donate +------ + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://jinja.palletsprojects.com/ +- Changes: https://jinja.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Jinja2/ +- Source Code: https://github.com/pallets/jinja/ +- Issue Tracker: https://github.com/pallets/jinja/issues/ +- Website: https://palletsprojects.com/p/jinja/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/RECORD new file mode 100644 index 00000000..b972dd90 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/RECORD @@ -0,0 +1,58 @@ +Jinja2-3.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-3.1.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-3.1.2.dist-info/METADATA,sha256=PZ6v2SIidMNixR7MRUX9f7ZWsPwtXanknqiZUmRbh4U,3539 +Jinja2-3.1.2.dist-info/RECORD,, +Jinja2-3.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +Jinja2-3.1.2.dist-info/entry_points.txt,sha256=zRd62fbqIyfUpsRtU7EVIFyiu1tPwfgO7EvPErnxgTE,59 +Jinja2-3.1.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=8vGduD8ytwgD6GDSqpYc2m3aU-T7PKOAddvVXgGr_Fs,1927 +jinja2/__pycache__/__init__.cpython-39.pyc,, +jinja2/__pycache__/_identifier.cpython-39.pyc,, +jinja2/__pycache__/async_utils.cpython-39.pyc,, +jinja2/__pycache__/bccache.cpython-39.pyc,, +jinja2/__pycache__/compiler.cpython-39.pyc,, +jinja2/__pycache__/constants.cpython-39.pyc,, +jinja2/__pycache__/debug.cpython-39.pyc,, +jinja2/__pycache__/defaults.cpython-39.pyc,, +jinja2/__pycache__/environment.cpython-39.pyc,, +jinja2/__pycache__/exceptions.cpython-39.pyc,, +jinja2/__pycache__/ext.cpython-39.pyc,, +jinja2/__pycache__/filters.cpython-39.pyc,, +jinja2/__pycache__/idtracking.cpython-39.pyc,, +jinja2/__pycache__/lexer.cpython-39.pyc,, +jinja2/__pycache__/loaders.cpython-39.pyc,, +jinja2/__pycache__/meta.cpython-39.pyc,, +jinja2/__pycache__/nativetypes.cpython-39.pyc,, +jinja2/__pycache__/nodes.cpython-39.pyc,, +jinja2/__pycache__/optimizer.cpython-39.pyc,, +jinja2/__pycache__/parser.cpython-39.pyc,, +jinja2/__pycache__/runtime.cpython-39.pyc,, +jinja2/__pycache__/sandbox.cpython-39.pyc,, +jinja2/__pycache__/tests.cpython-39.pyc,, +jinja2/__pycache__/utils.cpython-39.pyc,, +jinja2/__pycache__/visitor.cpython-39.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=dHlbTeaxFPtAOQEYOGYh_PHcDT0rsDaUJAFDl_0XtTg,2472 +jinja2/bccache.py,sha256=mhz5xtLxCcHRAa56azOhphIAe19u1we0ojifNMClDio,14061 +jinja2/compiler.py,sha256=Gs-N8ThJ7OWK4-reKoO8Wh1ZXz95MVphBKNVf75qBr8,72172 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=iWJ432RadxJNnaMOPrjIDInz50UEgni3_HKuFXi2vuQ,6299 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=6uHIcc7ZblqOMdx_uYNKqRnnwAF0_nzbyeMP9FFtuh4,61349 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=ivr3P7LKbddiXDVez20EflcO3q2aHQwz9P_PgWGHVqE,31502 +jinja2/filters.py,sha256=9js1V-h2RlyW90IhLiBGLM2U-k6SCy2F4BUUMgB3K9Q,53509 +jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 +jinja2/lexer.py,sha256=DW2nX9zk-6MWp65YR2bqqj0xqCvLtD-u9NWT8AnFRxQ,29726 +jinja2/loaders.py,sha256=BfptfvTVpClUd-leMkHczdyPNYFzp_n7PKOJ98iyHOg,23207 +jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 +jinja2/nativetypes.py,sha256=DXgORDPRmVWgy034H0xL8eF7qYoK3DrMxs-935d0Fzk,4226 +jinja2/nodes.py,sha256=i34GPRAZexXMT6bwuf5SEyvdmS-bRCy9KMjwN5O6pjk,34550 +jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 +jinja2/parser.py,sha256=nHd-DFHbiygvfaPtm9rcQXJChZG7DPsWfiEsqfwKerY,39595 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=5CmD5BjbEJxSiDNTFBeKCaq8qU4aYD2v6q2EluyExms,33476 +jinja2/sandbox.py,sha256=Y0xZeXQnH6EX5VjaV2YixESxoepnRbW_3UeQosaBU3M,14584 +jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 +jinja2/utils.py,sha256=u9jXESxGn8ATZNVolwmkjUVu4SA-tLgV0W7PcSfPfdQ,23965 +jinja2/visitor.py,sha256=MH14C6yq24G_KVtWzjwaI7Wg14PCJIYlWW1kpkxYak0,3568 diff --git a/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/WHEEL new file mode 100644 index 00000000..becc9a66 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt new file mode 100644 index 00000000..7b9666c8 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract[i18n] diff --git a/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/top_level.txt b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/top_level.txt new file mode 100644 index 00000000..7f7afbf3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/Jinja2-3.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/METADATA new file mode 100644 index 00000000..bced1652 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/METADATA @@ -0,0 +1,93 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 2.1.3 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/markupsafe/ +Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + + >>> # escape replaces special characters and wraps in Markup + >>> escape("") + Markup('<script>alert(document.cookie);</script>') + + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup("Hello") + Markup('hello') + + >>> escape(Markup("Hello")) + Markup('hello') + + >>> # Markup is a str subclass + >>> # methods and operators escape their arguments + >>> template = Markup("Hello {name}") + >>> template.format(name='"World"') + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://markupsafe.palletsprojects.com/ +- Changes: https://markupsafe.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/MarkupSafe/ +- Source Code: https://github.com/pallets/markupsafe/ +- Issue Tracker: https://github.com/pallets/markupsafe/issues/ +- Chat: https://discord.gg/pallets diff --git a/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/RECORD new file mode 100644 index 00000000..df1146bc --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/RECORD @@ -0,0 +1,14 @@ +MarkupSafe-2.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-2.1.3.dist-info/LICENSE.rst,sha256=RjHsDbX9kKVH4zaBcmTGeYIUM4FG-KyUtKV_lu6MnsQ,1503 +MarkupSafe-2.1.3.dist-info/METADATA,sha256=5gU_TQw6eHpTaqkI6SPeZje6KTPlJPAV82uNiL3naKE,3096 +MarkupSafe-2.1.3.dist-info/RECORD,, +MarkupSafe-2.1.3.dist-info/WHEEL,sha256=eep6QWEFiQfg2wcclssb_WY-D33AnLYLnEKGA9Rn-VU,100 +MarkupSafe-2.1.3.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=GsRaSTjrhvg6c88PnPJNqm4MafU_mFatfXz4-h80-Qc,10642 +markupsafe/__pycache__/__init__.cpython-39.pyc,, +markupsafe/__pycache__/_native.cpython-39.pyc,, +markupsafe/_native.py,sha256=_Q7UsXCOvgdonCgqG3l5asANI6eo50EKnDM-mlwEC5M,1776 +markupsafe/_speedups.c,sha256=n3jzzaJwXcoN8nTFyA53f3vSqsWK2vujI-v6QYifjhQ,7403 +markupsafe/_speedups.cp39-win_amd64.pyd,sha256=C9Gp0IYxw1vmNFBHqQbfz6VpOvktg5A2WcPwqCAWwZ0,15872 +markupsafe/_speedups.pyi,sha256=f5QtwIOP0eLrxh2v5p6SmaYmlcHIGIfmz0DovaqL0OU,238 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL new file mode 100644 index 00000000..d5ae687e --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: false +Tag: cp39-cp39-win_amd64 + diff --git a/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt new file mode 100644 index 00000000..75bf7292 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/LICENSE b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/LICENSE new file mode 100644 index 00000000..7bf9bbe9 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright 2005-2023 SQLAlchemy authors and contributors . + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/METADATA new file mode 100644 index 00000000..c6f0ab6a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/METADATA @@ -0,0 +1,238 @@ +Metadata-Version: 2.1 +Name: SQLAlchemy +Version: 2.0.22 +Summary: Database Abstraction Library +Home-page: https://www.sqlalchemy.org +Author: Mike Bayer +Author-email: mike_mp@zzzcomputing.com +License: MIT +Project-URL: Documentation, https://docs.sqlalchemy.org +Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/ +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Database :: Front-Ends +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: typing-extensions >=4.2.0 +Requires-Dist: greenlet !=0.4.17 ; platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32"))))) +Requires-Dist: importlib-metadata ; python_version < "3.8" +Provides-Extra: aiomysql +Requires-Dist: greenlet !=0.4.17 ; extra == 'aiomysql' +Requires-Dist: aiomysql >=0.2.0 ; extra == 'aiomysql' +Provides-Extra: aiosqlite +Requires-Dist: greenlet !=0.4.17 ; extra == 'aiosqlite' +Requires-Dist: aiosqlite ; extra == 'aiosqlite' +Requires-Dist: typing-extensions !=3.10.0.1 ; extra == 'aiosqlite' +Provides-Extra: asyncio +Requires-Dist: greenlet !=0.4.17 ; extra == 'asyncio' +Provides-Extra: asyncmy +Requires-Dist: greenlet !=0.4.17 ; extra == 'asyncmy' +Requires-Dist: asyncmy !=0.2.4,!=0.2.6,>=0.2.3 ; extra == 'asyncmy' +Provides-Extra: mariadb_connector +Requires-Dist: mariadb !=1.1.2,!=1.1.5,>=1.0.1 ; extra == 'mariadb_connector' +Provides-Extra: mssql +Requires-Dist: pyodbc ; extra == 'mssql' +Provides-Extra: mssql_pymssql +Requires-Dist: pymssql ; extra == 'mssql_pymssql' +Provides-Extra: mssql_pyodbc +Requires-Dist: pyodbc ; extra == 'mssql_pyodbc' +Provides-Extra: mypy +Requires-Dist: mypy >=0.910 ; extra == 'mypy' +Provides-Extra: mysql +Requires-Dist: mysqlclient >=1.4.0 ; extra == 'mysql' +Provides-Extra: mysql_connector +Requires-Dist: mysql-connector-python ; extra == 'mysql_connector' +Provides-Extra: oracle +Requires-Dist: cx-oracle >=7 ; extra == 'oracle' +Provides-Extra: oracle_oracledb +Requires-Dist: oracledb >=1.0.1 ; extra == 'oracle_oracledb' +Provides-Extra: postgresql +Requires-Dist: psycopg2 >=2.7 ; extra == 'postgresql' +Provides-Extra: postgresql_asyncpg +Requires-Dist: greenlet !=0.4.17 ; extra == 'postgresql_asyncpg' +Requires-Dist: asyncpg ; extra == 'postgresql_asyncpg' +Provides-Extra: postgresql_pg8000 +Requires-Dist: pg8000 >=1.29.1 ; extra == 'postgresql_pg8000' +Provides-Extra: postgresql_psycopg +Requires-Dist: psycopg >=3.0.7 ; extra == 'postgresql_psycopg' +Provides-Extra: postgresql_psycopg2binary +Requires-Dist: psycopg2-binary ; extra == 'postgresql_psycopg2binary' +Provides-Extra: postgresql_psycopg2cffi +Requires-Dist: psycopg2cffi ; extra == 'postgresql_psycopg2cffi' +Provides-Extra: postgresql_psycopgbinary +Requires-Dist: psycopg[binary] >=3.0.7 ; extra == 'postgresql_psycopgbinary' +Provides-Extra: pymysql +Requires-Dist: pymysql ; extra == 'pymysql' +Provides-Extra: sqlcipher +Requires-Dist: sqlcipher3-binary ; extra == 'sqlcipher' + +SQLAlchemy +========== + +|PyPI| |Python| |Downloads| + +.. |PyPI| image:: https://img.shields.io/pypi/v/sqlalchemy + :target: https://pypi.org/project/sqlalchemy + :alt: PyPI + +.. |Python| image:: https://img.shields.io/pypi/pyversions/sqlalchemy + :target: https://pypi.org/project/sqlalchemy + :alt: PyPI - Python Version + +.. |Downloads| image:: https://static.pepy.tech/badge/sqlalchemy/month + :target: https://pepy.tech/project/sqlalchemy + :alt: PyPI - Downloads + + +The Python SQL Toolkit and Object Relational Mapper + +Introduction +------------- + +SQLAlchemy is the Python SQL toolkit and Object Relational Mapper +that gives application developers the full power and +flexibility of SQL. SQLAlchemy provides a full suite +of well known enterprise-level persistence patterns, +designed for efficient and high-performing database +access, adapted into a simple and Pythonic domain +language. + +Major SQLAlchemy features include: + +* An industrial strength ORM, built + from the core on the identity map, unit of work, + and data mapper patterns. These patterns + allow transparent persistence of objects + using a declarative configuration system. + Domain models + can be constructed and manipulated naturally, + and changes are synchronized with the + current transaction automatically. +* A relationally-oriented query system, exposing + the full range of SQL's capabilities + explicitly, including joins, subqueries, + correlation, and most everything else, + in terms of the object model. + Writing queries with the ORM uses the same + techniques of relational composition you use + when writing SQL. While you can drop into + literal SQL at any time, it's virtually never + needed. +* A comprehensive and flexible system + of eager loading for related collections and objects. + Collections are cached within a session, + and can be loaded on individual access, all + at once using joins, or by query per collection + across the full result set. +* A Core SQL construction system and DBAPI + interaction layer. The SQLAlchemy Core is + separate from the ORM and is a full database + abstraction layer in its own right, and includes + an extensible Python-based SQL expression + language, schema metadata, connection pooling, + type coercion, and custom types. +* All primary and foreign key constraints are + assumed to be composite and natural. Surrogate + integer primary keys are of course still the + norm, but SQLAlchemy never assumes or hardcodes + to this model. +* Database introspection and generation. Database + schemas can be "reflected" in one step into + Python structures representing database metadata; + those same structures can then generate + CREATE statements right back out - all within + the Core, independent of the ORM. + +SQLAlchemy's philosophy: + +* SQL databases behave less and less like object + collections the more size and performance start to + matter; object collections behave less and less like + tables and rows the more abstraction starts to matter. + SQLAlchemy aims to accommodate both of these + principles. +* An ORM doesn't need to hide the "R". A relational + database provides rich, set-based functionality + that should be fully exposed. SQLAlchemy's + ORM provides an open-ended set of patterns + that allow a developer to construct a custom + mediation layer between a domain model and + a relational schema, turning the so-called + "object relational impedance" issue into + a distant memory. +* The developer, in all cases, makes all decisions + regarding the design, structure, and naming conventions + of both the object model as well as the relational + schema. SQLAlchemy only provides the means + to automate the execution of these decisions. +* With SQLAlchemy, there's no such thing as + "the ORM generated a bad query" - you + retain full control over the structure of + queries, including how joins are organized, + how subqueries and correlation is used, what + columns are requested. Everything SQLAlchemy + does is ultimately the result of a developer-initiated + decision. +* Don't use an ORM if the problem doesn't need one. + SQLAlchemy consists of a Core and separate ORM + component. The Core offers a full SQL expression + language that allows Pythonic construction + of SQL constructs that render directly to SQL + strings for a target database, returning + result sets that are essentially enhanced DBAPI + cursors. +* Transactions should be the norm. With SQLAlchemy's + ORM, nothing goes to permanent storage until + commit() is called. SQLAlchemy encourages applications + to create a consistent means of delineating + the start and end of a series of operations. +* Never render a literal value in a SQL statement. + Bound parameters are used to the greatest degree + possible, allowing query optimizers to cache + query plans effectively and making SQL injection + attacks a non-issue. + +Documentation +------------- + +Latest documentation is at: + +https://www.sqlalchemy.org/docs/ + +Installation / Requirements +--------------------------- + +Full documentation for installation is at +`Installation `_. + +Getting Help / Development / Bug reporting +------------------------------------------ + +Please refer to the `SQLAlchemy Community Guide `_. + +Code of Conduct +--------------- + +Above all, SQLAlchemy places great emphasis on polite, thoughtful, and +constructive communication between users and developers. +Please see our current Code of Conduct at +`Code of Conduct `_. + +License +------- + +SQLAlchemy is distributed under the `MIT license +`_. + diff --git a/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/RECORD new file mode 100644 index 00000000..4e32366a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/RECORD @@ -0,0 +1,524 @@ +SQLAlchemy-2.0.22.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +SQLAlchemy-2.0.22.dist-info/LICENSE,sha256=ZbcQGZNtpoLy8YjvH-nyoobTdOwtEgtXopPVzxy6pCo,1119 +SQLAlchemy-2.0.22.dist-info/METADATA,sha256=6bQzA6Q-ZmrfZ6uCJ43B5Rjxokp2E8KD8uMt0ppj8Nc,9667 +SQLAlchemy-2.0.22.dist-info/RECORD,, +SQLAlchemy-2.0.22.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +SQLAlchemy-2.0.22.dist-info/WHEEL,sha256=2xSj8c4s_gFbWpcImYQptdXS3JLuzC2uK5Om8I_SEKg,100 +SQLAlchemy-2.0.22.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 +sqlalchemy/__init__.py,sha256=mzdq6GxwHCI-rx9_kG7m0EiufzptVbhdCEcU2IjEV88,12993 +sqlalchemy/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/__pycache__/events.cpython-39.pyc,, +sqlalchemy/__pycache__/exc.cpython-39.pyc,, +sqlalchemy/__pycache__/inspection.cpython-39.pyc,, +sqlalchemy/__pycache__/log.cpython-39.pyc,, +sqlalchemy/__pycache__/schema.cpython-39.pyc,, +sqlalchemy/__pycache__/types.cpython-39.pyc,, +sqlalchemy/connectors/__init__.py,sha256=sjPX1Mb2nWgRHLZY0mF350mGiqpi2CYBs2A1b8dh_wE,494 +sqlalchemy/connectors/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/connectors/__pycache__/pyodbc.cpython-39.pyc,, +sqlalchemy/connectors/pyodbc.py,sha256=5LOfu6JNAW2JKn992sV-WsQEfA5xRI41T16dv1Ffmy8,8700 +sqlalchemy/cyextension/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sqlalchemy/cyextension/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/cyextension/collections.cp39-win_amd64.pyd,sha256=rVh8KkJQlTyNXomHQxM1xtLGsR2P2FH3gxHZsmAAfog,174080 +sqlalchemy/cyextension/collections.pyx,sha256=UY81HxvMAD4MOFR52SjzUbLHCGGcHZDSfK6gw6AYB8A,12726 +sqlalchemy/cyextension/immutabledict.cp39-win_amd64.pyd,sha256=xL3M_zos02JYyf12ipOuLTG-25hxjex5hg0jLNnqY-U,73728 +sqlalchemy/cyextension/immutabledict.pxd,sha256=JsNJYZIekkbtQQ2Tz6Bn1bO1g07yXztY9bb3rvH1e0Y,43 +sqlalchemy/cyextension/immutabledict.pyx,sha256=VmhtF8aDXjEVVdA80LRY1iP85lNMwcz7vB6hZkAOGB0,3412 +sqlalchemy/cyextension/processors.cp39-win_amd64.pyd,sha256=f_P5_mEA8xnJeIc74Zp74io3EzLkUQkHu13JAEzESS0,59904 +sqlalchemy/cyextension/processors.pyx,sha256=ZXuoi-hPRI9pVSbp6QbfJwy6S5kVCUZ8qj_h5-NvAFA,1607 +sqlalchemy/cyextension/resultproxy.cp39-win_amd64.pyd,sha256=ZfxLAemjo2iGKHcW7yLWBSA4YKHt5AHZndPaVhN4wuM,61952 +sqlalchemy/cyextension/resultproxy.pyx,sha256=qlk8eBpFo3UYbwQChdIWa3RqWXczuUL8ahulcLCL1bI,2573 +sqlalchemy/cyextension/util.cp39-win_amd64.pyd,sha256=HUiL1ya2hhSXrsy4mysVsoTY8ZmGOVRyhDrw0OBYGE0,73728 +sqlalchemy/cyextension/util.pyx,sha256=H2FEg9uAAWO9UcNFyrfVuPhOznTq3h9UdjfmJ2BRD1Y,2374 +sqlalchemy/dialects/__init__.py,sha256=mI6oU3xkTQRqyjyrgNhLWn5zlMfn7A3InQ3GK78X5bQ,1831 +sqlalchemy/dialects/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/dialects/__pycache__/_typing.cpython-39.pyc,, +sqlalchemy/dialects/_typing.py,sha256=hA9jNttJjmVWDHKybSMSFWIlmRv2r5kuQPp8IeViifY,667 +sqlalchemy/dialects/mssql/__init__.py,sha256=dvJCLhXDMkDvtAXT_26kBllhR7-geM9nrZOUxr2IG6Q,1928 +sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/dialects/mssql/__pycache__/base.cpython-39.pyc,, +sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-39.pyc,, +sqlalchemy/dialects/mssql/__pycache__/json.cpython-39.pyc,, +sqlalchemy/dialects/mssql/__pycache__/provision.cpython-39.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-39.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-39.pyc,, +sqlalchemy/dialects/mssql/base.py,sha256=7ZBTxpxxbC7mWB96i8ZsfuvmE0Jzn6Pg2XsuQWFqwCA,137935 +sqlalchemy/dialects/mssql/information_schema.py,sha256=ufbEeGAFsciot3MmKPmFFhW95r57F_ORHULBS_UuUSw,8320 +sqlalchemy/dialects/mssql/json.py,sha256=VOrBSxJWh7Fj-zIBA5aYZwx37DJq1OrWpJqc0xtWPhQ,4700 +sqlalchemy/dialects/mssql/provision.py,sha256=hlKU-pYiCAMlLtEOjEhPr7ESgvQ4iLCAywtDXNQqZus,5142 +sqlalchemy/dialects/mssql/pymssql.py,sha256=yA5NnGBs0YSzzjnGlqMrtHKdo4XHyJ6zKcySOvAw2ZA,4154 +sqlalchemy/dialects/mssql/pyodbc.py,sha256=iqjC6TMIZ1Ve9h67M16sEiirbH9M6v0sa-yOr8Pt9ds,27552 +sqlalchemy/dialects/mysql/__init__.py,sha256=060B9NtuQqUb8vNXDm8bdOGUUi6SUi_757-19DDhOQM,2245 +sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/base.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/dml.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/expression.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/json.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/provision.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-39.pyc,, +sqlalchemy/dialects/mysql/__pycache__/types.cpython-39.pyc,, +sqlalchemy/dialects/mysql/aiomysql.py,sha256=xXvFyEjL613scXbU490iwK4fTegDGDojMUO565qo0iE,9831 +sqlalchemy/dialects/mysql/asyncmy.py,sha256=Ilpd6rTcXFr40iepVerDuZmni8db4tGLiK2j0B9pnII,9966 +sqlalchemy/dialects/mysql/base.py,sha256=STvsgdtsBAb8x0fLXNMFACYTAjeCJQltm-mLWWdUTOs,122719 +sqlalchemy/dialects/mysql/cymysql.py,sha256=RdwzBclxwN3uXWTT34YySR0rQfTjVzZDSadhzlOqhag,2375 +sqlalchemy/dialects/mysql/dml.py,sha256=dDUvRalIG5l6_Iawkj0n-6p0NRfYfdP1wRl121qOYek,7855 +sqlalchemy/dialects/mysql/enumerated.py,sha256=whCwVR5DmKh455d4EVg2XHItfvLtuzxA5bWOWzK6Cnw,8683 +sqlalchemy/dialects/mysql/expression.py,sha256=-RmnmFCjWn16L_Nn82541wr6I3bUvvMk_6L7WhmeAK4,4206 +sqlalchemy/dialects/mysql/json.py,sha256=hZr1MD4W6BaItKT5LRStDRQbr7wcer4YdWbkh47-RTA,2341 +sqlalchemy/dialects/mysql/mariadb.py,sha256=SdFqsWMjIFwoC0bhlqksN4ju0Mnq3-iUDCKq7_idWk0,876 +sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=P5DAHcFKMCDZ-LN-H56V4jZsik1b7zAEoqeBEr7Aex4,8976 +sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=8a2BZ_ChVR5HvTzonq0DtYoInD3iV4ihbA_9EbgtUxY,5845 +sqlalchemy/dialects/mysql/mysqldb.py,sha256=4ZLfGACIMD5icglEqx6jTj3W4adT_ANCV1xo5kvAHYw,9962 +sqlalchemy/dialects/mysql/provision.py,sha256=jdtfrsATv7hoMcepkMxHVG5QV2YkA92bg01CnOR9VMs,3327 +sqlalchemy/dialects/mysql/pymysql.py,sha256=f09IxnUy9HFCEnNrW-RqxvByVUREYWRpbHsa1yIPDGk,3045 +sqlalchemy/dialects/mysql/pyodbc.py,sha256=dfz0mekJDsOIvjs5utBRNltUr9YyhYuUH1rsUPb4NjI,4426 +sqlalchemy/dialects/mysql/reflection.py,sha256=ZUtpHpdhf-okCcZkeW91MqcgJ5fwXDhItYO9kOoDbC0,23228 +sqlalchemy/dialects/mysql/reserved_words.py,sha256=KOR71_hBCzivGutG54Yq_K5t7dT6lgRBey0TcztWI3I,9712 +sqlalchemy/dialects/mysql/types.py,sha256=vOi0kn2OLaWTjPKTNz5xPcS-jiHRLv_l1no_oA_jdYQ,25031 +sqlalchemy/dialects/oracle/__init__.py,sha256=tx0bajj7x4JTS-eB5m9Edgv9N6SNG0E-zG5QfQhshoo,1381 +sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/dialects/oracle/__pycache__/base.cpython-39.pyc,, +sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-39.pyc,, +sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-39.pyc,, +sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-39.pyc,, +sqlalchemy/dialects/oracle/__pycache__/provision.cpython-39.pyc,, +sqlalchemy/dialects/oracle/__pycache__/types.cpython-39.pyc,, +sqlalchemy/dialects/oracle/base.py,sha256=zSgcFu_3P5Wx_ALQDmNWI1F904LMUebfGg2z3Z79J2g,121268 +sqlalchemy/dialects/oracle/cx_oracle.py,sha256=J6-7clFWFWYju_M6bgXX0xqSl5_ov0hJolQyaWETX9A,56592 +sqlalchemy/dialects/oracle/dictionary.py,sha256=yRmt5b218G1Q5pZR5kF1ocsusT4XAgl3v_t9WhKqlko,19993 +sqlalchemy/dialects/oracle/oracledb.py,sha256=ZweQdl0ZKR3jaXowa14JBlWg1KXcabm_FWhOR4vqPsk,3566 +sqlalchemy/dialects/oracle/provision.py,sha256=i4Ja1rCJLs0jIcpzt0PfcANHHoDOSWEpxqBvWYAdOcs,8269 +sqlalchemy/dialects/oracle/types.py,sha256=vF5neW-vxJcl9nLL9x74zn05gmU-_wkCTNmF0diqqaw,7738 +sqlalchemy/dialects/postgresql/__init__.py,sha256=kx5Iwob5j2_gYXMVF2qM6qIH5DCXxw1UYXVjuCgpvys,3897 +sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/array.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/base.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/json.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/types.cpython-39.pyc,, +sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=_DTODxy9UrjvqDk20-ZjEUAYhrzRFiosaH4GHp4mnNM,5841 +sqlalchemy/dialects/postgresql/array.py,sha256=3C-g6RRWgB4Th_MV4UWpbxXo8UT2-GDRxmXowyyml5A,14108 +sqlalchemy/dialects/postgresql/asyncpg.py,sha256=Ewx0EQSCPYQIgwFcq0o0KiWRBDUpCmk70YlGZGKcAiE,41117 +sqlalchemy/dialects/postgresql/base.py,sha256=YGA-W53agA-vZJhjHabbhSwNLU127mO6bac7JvqByW8,180524 +sqlalchemy/dialects/postgresql/dml.py,sha256=jESBXHjBdT-xzHSVADNz-2ljH-4I-rjjGuhKzrkGJII,11513 +sqlalchemy/dialects/postgresql/ext.py,sha256=MdYxZshShFutBq657bDNyq68kzczovktkJeuGq-WqmM,16749 +sqlalchemy/dialects/postgresql/hstore.py,sha256=x9kAVfXLHYDQfqg6IHPUhr4dvFSsBPoMKoBhqyaF_Vo,11929 +sqlalchemy/dialects/postgresql/json.py,sha256=vrSiTBejjt54B9JSOixbh-oR8fg2OGIJLW2gOsmb0gI,11528 +sqlalchemy/dialects/postgresql/named_types.py,sha256=fsAflctGz5teUyM7h2s0Z2Na14Dtt4vEj0rzf2VtRwU,17588 +sqlalchemy/dialects/postgresql/operators.py,sha256=oe7NQRjOkJM46ISEnNIGxV4qOm2ANrqn3PLKHqj6bmY,2928 +sqlalchemy/dialects/postgresql/pg8000.py,sha256=F6P7YT5iXWq3sYDIyiP1Qxoq3PrE7zFaUnivwMdRJSQ,19284 +sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=8imUP46LsmtnVozUZa2qEtDcDHwjrYg4c2tSJsbCpfo,9169 +sqlalchemy/dialects/postgresql/provision.py,sha256=_sD_42mkypvAwDxwT6xeCGnHD5EMRVubIN5eonZ8MsQ,5678 +sqlalchemy/dialects/postgresql/psycopg.py,sha256=vcqBE7Nr9mfSRGUeg9rSz94kfWDiCco_xabLu16qQyM,22984 +sqlalchemy/dialects/postgresql/psycopg2.py,sha256=e7tMKc9ey0R2Zz4AcjF015Gn8Fq_mvIYCdgQSXGaeDU,32468 +sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=gITk63w4Gi4wXQxBW22a0VGVUg-oBMyfg_YgIHc5kww,1800 +sqlalchemy/dialects/postgresql/ranges.py,sha256=qf2axlhqdFVjF7jHR37YZwDbiq8xA4KNstnuClvBX4o,31166 +sqlalchemy/dialects/postgresql/types.py,sha256=HuXQ2XabYNmWRkClpHTXCaB8vbI6tzwQI7y1aNZKNEo,7240 +sqlalchemy/dialects/sqlite/__init__.py,sha256=CHJgBNgr7eufrgF-0l27xohu4N317u1IOy7Hyyrxx0o,1230 +sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-39.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/base.cpython-39.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-39.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/json.cpython-39.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-39.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-39.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-39.pyc,, +sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=PiO8heyB6GXeTC4lxsptX6eKQlKvyy0s9UGeBEAdxog,11258 +sqlalchemy/dialects/sqlite/base.py,sha256=tJBVZFTNgmNqsBtiKbaUNgToq9G5QmnPCt5MnWKAmgk,99480 +sqlalchemy/dialects/sqlite/dml.py,sha256=KRBENBnUuZrraGSMmg2ohgQgPPcgCMCmEoKkuhn6Yq8,8674 +sqlalchemy/dialects/sqlite/json.py,sha256=IZR_pBgC9sWLtP5SXm-o5FR6SScGLi4DEMGbLJzWN8E,2619 +sqlalchemy/dialects/sqlite/provision.py,sha256=2LNwUT3zftd3WeGBJ9UsVKtwXn38KEdDxwZaJ2WXNjM,5575 +sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=F8y3R0dILJcmqUzHotYF4tLUppe3PSU_C7Xdqm4YV0o,5502 +sqlalchemy/dialects/sqlite/pysqlite.py,sha256=fKhH8ZGMW5XK1F_H9mqz7ofmR4nrsGrGdAgNMPizAEI,28644 +sqlalchemy/dialects/type_migration_guidelines.txt,sha256=gyh3JCauAIFi_9XEfqm3vYv_jb2Eqcz2HjpmC9ZEPMM,8384 +sqlalchemy/engine/__init__.py,sha256=ZlB1LVIV2GjvwyvKm2W0qVYQf51g8AiQvTkHGb1C8A0,2880 +sqlalchemy/engine/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/_py_processors.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/_py_row.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/_py_util.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/base.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/characteristics.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/create.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/cursor.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/default.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/events.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/interfaces.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/mock.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/processors.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/reflection.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/result.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/row.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/strategies.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/url.cpython-39.pyc,, +sqlalchemy/engine/__pycache__/util.cpython-39.pyc,, +sqlalchemy/engine/_py_processors.py,sha256=XuNIr2kzSay7mAWy14Aq1q2H3ZcineWY-ERfy0yvWpw,3880 +sqlalchemy/engine/_py_row.py,sha256=WASkBfwldq9LApfe1ILn93amhSc0ReihKic2lLO0gxI,3671 +sqlalchemy/engine/_py_util.py,sha256=HB-18ta-qhMrA1oNIDeobt4TtyqLUTzbfRlkN6elRb0,2313 +sqlalchemy/engine/base.py,sha256=TKKykmCRnMu85DUvrPnUFI_3QEJhr-WFd8T8UpEYi4Q,125611 +sqlalchemy/engine/characteristics.py,sha256=P7JlS02X1DKRSpgqpQPwt2sFsatm1L1hVxdvvw3u95s,2419 +sqlalchemy/engine/create.py,sha256=B1K2S_kTzfXrlOcOaPxJlxmKJWo9pbCpyAnODlJOul8,33489 +sqlalchemy/engine/cursor.py,sha256=igMrHZTi0EpF5Vw-S7TtFPh_jj_gqDEwN4JVMzweYwM,76554 +sqlalchemy/engine/default.py,sha256=v5YqigfF6WI8K0JEXEYNJNbwpKXRTiqWKLD_cm_gJSU,86388 +sqlalchemy/engine/events.py,sha256=3CNIDfSDq0kyRcR11bt5Vapdiks6zMILPih8abqx72I,38343 +sqlalchemy/engine/interfaces.py,sha256=UsNFomh6FEh9cSOhKWaP8EmFVFcbvcw7cXS7wUKlsJA,116230 +sqlalchemy/engine/mock.py,sha256=v52LnYaTC7FxmhXMbjBdfU__Y5tIcnExjyPGTMZcrzw,4310 +sqlalchemy/engine/processors.py,sha256=GvY0nS06PrGMwgwk4HHYX8QGvIUA0vEaNAmuov08BiY,2444 +sqlalchemy/engine/reflection.py,sha256=346Gi59XTjqRffp150QJNhHwgo89pyv0gN1vaaLhhS8,77214 +sqlalchemy/engine/result.py,sha256=2avNWdvbzQIZ1iFqgvAFuc3oyhpVzs7mzJ4pA-QjYoA,80246 +sqlalchemy/engine/row.py,sha256=dM3rJY3ASx_PzFKzu7CUGErJA_aIQYx1DibLAWnzY8M,12360 +sqlalchemy/engine/strategies.py,sha256=Ryy15JovfbIMsF2sM23z0HYJ_7lXRBQlzpLacbn0mLg,461 +sqlalchemy/engine/url.py,sha256=Lxdv29vz0l-FuWuZS7Gn5uLOxR75OPW1wxQpE58OEg4,31607 +sqlalchemy/engine/util.py,sha256=ArgYR663IOWZjG5z9m05cm-8Z-jANtXH0Rvsgz9Zpt4,5833 +sqlalchemy/event/__init__.py,sha256=2QcWKXnqGRkl0lroK7ei8jT2Qbt8SRn_jqlTuYXGLu0,1022 +sqlalchemy/event/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/event/__pycache__/api.cpython-39.pyc,, +sqlalchemy/event/__pycache__/attr.cpython-39.pyc,, +sqlalchemy/event/__pycache__/base.cpython-39.pyc,, +sqlalchemy/event/__pycache__/legacy.cpython-39.pyc,, +sqlalchemy/event/__pycache__/registry.cpython-39.pyc,, +sqlalchemy/event/api.py,sha256=_TjSW28so8R84M_s7gV6oMlgpvZ0MuM0fNxWEMj4BGM,8452 +sqlalchemy/event/attr.py,sha256=o-Vr3RAGxE2mCXIvlMAGWmdb4My6q-JPkNTQdCW3IpI,21079 +sqlalchemy/event/base.py,sha256=Uvv0R9ozvryiePXCc7BBoUk03OeWwE1F5vDctPIRHrM,15445 +sqlalchemy/event/legacy.py,sha256=e_NtSjva3NmKLhM8kaUwLk2D705gjym2lYwrgQS0r9I,8457 +sqlalchemy/event/registry.py,sha256=HKQxAumZHuVgOx2DcQnv7KpHcsQpmmfwT_e-zVLrVw4,11219 +sqlalchemy/events.py,sha256=T8_TlVzRzd0Af9AAKUPXPxROwxeux7KuNhHTG0Cxamg,553 +sqlalchemy/exc.py,sha256=qAEWjEGvoPvEdzLalZfqWSCr7D1OUh1LikZPie0Ld3s,24844 +sqlalchemy/ext/__init__.py,sha256=2ow4CHEH4B_6wyAWKh1wqEbAUXG5ia2z2zASTa0Oqdk,333 +sqlalchemy/ext/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/associationproxy.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/automap.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/baked.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/compiler.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/horizontal_shard.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/hybrid.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/indexable.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/instrumentation.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/mutable.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/orderinglist.cpython-39.pyc,, +sqlalchemy/ext/__pycache__/serializer.cpython-39.pyc,, +sqlalchemy/ext/associationproxy.py,sha256=BM2nYnHnupPpjIWVRyU6k94ZZSD-Sph55nb4qSEs1NA,67988 +sqlalchemy/ext/asyncio/__init__.py,sha256=Qh5SCnlKUSkm1Ko5mzlNZ3_BUuU-aFg0vnlkhEOJdOE,1279 +sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/ext/asyncio/__pycache__/base.cpython-39.pyc,, +sqlalchemy/ext/asyncio/__pycache__/engine.cpython-39.pyc,, +sqlalchemy/ext/asyncio/__pycache__/exc.cpython-39.pyc,, +sqlalchemy/ext/asyncio/__pycache__/result.cpython-39.pyc,, +sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-39.pyc,, +sqlalchemy/ext/asyncio/__pycache__/session.cpython-39.pyc,, +sqlalchemy/ext/asyncio/base.py,sha256=5LzONylHmF9cnoe0yNgoei4rzlBkNY7TneO5Cb2hkxU,9242 +sqlalchemy/ext/asyncio/engine.py,sha256=53cwBLpCgHXiULor-6lvQJzzNENXeBRYDAHoAlkdkqA,49264 +sqlalchemy/ext/asyncio/exc.py,sha256=AeGYi7BtwZGHv4ZWaJl7wzE4u8dRlzi_06V_ipNPdfU,660 +sqlalchemy/ext/asyncio/result.py,sha256=cuvnVyYFR_XLZtPXbnANguvKPjerX34sOEF7odrUD_Q,31530 +sqlalchemy/ext/asyncio/scoping.py,sha256=ZztXoymfmAjMsrjw4siIEpEc-jKmFysukaL-0LssLRo,53929 +sqlalchemy/ext/asyncio/session.py,sha256=klivaJH9O6DMdm7KABtqHcCpWjXeF9AmY46hRyozwnI,64196 +sqlalchemy/ext/automap.py,sha256=VC9p8sDu_EgWfqZ6aGAfVNBuUbnq4O2MjhUfgpY7keA,63089 +sqlalchemy/ext/baked.py,sha256=vHWGGYyceArr5v-nGxgDfwVgnvUjcuGOllAZ5zb_PXI,18392 +sqlalchemy/ext/compiler.py,sha256=pno-btbT4t16LEHUkRyVX5K6ct-MsPfixO41jhUI6R4,20946 +sqlalchemy/ext/declarative/__init__.py,sha256=4a8Wl2P_BqYVYmx-HsPtt_U-NvwpVsAKtfWUSNbA2uY,1883 +sqlalchemy/ext/declarative/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/ext/declarative/__pycache__/extensions.cpython-39.pyc,, +sqlalchemy/ext/declarative/extensions.py,sha256=GcAzNVSWKg6XXFbOIG6U4vXf0e__QB_Y7XWC8d23WhY,20095 +sqlalchemy/ext/horizontal_shard.py,sha256=I8-KZiCgbtSbGww_vOD6OPzMXXRNUg9X4n1fF8EZTRo,17249 +sqlalchemy/ext/hybrid.py,sha256=a_E1GQC958-OinLHIOHlL7WsF00pMTH8cHLASqPH2So,54023 +sqlalchemy/ext/indexable.py,sha256=F3NC4VaUkhrx4jDmaEuJLQ2AXatk9l4l_aVI5Uzazbs,11369 +sqlalchemy/ext/instrumentation.py,sha256=biLs17X8UIGzisx-jC6JOphtldi-mlfR2bfumnlar70,16175 +sqlalchemy/ext/mutable.py,sha256=3s_qKPt6It7A-7gdQxjL5p7kFE72raf0lgjimK__lFk,38471 +sqlalchemy/ext/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sqlalchemy/ext/mypy/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/ext/mypy/__pycache__/apply.cpython-39.pyc,, +sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-39.pyc,, +sqlalchemy/ext/mypy/__pycache__/infer.cpython-39.pyc,, +sqlalchemy/ext/mypy/__pycache__/names.cpython-39.pyc,, +sqlalchemy/ext/mypy/__pycache__/plugin.cpython-39.pyc,, +sqlalchemy/ext/mypy/__pycache__/util.cpython-39.pyc,, +sqlalchemy/ext/mypy/apply.py,sha256=O3Rh-FCWiWJPeUT0dVsFD_fcL5oEJbrAkB0bAJ5I7Sg,10821 +sqlalchemy/ext/mypy/decl_class.py,sha256=hfTpozOGwxeX9Vbkm12i8SawR91ngs1nfsiPC_f0PSg,17892 +sqlalchemy/ext/mypy/infer.py,sha256=BsiKdH1IvbgRGpqGzDPt1bkDXCcBjzEhQcyHdaToohs,19954 +sqlalchemy/ext/mypy/names.py,sha256=O6QByUZyrmctdS7j1pg2iq0tuA1MxDgGeVsjd988y4o,10967 +sqlalchemy/ext/mypy/plugin.py,sha256=XF1E_XqZJA-RnI_d0_FWvwFIBTyBRA95sFUP0uqUygk,10053 +sqlalchemy/ext/mypy/util.py,sha256=2fhfA_TFg-yhVirHYZr7c7clIPb1cEu72SyFx8NvO-c,9746 +sqlalchemy/ext/orderinglist.py,sha256=xeonIRL-m5Y4vB2n_1Nab8B61geRLHR0kyC_KnXTS7k,14800 +sqlalchemy/ext/serializer.py,sha256=BhyC7ydKcKKz4vlxyU_8ranVigiGSO1hw_LieCxLCgM,6363 +sqlalchemy/future/__init__.py,sha256=Iio4lD-SrIcuBq0gP7MRgVnU4v36gIMLHiQrSKy-sPM,532 +sqlalchemy/future/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/future/__pycache__/engine.cpython-39.pyc,, +sqlalchemy/future/engine.py,sha256=4iO5THuQWIy3UGpOOMml23daun4wHdRZ6JVSwWykjJI,514 +sqlalchemy/inspection.py,sha256=tJc_KriMGJ6kSRkKn5MvhxooFbPEAq3W5l-ggFw2sdE,5326 +sqlalchemy/log.py,sha256=nSJXui1oKhz2crx7Y2W01vpBXXobmEhpWJbMlQWQ1Yc,8924 +sqlalchemy/orm/__init__.py,sha256=M1pqaRU6NQuDcycnrbkKHcKjNAo3ZbGne3MOFPK0n1o,8633 +sqlalchemy/orm/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/_orm_constructors.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/_typing.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/attributes.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/base.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/bulk_persistence.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/clsregistry.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/collections.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/context.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/decl_api.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/decl_base.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/dependency.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/descriptor_props.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/dynamic.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/evaluator.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/events.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/exc.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/identity.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/instrumentation.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/interfaces.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/loading.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/mapped_collection.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/mapper.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/path_registry.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/persistence.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/properties.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/query.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/relationships.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/scoping.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/session.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/state.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/state_changes.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/strategies.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/strategy_options.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/sync.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/unitofwork.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/util.cpython-39.pyc,, +sqlalchemy/orm/__pycache__/writeonly.cpython-39.pyc,, +sqlalchemy/orm/_orm_constructors.py,sha256=FvA6bMIZLANrM6VsOglFC3PoEr0gjPs7ATRr4fgktyI,102286 +sqlalchemy/orm/_typing.py,sha256=xnW-2U1AARA6dxcd5nlz6yCaCbHigLK7B-5cmAnA3zs,5176 +sqlalchemy/orm/attributes.py,sha256=9O6cwX47F_duUkFHRH90sV4sluSIpXDaB4HxDn5aLTQ,95420 +sqlalchemy/orm/base.py,sha256=AiQaf2ODQ0-95siFil_XcpsRoUfnnIOxqP1I82SPgjE,28695 +sqlalchemy/orm/bulk_persistence.py,sha256=f1h1dUt6GO2hnPnttno9aYy2KuULE43698f2qv97EBE,71910 +sqlalchemy/orm/clsregistry.py,sha256=dgGogYd-ED3EUIgQkdUesequKBiGTs7csAB6Z5ROjrU,18521 +sqlalchemy/orm/collections.py,sha256=HhJOKqeaDdeYFVyFyU4blvoD6tRsXF4X7TG1xUyhbdk,53778 +sqlalchemy/orm/context.py,sha256=dmqih2qp7EkiIjp6ATihNOBTtAduYdjv8kLp2vah5EY,114925 +sqlalchemy/orm/decl_api.py,sha256=1MJ8qXLsJBxcFnWz6wOBlQfxVyXQVuD0sHQXE3LfTBA,65475 +sqlalchemy/orm/decl_base.py,sha256=FlIRdzuBxaM3W0dA7Ye6w5k-mWy356pjHauXykbTMHQ,83377 +sqlalchemy/orm/dependency.py,sha256=vXDcvgrY8_9x5lLWIpoLvzwuN0b-2-DwhXux1nNf0E8,48885 +sqlalchemy/orm/descriptor_props.py,sha256=UEqLGB2VirKgSZxvOBu83RVXJNVpq6Xzu_wrXh5l2sM,38250 +sqlalchemy/orm/dynamic.py,sha256=c_QIOEzM-E_mX6ZzJc2w-ny_rRKCv8jiggrtl4HShxc,10097 +sqlalchemy/orm/evaluator.py,sha256=lQ_uAoUBKJtQAyvhyFfHOf8gvxk0_-r4KpqQR53-COE,12293 +sqlalchemy/orm/events.py,sha256=UguRQ343Q-rGxKjPQTgqOs5uVUkW1rcLBWoOSZUHirI,130506 +sqlalchemy/orm/exc.py,sha256=k9K4M3zZvE7877TiTOI5gG4MOgnBEbKqvAsP43JU2Dk,7583 +sqlalchemy/orm/identity.py,sha256=mVaoHHtniM1-wSqJ0VPu2v6LaSJfer4_vLsxFVw8aXc,9551 +sqlalchemy/orm/instrumentation.py,sha256=BJCBG2Xak6FQu8lEnnU1G48CFenrEuAl2zFgWr1UCWk,25093 +sqlalchemy/orm/interfaces.py,sha256=rWp9F9Rl1gS57JH5ooJdFra0fV8iR99aaz5miengl2Q,49860 +sqlalchemy/orm/loading.py,sha256=7M0E7vNVqcJZ9JbZafdjJo0Wf7G1MFcECqG-8Pdw0gY,59027 +sqlalchemy/orm/mapped_collection.py,sha256=kxy8_wQPjbjEMxCEe-l5lgH9wza_JedWzcksXXjLK9E,20260 +sqlalchemy/orm/mapper.py,sha256=QyCveQDtdlyfpEGF1xq4r8yzAoGXtun3RKKAdNdM7nI,175385 +sqlalchemy/orm/path_registry.py,sha256=6eNqA7hXIaLyyP3PAWVkApQpAWMX9uSfpALkYyRJ6x8,26757 +sqlalchemy/orm/persistence.py,sha256=ZDurr2DgEJXvA8auElWJC9CXQP4iaqr2SwFYzvuMxdk,62300 +sqlalchemy/orm/properties.py,sha256=JJmlgLRgeoA9I3kwQjp_5UIk0sa3e4SuQ7HVOTcprLw,29974 +sqlalchemy/orm/query.py,sha256=KUfxqpx_7vKqQCUIdQ0nw9pg1MUGyjMOtp-m5tDZtko,121128 +sqlalchemy/orm/relationships.py,sha256=HLyUXAyeVPRbXPeb6W8fNzCIpCNqF_-FCbVth_oJUFc,131282 +sqlalchemy/orm/scoping.py,sha256=5WZKU9VuM1z_XruCOEzbmdilDznGtD8bYRA7zJExZPs,80948 +sqlalchemy/orm/session.py,sha256=wSmK6wySOiogLnERr2DJMdZmqRHj2rLocNV4AzlWPHQ,198414 +sqlalchemy/orm/state.py,sha256=mzbVDlKJuyzTJY3QsJAPAeWh-1LE-ITrZVufKV61ZAc,38674 +sqlalchemy/orm/state_changes.py,sha256=9jHui0oF4V7xIoL8hSUiFDhHrJVPmq3doX5zxY5dR3g,7013 +sqlalchemy/orm/strategies.py,sha256=dUNlfzmWDzRb1JOG_xFisMtlmDTxeQLn4GkmBsN9b3o,117432 +sqlalchemy/orm/strategy_options.py,sha256=AMZLHMUURTkrfUppPNiDSN-WKb2VOgAoUtUBpDpz-CE,85895 +sqlalchemy/orm/sync.py,sha256=jLZWFRsn2iobdX23gQlthxhnFHQum3mWQHHcx8uj0t4,5912 +sqlalchemy/orm/unitofwork.py,sha256=Jyri2dH5VmkX7oN-XWRzzKMCjQAzvBPWWem5XQL5SYY,27829 +sqlalchemy/orm/util.py,sha256=In6Hszjpj2d81S3jxJraaP8jzGvKcFMtO9W6oi_xXGs,82638 +sqlalchemy/orm/writeonly.py,sha256=AZjugsxxk9hDV6R3ThzAD3NF4BuBetKTc8BueO5SdMo,23010 +sqlalchemy/pool/__init__.py,sha256=rvWJtziqz1Yp_9NU7r-cKH1WKi8MwcjZX6kuBYu_s6s,1859 +sqlalchemy/pool/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/pool/__pycache__/base.cpython-39.pyc,, +sqlalchemy/pool/__pycache__/events.cpython-39.pyc,, +sqlalchemy/pool/__pycache__/impl.cpython-39.pyc,, +sqlalchemy/pool/base.py,sha256=aNWyTfU14c7zEnbbZjDTjC3Lra6J3EqPZqLQhbTL3xY,53770 +sqlalchemy/pool/events.py,sha256=O-Xj11g-6xlZlslWYCeiDbEaAKWVN_ZKYyQqBdLadgM,13518 +sqlalchemy/pool/impl.py,sha256=N0I4i-3EtdHeRpVuTmdM3qLND6bMDZ8653yZ4rIw6zo,18276 +sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sqlalchemy/schema.py,sha256=Liwt9G2PyOZZGfQkTGx7fFjTNH2o8t9kPcCAIHF9etw,3264 +sqlalchemy/sql/__init__.py,sha256=9ffSt_Gl2TJYE4_PyWxtRNfBF8yGmIV2J_CaoAyx2QQ,5965 +sqlalchemy/sql/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/_dml_constructors.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/_elements_constructors.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/_orm_types.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/_py_util.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/_typing.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/annotation.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/base.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/cache_key.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/coercions.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/compiler.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/crud.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/ddl.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/default_comparator.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/dml.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/elements.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/events.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/expression.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/functions.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/lambdas.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/naming.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/operators.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/roles.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/schema.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/selectable.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/sqltypes.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/traversals.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/type_api.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/util.cpython-39.pyc,, +sqlalchemy/sql/__pycache__/visitors.cpython-39.pyc,, +sqlalchemy/sql/_dml_constructors.py,sha256=CRI_cxOwcSBPUhouMuNoxBVb3EB0b6zQo6YSjI1d2Vo,4007 +sqlalchemy/sql/_elements_constructors.py,sha256=gSshp_t_TteDk4mvekbPBDABWDW-umShMPmjCrUrLBs,64764 +sqlalchemy/sql/_orm_types.py,sha256=WIdXTDALHCd3PuzpAPot2psv505T817wnQ3oXuGH7CU,640 +sqlalchemy/sql/_py_util.py,sha256=YCkagVa5Ov1OjCfMhUbNa527zX2NsUGPuCLEWmbQQMA,2248 +sqlalchemy/sql/_selectable_constructors.py,sha256=kHsJViBwydt3l-aiqtI2yLK4BgjEsVB9lpKPuWSWv60,19454 +sqlalchemy/sql/_typing.py,sha256=wdOPOG-rCutlB09SdQ0LOBsqucPsVUwN1bzAYBe0veg,12708 +sqlalchemy/sql/annotation.py,sha256=R_k3DdbzyX5F3ThWWDpKwhTEIqsU3JN6mk6LAluwG6I,18865 +sqlalchemy/sql/base.py,sha256=ujtrUPRomNTDR181emWjGAVVJod8l6_NrA5zFqS_IkM,76089 +sqlalchemy/sql/cache_key.py,sha256=AaPpvFDwYMfGixEmEto02flVKyf4UifGdNbu2Z4rfMc,33773 +sqlalchemy/sql/coercions.py,sha256=YXSGtgtUIJeDPPjtBpFA2PuZ0bP-x8E6N01OIDWJvxw,41959 +sqlalchemy/sql/compiler.py,sha256=K5RTdfbFslk-HS25YTRqUtdsr2HwZ0xDa5h2vbt0JQQ,276035 +sqlalchemy/sql/crud.py,sha256=49eqcpSLtS5eBKdubzB1FySD1lGA62xSnjYjZMqzxWo,58128 +sqlalchemy/sql/ddl.py,sha256=gcmvr8Qe5NAszNa_L4kHrhenmNXdsPpLgh_5LH2lkCc,46919 +sqlalchemy/sql/default_comparator.py,sha256=-sSDLcxHfL4jgIh5f_g2-8wOGazDHhTPyB0pA9Gr_Uk,17212 +sqlalchemy/sql/dml.py,sha256=M-OmqQcdnbtzz-nMq5rKrprBwLuwWhv-hOHi3D5vpSI,67563 +sqlalchemy/sql/elements.py,sha256=e5wZQP097d22dHTZ-f_oSkmZ66JPb1074BvcTKbOdwY,176613 +sqlalchemy/sql/events.py,sha256=ELMw8mkKUvVVeb354hfD_9Fk-KSX28hCfNdnMgnv2zI,18756 +sqlalchemy/sql/expression.py,sha256=bD-nG9OxLmhgvKkCKFpMtycxq8szzUsxhDeH3E9WmkQ,7748 +sqlalchemy/sql/functions.py,sha256=guLTlBg5ShMxcTpmN1xWb0K0nNs3o5j5GE0Sz-FDEro,57147 +sqlalchemy/sql/lambdas.py,sha256=M8GAWl4zBsDsCv4cnvzS1YTB1yonW4Ng0167mt-MJs0,50731 +sqlalchemy/sql/naming.py,sha256=3J_KScJBe7dPY4Stj5veIzGfSnaWG9-f7IGbxhc7luE,7077 +sqlalchemy/sql/operators.py,sha256=Q818GlnWZpETl6z7AOhrjNEKpN-63d8874ldhTTaF90,78703 +sqlalchemy/sql/roles.py,sha256=UcH_JBFpsBjGuizWNJTUbaoKVFU06zy8kGvHcQgQero,8011 +sqlalchemy/sql/schema.py,sha256=PalABH7o-D9dnRbZgZ87lmUuHLv6NVuAHA6QtmBb3gc,234222 +sqlalchemy/sql/selectable.py,sha256=ChI5LaLSBqN5LhnrKSATJ8VFzUyyXZ-Op9WAdWQv6_I,239975 +sqlalchemy/sql/sqltypes.py,sha256=Q7A23gw6vAihb_-9f-zQ2Rr2ZpixP0NnUW5T2ndBMDs,130741 +sqlalchemy/sql/traversals.py,sha256=fkuIC7naAhAaVI0RVcDTrINyZ9vhxDq7uixHSSDcvmQ,34542 +sqlalchemy/sql/type_api.py,sha256=PgC9zr5gHkVjk2G3WQ19cOFzgzWHUIasPcZ-3PIkv9s,87253 +sqlalchemy/sql/util.py,sha256=ktZ4FWIodU0PmcvQ9LkYdj7t9iNoiFF4bS-77EzqxXs,49674 +sqlalchemy/sql/visitors.py,sha256=-u9RfW8UsD5UAJaetoaLQOsIZPUYhK3wVNcNsskWm-0,37608 +sqlalchemy/testing/__init__.py,sha256=I_4C9vgF-GRODJ_IRNxIXXSQHgUDNVggGFFv6v0BJBQ,3221 +sqlalchemy/testing/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/assertions.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/assertsql.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/asyncio.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/config.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/engines.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/entities.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/exclusions.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/pickleable.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/profiling.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/provision.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/requirements.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/schema.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/util.cpython-39.pyc,, +sqlalchemy/testing/__pycache__/warnings.cpython-39.pyc,, +sqlalchemy/testing/assertions.py,sha256=K_wIe570kI6xbtZmWMnLiuhBaCFyoQx-iaau9CR1PLI,32428 +sqlalchemy/testing/assertsql.py,sha256=F8R_LgsUiZ31sgkCigFbxFcVOzt57EI1tRSHgk88CjQ,17290 +sqlalchemy/testing/asyncio.py,sha256=7LatmcAk09IVuOMWcAdpVltLyhDWVG1cV7iOaR6soz0,3858 +sqlalchemy/testing/config.py,sha256=Kfw7qsboj5Q-YxCnBp_DJ3IKXUPNP_Wr9J4E5VcJFlc,12454 +sqlalchemy/testing/engines.py,sha256=mTwCxPdb6K8S2y-O7dcJwO5kEE4qIAU8Kp6qawiP2TM,13824 +sqlalchemy/testing/entities.py,sha256=E7IkhsQaziZSOZkKkFnfUvB0165SH5MP1q4QkGKdf98,3471 +sqlalchemy/testing/exclusions.py,sha256=rWyo1SZpZ-EjNkvr-O085A3XSAqxSL5uqgOE4L5mzM0,12879 +sqlalchemy/testing/fixtures/__init__.py,sha256=SHlEUIlUaqU2xjziZeBDL1Yd_URWou6dnZqG8s-Ay0g,1226 +sqlalchemy/testing/fixtures/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/testing/fixtures/__pycache__/base.cpython-39.pyc,, +sqlalchemy/testing/fixtures/__pycache__/mypy.cpython-39.pyc,, +sqlalchemy/testing/fixtures/__pycache__/orm.cpython-39.pyc,, +sqlalchemy/testing/fixtures/__pycache__/sql.cpython-39.pyc,, +sqlalchemy/testing/fixtures/base.py,sha256=HQPgUuOnBVNUm9l7dcoT4AuggG0jXW4a23dVZhbSA9k,12622 +sqlalchemy/testing/fixtures/mypy.py,sha256=TGTo8x02m9Qt10-iRjic_F66-uA2T82QbKYmpUyVzCw,12153 +sqlalchemy/testing/fixtures/orm.py,sha256=VZBnFHHfQpVdLqV-F9myH886uq3clDIzixMwEe5TjMc,6322 +sqlalchemy/testing/fixtures/sql.py,sha256=1c2omUuUSRlWNYtKr3ADJFaQeFnq1EnQtKTKn67B-2Q,16196 +sqlalchemy/testing/pickleable.py,sha256=_E141_vPqtE-H_6cNBnWRDuMtvjeeBKovOI2_P9KJGQ,2988 +sqlalchemy/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sqlalchemy/testing/plugin/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-39.pyc,, +sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-39.pyc,, +sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-39.pyc,, +sqlalchemy/testing/plugin/bootstrap.py,sha256=3WkvZXQad0oyxg6nJyLEthN30zBuueB33LFxWeMBdKc,1482 +sqlalchemy/testing/plugin/plugin_base.py,sha256=mktuemi4PcXJ8PMTFY5CpjeC83hYjVMG8v_oMqabL-c,22051 +sqlalchemy/testing/plugin/pytestplugin.py,sha256=IYmAr-FaAODCInWpnKJCNGw03cyRJK5YcZ07hrmtSNg,28151 +sqlalchemy/testing/profiling.py,sha256=BLknvjemW8oDl0aCSUXQw_ESgoFfx0RoeQYclzhNv0Q,10472 +sqlalchemy/testing/provision.py,sha256=fnmlxUacztdUcZOPTiSJ-rYe-tpIwyl8O97YRI24FLk,14686 +sqlalchemy/testing/requirements.py,sha256=j987wy1ndJoyLtVB61FkVxfvzQeX_ZDs7GUOW7qxRAg,52904 +sqlalchemy/testing/schema.py,sha256=O76C-woOcc6qjk1csf9yljor-6wjRZzKQNrXdmLLtw8,6737 +sqlalchemy/testing/suite/__init__.py,sha256=u3lEc0j47s7Dad_2SVWOZ6EU2aOMRWqE_WrQ17HmBsA,489 +sqlalchemy/testing/suite/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_cte.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_insert.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_results.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_select.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_types.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-39.pyc,, +sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-39.pyc,, +sqlalchemy/testing/suite/test_cte.py,sha256=RFvWCSmmy3-JEIXIcZEkYpjt_bJQTe7SvfnpXeUFl9o,6410 +sqlalchemy/testing/suite/test_ddl.py,sha256=VQuejaNUMN484DxwkYL57ZEnPY5UhNGWkQVgquPrWHA,12168 +sqlalchemy/testing/suite/test_deprecations.py,sha256=8mhjZyrECXiVyE88BJLbyj4Jz_niXOs6ZOXd9rFAWsk,5229 +sqlalchemy/testing/suite/test_dialect.py,sha256=C3aUUd16iS19WJrqZLGkG4DPhWMAADTCfTDkYYlUz5U,23407 +sqlalchemy/testing/suite/test_insert.py,sha256=r4VeIA36VU1Q4zvcB3bYKbAlz5e1vqm0v9mwKepe_p4,19041 +sqlalchemy/testing/suite/test_reflection.py,sha256=1I87N-ruYO4cNGyeSBvOEHfrsW_TkScPtdutUnVAk7o,109327 +sqlalchemy/testing/suite/test_results.py,sha256=fl8qv9YdcEqSQFe1fDf7vrFk7Cam_MzJiETLzx5KYuU,16127 +sqlalchemy/testing/suite/test_rowcount.py,sha256=1J4Vd1jBIC-Zqgkqa_mztRAyfO9G5EAjIFV9_NlQTqs,7904 +sqlalchemy/testing/suite/test_select.py,sha256=3SCpfuy-D0q0l4elRNgMc0KlIjo3Nh1nGHo0uEZKAUo,60207 +sqlalchemy/testing/suite/test_sequence.py,sha256=WqriMWJTPnmCBydP5vehSD2zXxwSyFGug_K2IyEIRSY,9983 +sqlalchemy/testing/suite/test_types.py,sha256=NObEx25I9LQdMaW470ACm4w9fWRVYf9B0i1VafrOhGQ,63791 +sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=1n0xf7EyGuLYIMiwc5lANGWvCrmoXf3gtQM93sMcd3c,6070 +sqlalchemy/testing/suite/test_update_delete.py,sha256=cj9C7U8MFxMSfdckAdODQHsnqwOtU112zqk5U8iyCTM,1710 +sqlalchemy/testing/util.py,sha256=QH355pEJeqUn4h2LPTleNGinD50hE40R1HRW2LEXF6U,14599 +sqlalchemy/testing/warnings.py,sha256=ymXClxi_YtysQJZZQzgjT-d3tW63z4pOfKJsTqaBLMQ,1598 +sqlalchemy/types.py,sha256=bV5WvXIjsG-bWRcwCVACJ6m3tlSMS5XNdtXVXGTMeI8,3244 +sqlalchemy/util/__init__.py,sha256=NILyXDswLeG8lpxsPh2iIOs4BweaFz7tbn3wQ0-hK5c,8404 +sqlalchemy/util/__pycache__/__init__.cpython-39.pyc,, +sqlalchemy/util/__pycache__/_collections.cpython-39.pyc,, +sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-39.pyc,, +sqlalchemy/util/__pycache__/_has_cy.cpython-39.pyc,, +sqlalchemy/util/__pycache__/_py_collections.cpython-39.pyc,, +sqlalchemy/util/__pycache__/compat.cpython-39.pyc,, +sqlalchemy/util/__pycache__/concurrency.cpython-39.pyc,, +sqlalchemy/util/__pycache__/deprecations.cpython-39.pyc,, +sqlalchemy/util/__pycache__/langhelpers.cpython-39.pyc,, +sqlalchemy/util/__pycache__/preloaded.cpython-39.pyc,, +sqlalchemy/util/__pycache__/queue.cpython-39.pyc,, +sqlalchemy/util/__pycache__/tool_support.cpython-39.pyc,, +sqlalchemy/util/__pycache__/topological.cpython-39.pyc,, +sqlalchemy/util/__pycache__/typing.cpython-39.pyc,, +sqlalchemy/util/_collections.py,sha256=gBkYublMI04VlHaEJ1aSs2IssotFV6iL1ka8wKnzdS8,20892 +sqlalchemy/util/_concurrency_py3k.py,sha256=NoEu7Zs6-v-nGuWmTQxaUPhq90nzXkg_SHNs-kOq4_o,8483 +sqlalchemy/util/_has_cy.py,sha256=7V8ZfMrlED0bIc6DWsBC_lTEP1JEihWKPdjyLJtxfaE,1268 +sqlalchemy/util/_py_collections.py,sha256=16hUwnLwUlXSl4vHlyfXLakEJaTA8u7x41aR6Uemz_A,17169 +sqlalchemy/util/compat.py,sha256=3ex0CUzo3E6UqsnQNZ1n-zSpYx2B0dc8qNmkQnBd9is,9708 +sqlalchemy/util/concurrency.py,sha256=rLb4LbPSTnGaSb381_e3VwHbEjqiF10lkarFjihywTY,2353 +sqlalchemy/util/deprecations.py,sha256=s9ncamAkw9CHAGwl0y0DdmhYldQIuNeUqyc6Ukom2lI,12372 +sqlalchemy/util/langhelpers.py,sha256=25d9qeMAoBQRoKfC89j-cehPwDGG2PTWADNQ8t3JgRA,66908 +sqlalchemy/util/preloaded.py,sha256=tMuj_6GELLQj1I8YRAKu--VLnxI9kH8Si_IwlDfre4M,6055 +sqlalchemy/util/queue.py,sha256=-DPCfkQgtqP9znBvm3bRdYjAWs4dysflpL805IMf22A,10529 +sqlalchemy/util/tool_support.py,sha256=SOfhWXzZXqx5RYX9WM_CeBJGGgV0eaxpv96VFb5KEKs,6167 +sqlalchemy/util/topological.py,sha256=-i2pX8AD9hjaqpLDu5P3R5w6D8_t5nDWlwLI6xXYyyc,3578 +sqlalchemy/util/typing.py,sha256=h_ZlNnIWz7Gi9EL_CCJjUxv-fqAFz4kvlowB-Yx1XRU,16405 diff --git a/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/REQUESTED b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/WHEEL new file mode 100644 index 00000000..ee197dd3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.2) +Root-Is-Purelib: false +Tag: cp39-cp39-win_amd64 + diff --git a/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/top_level.txt b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/top_level.txt new file mode 100644 index 00000000..39fb2bef --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/SQLAlchemy-2.0.22.dist-info/top_level.txt @@ -0,0 +1 @@ +sqlalchemy diff --git a/Meliora/gmapenv/Lib/site-packages/__pycache__/typing_extensions.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/__pycache__/typing_extensions.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a2d83035031a67cdb1d8177c6d0c2dda16d27e8 GIT binary patch literal 85383 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%0DN+#@Ca! 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 Wj;y#bsqP)$Yxi$Y&gl1Z{r>;~)w6#9 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/_distutils_hack/__init__.py b/Meliora/gmapenv/Lib/site-packages/_distutils_hack/__init__.py new file mode 100644 index 00000000..5f40996a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,128 @@ +import sys +import os +import re +import importlib +import warnings + + +is_pypy = '__pypy__' in sys.builtin_module_names + + +warnings.filterwarnings('ignore', + r'.+ distutils\b.+ deprecated', + DeprecationWarning) + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils.") + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + warnings.warn("Setuptools is replacing distutils.") + mods = [name for name in sys.modules if re.match(r'distutils\b', name)] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') + return which == 'local' + + +def ensure_local_distutils(): + clear_distutils() + distutils = importlib.import_module('setuptools._distutils') + distutils.__name__ = 'distutils' + sys.modules['distutils'] = distutils + + # sanity check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + if path is not None: + return + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + import importlib.abc + import importlib.util + + class DistutilsLoader(importlib.abc.Loader): + + def create_module(self, spec): + return importlib.import_module('setuptools._distutils') + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader('distutils', DistutilsLoader()) + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @staticmethod + def pip_imported_during_build(): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + return any( + frame.f_globals['__file__'].endswith('setup.py') + for frame, line in traceback.walk_stack(None) + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass diff --git a/Meliora/gmapenv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f122c1e33e01f0ca70d58120a95a5c39fc8bc986 GIT binary patch literal 5107 zcmbtYO>^7E8Qujz3Zg!&$WA6{n<;81X*jj1*s*InqbeVkBGhR=4I{nT zq?YU{*$PrATJ+K6WutKeMb}UXp0aJe!_}f-8!WYyhqf)OhfH~<$9Yl`_7TT+@V@HQ zv)N*ys`V|+_3aF*;E*%6K7!!w2HFd|y+i?k*OYC5^fqML@1;o+>GNK*pAO%L@z%r} zFNk#FDcOsHmegL_k=}!1y$4=55&cMdVeCE7d%Bi4^@EysuM=vo8|-)jrPuaGS+?U zCG7;Mr;82YbAZxm5JlK8;1Tdt1tLttBn~3TW6yh2*0yS1oTOe5dlIhFocHEM5VP8@XQSQBaiQ)ZRb2zEu%UV9Dg|DdqJxfYnN#v-h(MoA0CvxbM! z=&GX#oFe;F3SZ(bS1+PHr4N#cgK`5! zzl4e;{=^a-TChm!!hUFx`xv}i@o>E#MaeGgCxTUhl3voDFt+9%tZXM#N!$e|yq!RW zWGOZCW#i?IoA>U2a_{clI~)G}jhp`Z?Tvf)@7=z$k(G5SqOh5jj3ladW+kwL;Z&Ku zCDSU;O1qt~)j7UxjG`q(mGIL>n6tfgOMb|kg2Msr3k7L2L2;6$^^ctCZ= zC?cE99W8BrA%FC9cZ*Q6zFiCidHe5Ko zYyyAg33FEw!*a2Z$f6>6~xM5Wh~;A+|{pKzIgSVdBhkZ+J(2T zU%GVt+U2({n#mBd5N_b=yGa`E1Vq!Ef%U3wm|?t<+53d>j5!&rofC;q5LGDTDrBL_ z6xmD}LQ}8f>4d;+biRk8FQJl*@(tt~6=4bcF-NxHh!QdZN0h}3?j>0ku9$rcuhy6` z!ko)auaDyI$1)8*3=slVy=CZ(Dd{2%l;hk$(U(!}Bb(`SHBVF&e4Djd2+|(1fAGKY z11ANY_mSTK0Xwu0O8ce5JP8<_);-zsAtV3K?S2#y%MMQLh$vt@BSD}Qp7Q!}S&aqe zu0}z(DT1{+MyoTZ1}o3lP_2!9`Lz6`%geun&6j}*9yKfH?l7By*#~K=5EmWzn|9`o z@McaAaV#sRfx?(tAR=ESUzUGT|7M)0YGS;~WVp9Q{9vKSF-Ec0Ug9V7=*wa7P)u92TSjSeHFuhC6 z*2rw?Ea#JCj_F#;wV;wNq6bl9D6o85WA6ryQSkCfmHm;hxTqLR%e7v12X7Q;pR4OB z3nK**Rc@dd8`uX0k01l`m3bh_{Tc!`@)Qu$8EhNJPx;9(Am!0zA~o6V$kVl`M1ugHhakp*WfY19Fv>;0+Ps z2HyX|Gqr!(dl8mAG$?V5*Z~xkyD2EoqJ*B3_(M`wX>hkt*1AlQMtWhJbU|r*Q<8c{ z`=aAmfCDFX<>{6Rduh%4RJOfym)^c|Wvn{mM(a}?vVnxWw5D|HZZCVHXz(NX# zi1rF)`EYBWA)$E$fB+js8mdE=5sKU8joj9YZyB15epJ zK%`-77=dZk2_$3wzkwGYp_usM@`~#&x)qBn>YpMP+T*jyG8&_^NopTi!@o5Ul!$}F z15-AO#RET24{$!0D$SOPbB6!n?fUx7PoD)Ua|40gq!V_(#B9S*r9Q#)2}C4B+O8%$ z9xUaUfQWPUIg6Ja93l43a`1|?Ke5<)%j8cc2*LML8mB%+m6et3QkHp_8kNt2s4s8Q z9~{p_HK&C_|J3}UvhVdxkP|l|n?IT;n zi6WJ%_)B4VefaMalIG9z{~7XZnGTM5^86Y-y-pP=%-}bIGBBQr-d)Xu>KbWE)AyiY d{g`kf`t#vQ+0s!V-N=!FabFZKwK;UBvKht7@8RuFfL?ZWJqBQX3%7c;*U?s zEG{W6$;>H^&qz$p_S0m##T6f)nOl%wR1zN_#hsELpI??*RFs*Lx{{#?WE`0ImEdd@ z6Iz^FR2-905aW_xo|luKm{J_$o|{-utl$AODX}CYKTjb!Ker$z9VnQZR~F-wnG{o; oS(2(-0FqBnEsjC6T_0wZUP0w84x8Nkl+v73J4T?TpMjVG0O)i^DF6Tf literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/_distutils_hack/override.py b/Meliora/gmapenv/Lib/site-packages/_distutils_hack/override.py new file mode 100644 index 00000000..2cc433a4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/_distutils_hack/override.py @@ -0,0 +1 @@ +__import__('_distutils_hack').do_override() diff --git a/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/LICENSE.rst b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/LICENSE.rst new file mode 100644 index 00000000..79c9825a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/LICENSE.rst @@ -0,0 +1,20 @@ +Copyright 2010 Jason Kirtland + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/METADATA new file mode 100644 index 00000000..91e090fd --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/METADATA @@ -0,0 +1,62 @@ +Metadata-Version: 2.1 +Name: blinker +Version: 1.6.3 +Summary: Fast, simple object-to-object and broadcast signaling +Keywords: signal,emit,events,broadcast +Author-email: Jason Kirtland +Maintainer-email: Pallets Ecosystem +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Software Development :: Libraries +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://blinker.readthedocs.io +Project-URL: Homepage, https://blinker.readthedocs.io +Project-URL: Issue Tracker, https://github.com/pallets-eco/blinker/issues/ +Project-URL: Source Code, https://github.com/pallets-eco/blinker/ + +Blinker +======= + +Blinker provides a fast dispatching system that allows any number of +interested parties to subscribe to events, or "signals". + +Signal receivers can subscribe to specific senders or receive signals +sent by any sender. + +.. code-block:: pycon + + >>> from blinker import signal + >>> started = signal('round-started') + >>> def each(round): + ... print(f"Round {round}") + ... + >>> started.connect(each) + + >>> def round_two(round): + ... print("This is round two.") + ... + >>> started.connect(round_two, sender=2) + + >>> for round in range(1, 4): + ... started.send(round) + ... + Round 1! + Round 2! + This is round two. + Round 3! + + +Links +----- + +- Documentation: https://blinker.readthedocs.io/ +- Changes: https://blinker.readthedocs.io/#changes +- PyPI Releases: https://pypi.org/project/blinker/ +- Source Code: https://github.com/pallets-eco/blinker/ +- Issue Tracker: https://github.com/pallets-eco/blinker/issues/ + diff --git a/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/RECORD new file mode 100644 index 00000000..f4fc9156 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/RECORD @@ -0,0 +1,14 @@ +blinker-1.6.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +blinker-1.6.3.dist-info/LICENSE.rst,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 +blinker-1.6.3.dist-info/METADATA,sha256=yDLuXpi6nLMwYYWJlGDIBvbZxFZH23JHbdxPGzIU4vg,1918 +blinker-1.6.3.dist-info/RECORD,, +blinker-1.6.3.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +blinker/__init__.py,sha256=E7dbyl7JyaK4RbWHlGrWY3mQ8d3BEnxRCeKQnqMa0bw,408 +blinker/__pycache__/__init__.cpython-39.pyc,, +blinker/__pycache__/_saferef.cpython-39.pyc,, +blinker/__pycache__/_utilities.cpython-39.pyc,, +blinker/__pycache__/base.cpython-39.pyc,, +blinker/_saferef.py,sha256=kWOTIWnCY3kOb8lZP74Rbx7bR_BLVg4TjwzNCRLhKHs,9096 +blinker/_utilities.py,sha256=GPXtJzykzVotoxHC79mgFQMPJtICwpVDCCpus4_JtsA,4110 +blinker/base.py,sha256=ZfN6L36P0BzPaQAcAF0tSNAicxiG4f7xLPug6iLsjjE,20293 +blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/WHEEL new file mode 100644 index 00000000..3b5e64b5 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/blinker-1.6.3.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Meliora/gmapenv/Lib/site-packages/blinker/__init__.py b/Meliora/gmapenv/Lib/site-packages/blinker/__init__.py new file mode 100644 index 00000000..0d7a6bcd --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/blinker/__init__.py @@ -0,0 +1,19 @@ +from blinker.base import ANY +from blinker.base import NamedSignal +from blinker.base import Namespace +from blinker.base import receiver_connected +from blinker.base import Signal +from blinker.base import signal +from blinker.base import WeakNamespace + +__all__ = [ + "ANY", + "NamedSignal", + "Namespace", + "Signal", + "WeakNamespace", + "receiver_connected", + "signal", +] + +__version__ = "1.6.3" diff --git a/Meliora/gmapenv/Lib/site-packages/blinker/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/blinker/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dec6a0ed0f4af9acf4a4f9160016289deea86567 GIT binary patch literal 502 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 Gc=ms5Q4=Wu literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1b1b375b27a4efa4a84bc8b5bd09dede39eabe2 GIT binary patch literal 4194 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/blinker/_saferef.py b/Meliora/gmapenv/Lib/site-packages/blinker/_saferef.py new file mode 100644 index 00000000..dcb70c18 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/blinker/_saferef.py @@ -0,0 +1,230 @@ +# extracted from Louie, http://pylouie.org/ +# updated for Python 3 +# +# Copyright (c) 2006 Patrick K. O'Brien, Mike C. Fletcher, +# Matthew R. Scott +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# +# * Neither the name of the nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +"""Refactored 'safe reference from dispatcher.py""" +import operator +import sys +import traceback +import weakref + + +get_self = operator.attrgetter("__self__") +get_func = operator.attrgetter("__func__") + + +def safe_ref(target, on_delete=None): + """Return a *safe* weak reference to a callable target. + + - ``target``: The object to be weakly referenced, if it's a bound + method reference, will create a BoundMethodWeakref, otherwise + creates a simple weakref. + + - ``on_delete``: If provided, will have a hard reference stored to + the callable to be called after the safe reference goes out of + scope with the reference object, (either a weakref or a + BoundMethodWeakref) as argument. + """ + try: + im_self = get_self(target) + except AttributeError: + if callable(on_delete): + return weakref.ref(target, on_delete) + else: + return weakref.ref(target) + else: + if im_self is not None: + # Turn a bound method into a BoundMethodWeakref instance. + # Keep track of these instances for lookup by disconnect(). + assert hasattr(target, "im_func") or hasattr(target, "__func__"), ( + f"safe_ref target {target!r} has im_self, but no im_func, " + "don't know how to create reference" + ) + reference = BoundMethodWeakref(target=target, on_delete=on_delete) + return reference + + +class BoundMethodWeakref: + """'Safe' and reusable weak references to instance methods. + + BoundMethodWeakref objects provide a mechanism for referencing a + bound method without requiring that the method object itself + (which is normally a transient object) is kept alive. Instead, + the BoundMethodWeakref object keeps weak references to both the + object and the function which together define the instance method. + + Attributes: + + - ``key``: The identity key for the reference, calculated by the + class's calculate_key method applied to the target instance method. + + - ``deletion_methods``: Sequence of callable objects taking single + argument, a reference to this object which will be called when + *either* the target object or target function is garbage + collected (i.e. when this object becomes invalid). These are + specified as the on_delete parameters of safe_ref calls. + + - ``weak_self``: Weak reference to the target object. + + - ``weak_func``: Weak reference to the target function. + + Class Attributes: + + - ``_all_instances``: Class attribute pointing to all live + BoundMethodWeakref objects indexed by the class's + calculate_key(target) method applied to the target objects. + This weak value dictionary is used to short-circuit creation so + that multiple references to the same (object, function) pair + produce the same BoundMethodWeakref instance. + """ + + _all_instances = weakref.WeakValueDictionary() # type: ignore[var-annotated] + + def __new__(cls, target, on_delete=None, *arguments, **named): + """Create new instance or return current instance. + + Basically this method of construction allows us to + short-circuit creation of references to already-referenced + instance methods. The key corresponding to the target is + calculated, and if there is already an existing reference, + that is returned, with its deletion_methods attribute updated. + Otherwise the new instance is created and registered in the + table of already-referenced methods. + """ + key = cls.calculate_key(target) + current = cls._all_instances.get(key) + if current is not None: + current.deletion_methods.append(on_delete) + return current + else: + base = super().__new__(cls) + cls._all_instances[key] = base + base.__init__(target, on_delete, *arguments, **named) + return base + + def __init__(self, target, on_delete=None): + """Return a weak-reference-like instance for a bound method. + + - ``target``: The instance-method target for the weak reference, + must have im_self and im_func attributes and be + reconstructable via the following, which is true of built-in + instance methods:: + + target.im_func.__get__( target.im_self ) + + - ``on_delete``: Optional callback which will be called when + this weak reference ceases to be valid (i.e. either the + object or the function is garbage collected). Should take a + single argument, which will be passed a pointer to this + object. + """ + + def remove(weak, self=self): + """Set self.isDead to True when method or instance is destroyed.""" + methods = self.deletion_methods[:] + del self.deletion_methods[:] + try: + del self.__class__._all_instances[self.key] + except KeyError: + pass + for function in methods: + try: + if callable(function): + function(self) + except Exception: + try: + traceback.print_exc() + except AttributeError: + e = sys.exc_info()[1] + print( + f"Exception during saferef {self} " + f"cleanup function {function}: {e}" + ) + + self.deletion_methods = [on_delete] + self.key = self.calculate_key(target) + im_self = get_self(target) + im_func = get_func(target) + self.weak_self = weakref.ref(im_self, remove) + self.weak_func = weakref.ref(im_func, remove) + self.self_name = str(im_self) + self.func_name = str(im_func.__name__) + + @classmethod + def calculate_key(cls, target): + """Calculate the reference key for this reference. + + Currently this is a two-tuple of the id()'s of the target + object and the target function respectively. + """ + return (id(get_self(target)), id(get_func(target))) + + def __str__(self): + """Give a friendly representation of the object.""" + return "{}({}.{})".format( + self.__class__.__name__, + self.self_name, + self.func_name, + ) + + __repr__ = __str__ + + def __hash__(self): + return hash((self.self_name, self.key)) + + def __nonzero__(self): + """Whether we are still a valid reference.""" + return self() is not None + + def __eq__(self, other): + """Compare with another reference.""" + if not isinstance(other, self.__class__): + return operator.eq(self.__class__, type(other)) + return operator.eq(self.key, other.key) + + def __call__(self): + """Return a strong reference to the bound method. + + If the target cannot be retrieved, then will return None, + otherwise returns a bound instance method for our object and + function. + + Note: You may call this method any number of times, as it does + not invalidate the reference. + """ + target = self.weak_self() + if target is not None: + function = self.weak_func() + if function is not None: + return function.__get__(target) + return None diff --git a/Meliora/gmapenv/Lib/site-packages/blinker/_utilities.py b/Meliora/gmapenv/Lib/site-packages/blinker/_utilities.py new file mode 100644 index 00000000..068d94ce --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/blinker/_utilities.py @@ -0,0 +1,142 @@ +from __future__ import annotations + +import asyncio +import inspect +import sys +import typing as t +from functools import partial +from weakref import ref + +from blinker._saferef import BoundMethodWeakref + +IdentityType = t.Union[t.Tuple[int, int], str, int] + + +class _symbol: + def __init__(self, name): + """Construct a new named symbol.""" + self.__name__ = self.name = name + + def __reduce__(self): + return symbol, (self.name,) + + def __repr__(self): + return self.name + + +_symbol.__name__ = "symbol" + + +class symbol: + """A constant symbol. + + >>> symbol('foo') is symbol('foo') + True + >>> symbol('foo') + foo + + A slight refinement of the MAGICCOOKIE=object() pattern. The primary + advantage of symbol() is its repr(). They are also singletons. + + Repeated calls of symbol('name') will all return the same instance. + + """ + + symbols = {} # type: ignore[var-annotated] + + def __new__(cls, name): + try: + return cls.symbols[name] + except KeyError: + return cls.symbols.setdefault(name, _symbol(name)) + + +def hashable_identity(obj: object) -> IdentityType: + if hasattr(obj, "__func__"): + return (id(obj.__func__), id(obj.__self__)) # type: ignore[attr-defined] + elif hasattr(obj, "im_func"): + return (id(obj.im_func), id(obj.im_self)) # type: ignore[attr-defined] + elif isinstance(obj, (int, str)): + return obj + else: + return id(obj) + + +WeakTypes = (ref, BoundMethodWeakref) + + +class annotatable_weakref(ref): + """A weakref.ref that supports custom instance attributes.""" + + receiver_id: t.Optional[IdentityType] + sender_id: t.Optional[IdentityType] + + +def reference( # type: ignore[no-untyped-def] + object, callback=None, **annotations +) -> annotatable_weakref: + """Return an annotated weak ref.""" + if callable(object): + weak = callable_reference(object, callback) + else: + weak = annotatable_weakref(object, callback) + for key, value in annotations.items(): + setattr(weak, key, value) + return weak # type: ignore[no-any-return] + + +def callable_reference(object, callback=None): + """Return an annotated weak ref, supporting bound instance methods.""" + if hasattr(object, "im_self") and object.im_self is not None: + return BoundMethodWeakref(target=object, on_delete=callback) + elif hasattr(object, "__self__") and object.__self__ is not None: + return BoundMethodWeakref(target=object, on_delete=callback) + return annotatable_weakref(object, callback) + + +class lazy_property: + """A @property that is only evaluated once.""" + + def __init__(self, deferred): + self._deferred = deferred + self.__doc__ = deferred.__doc__ + + def __get__(self, obj, cls): + if obj is None: + return self + value = self._deferred(obj) + setattr(obj, self._deferred.__name__, value) + return value + + +def is_coroutine_function(func: t.Any) -> bool: + # Python < 3.8 does not correctly determine partially wrapped + # coroutine functions are coroutine functions, hence the need for + # this to exist. Code taken from CPython. + if sys.version_info >= (3, 8): + return asyncio.iscoroutinefunction(func) + else: + # Note that there is something special about the AsyncMock + # such that it isn't determined as a coroutine function + # without an explicit check. + try: + from unittest.mock import AsyncMock # type: ignore[attr-defined] + + if isinstance(func, AsyncMock): + return True + except ImportError: + # Not testing, no asynctest to import + pass + + while inspect.ismethod(func): + func = func.__func__ + while isinstance(func, partial): + func = func.func + if not inspect.isfunction(func): + return False + + if func.__code__.co_flags & inspect.CO_COROUTINE: + return True + + acic = asyncio.coroutines._is_coroutine # type: ignore[attr-defined] + return getattr(func, "_is_coroutine", None) is acic diff --git a/Meliora/gmapenv/Lib/site-packages/blinker/base.py b/Meliora/gmapenv/Lib/site-packages/blinker/base.py new file mode 100644 index 00000000..337ebc23 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/blinker/base.py @@ -0,0 +1,548 @@ +"""Signals and events. + +A small implementation of signals, inspired by a snippet of Django signal +API client code seen in a blog post. Signals are first-class objects and +each manages its own receivers and message emission. + +The :func:`signal` function provides singleton behavior for named signals. + +""" +from __future__ import annotations + +import typing as t +from collections import defaultdict +from contextlib import contextmanager +from warnings import warn +from weakref import WeakValueDictionary + +from blinker._utilities import annotatable_weakref +from blinker._utilities import hashable_identity +from blinker._utilities import IdentityType +from blinker._utilities import is_coroutine_function +from blinker._utilities import lazy_property +from blinker._utilities import reference +from blinker._utilities import symbol +from blinker._utilities import WeakTypes + +if t.TYPE_CHECKING: + import typing_extensions as te + + T_callable = t.TypeVar("T_callable", bound=t.Callable[..., t.Any]) + + T = t.TypeVar("T") + P = te.ParamSpec("P") + + AsyncWrapperType = t.Callable[[t.Callable[P, t.Awaitable[T]]], t.Callable[P, T]] + SyncWrapperType = t.Callable[[t.Callable[P, T]], t.Callable[P, t.Awaitable[T]]] + +ANY = symbol("ANY") +ANY.__doc__ = 'Token for "any sender".' +ANY_ID = 0 + + +class Signal: + """A notification emitter.""" + + #: An :obj:`ANY` convenience synonym, allows ``Signal.ANY`` + #: without an additional import. + ANY = ANY + + @lazy_property + def receiver_connected(self) -> Signal: + """Emitted after each :meth:`connect`. + + The signal sender is the signal instance, and the :meth:`connect` + arguments are passed through: *receiver*, *sender*, and *weak*. + + .. versionadded:: 1.2 + + """ + return Signal(doc="Emitted after a receiver connects.") + + @lazy_property + def receiver_disconnected(self) -> Signal: + """Emitted after :meth:`disconnect`. + + The sender is the signal instance, and the :meth:`disconnect` arguments + are passed through: *receiver* and *sender*. + + Note, this signal is emitted **only** when :meth:`disconnect` is + called explicitly. + + The disconnect signal can not be emitted by an automatic disconnect + (due to a weakly referenced receiver or sender going out of scope), + as the receiver and/or sender instances are no longer available for + use at the time this signal would be emitted. + + An alternative approach is available by subscribing to + :attr:`receiver_connected` and setting up a custom weakref cleanup + callback on weak receivers and senders. + + .. versionadded:: 1.2 + + """ + return Signal(doc="Emitted after a receiver disconnects.") + + def __init__(self, doc: str | None = None) -> None: + """ + :param doc: optional. If provided, will be assigned to the signal's + __doc__ attribute. + + """ + if doc: + self.__doc__ = doc + #: A mapping of connected receivers. + #: + #: The values of this mapping are not meaningful outside of the + #: internal :class:`Signal` implementation, however the boolean value + #: of the mapping is useful as an extremely efficient check to see if + #: any receivers are connected to the signal. + self.receivers: dict[IdentityType, t.Callable | annotatable_weakref] = {} + self.is_muted = False + self._by_receiver: dict[IdentityType, set[IdentityType]] = defaultdict(set) + self._by_sender: dict[IdentityType, set[IdentityType]] = defaultdict(set) + self._weak_senders: dict[IdentityType, annotatable_weakref] = {} + + def connect( + self, receiver: T_callable, sender: t.Any = ANY, weak: bool = True + ) -> T_callable: + """Connect *receiver* to signal events sent by *sender*. + + :param receiver: A callable. Will be invoked by :meth:`send` with + `sender=` as a single positional argument and any ``kwargs`` that + were provided to a call to :meth:`send`. + + :param sender: Any object or :obj:`ANY`, defaults to ``ANY``. + Restricts notifications delivered to *receiver* to only those + :meth:`send` emissions sent by *sender*. If ``ANY``, the receiver + will always be notified. A *receiver* may be connected to + multiple *sender* values on the same Signal through multiple calls + to :meth:`connect`. + + :param weak: If true, the Signal will hold a weakref to *receiver* + and automatically disconnect when *receiver* goes out of scope or + is garbage collected. Defaults to True. + + """ + receiver_id = hashable_identity(receiver) + receiver_ref: T_callable | annotatable_weakref + + if weak: + receiver_ref = reference(receiver, self._cleanup_receiver) + receiver_ref.receiver_id = receiver_id + else: + receiver_ref = receiver + sender_id: IdentityType + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = hashable_identity(sender) + + self.receivers.setdefault(receiver_id, receiver_ref) + self._by_sender[sender_id].add(receiver_id) + self._by_receiver[receiver_id].add(sender_id) + del receiver_ref + + if sender is not ANY and sender_id not in self._weak_senders: + # wire together a cleanup for weakref-able senders + try: + sender_ref = reference(sender, self._cleanup_sender) + sender_ref.sender_id = sender_id + except TypeError: + pass + else: + self._weak_senders.setdefault(sender_id, sender_ref) + del sender_ref + + # broadcast this connection. if receivers raise, disconnect. + if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers: + try: + self.receiver_connected.send( + self, receiver=receiver, sender=sender, weak=weak + ) + except TypeError as e: + self.disconnect(receiver, sender) + raise e + if receiver_connected.receivers and self is not receiver_connected: + try: + receiver_connected.send( + self, receiver_arg=receiver, sender_arg=sender, weak_arg=weak + ) + except TypeError as e: + self.disconnect(receiver, sender) + raise e + return receiver + + def connect_via( + self, sender: t.Any, weak: bool = False + ) -> t.Callable[[T_callable], T_callable]: + """Connect the decorated function as a receiver for *sender*. + + :param sender: Any object or :obj:`ANY`. The decorated function + will only receive :meth:`send` emissions sent by *sender*. If + ``ANY``, the receiver will always be notified. A function may be + decorated multiple times with differing *sender* values. + + :param weak: If true, the Signal will hold a weakref to the + decorated function and automatically disconnect when *receiver* + goes out of scope or is garbage collected. Unlike + :meth:`connect`, this defaults to False. + + The decorated function will be invoked by :meth:`send` with + `sender=` as a single positional argument and any ``kwargs`` that + were provided to the call to :meth:`send`. + + + .. versionadded:: 1.1 + + """ + + def decorator(fn: T_callable) -> T_callable: + self.connect(fn, sender, weak) + return fn + + return decorator + + @contextmanager + def connected_to( + self, receiver: t.Callable, sender: t.Any = ANY + ) -> t.Generator[None, None, None]: + """Execute a block with the signal temporarily connected to *receiver*. + + :param receiver: a receiver callable + :param sender: optional, a sender to filter on + + This is a context manager for use in the ``with`` statement. It can + be useful in unit tests. *receiver* is connected to the signal for + the duration of the ``with`` block, and will be disconnected + automatically when exiting the block: + + .. code-block:: python + + with on_ready.connected_to(receiver): + # do stuff + on_ready.send(123) + + .. versionadded:: 1.1 + + """ + self.connect(receiver, sender=sender, weak=False) + try: + yield None + finally: + self.disconnect(receiver) + + @contextmanager + def muted(self) -> t.Generator[None, None, None]: + """Context manager for temporarily disabling signal. + Useful for test purposes. + """ + self.is_muted = True + try: + yield None + except Exception as e: + raise e + finally: + self.is_muted = False + + def temporarily_connected_to( + self, receiver: t.Callable, sender: t.Any = ANY + ) -> t.ContextManager[None]: + """An alias for :meth:`connected_to`. + + :param receiver: a receiver callable + :param sender: optional, a sender to filter on + + .. versionadded:: 0.9 + + .. versionchanged:: 1.1 + Renamed to :meth:`connected_to`. ``temporarily_connected_to`` was + deprecated in 1.2 and will be removed in a subsequent version. + + """ + warn( + "temporarily_connected_to is deprecated; use connected_to instead.", + DeprecationWarning, + ) + return self.connected_to(receiver, sender) + + def send( + self, + *sender: t.Any, + _async_wrapper: AsyncWrapperType | None = None, + **kwargs: t.Any, + ) -> list[tuple[t.Callable, t.Any]]: + """Emit this signal on behalf of *sender*, passing on ``kwargs``. + + Returns a list of 2-tuples, pairing receivers with their return + value. The ordering of receiver notification is undefined. + + :param sender: Any object or ``None``. If omitted, synonymous + with ``None``. Only accepts one positional argument. + :param _async_wrapper: A callable that should wrap a coroutine + receiver and run it when called synchronously. + + :param kwargs: Data to be sent to receivers. + """ + if self.is_muted: + return [] + + sender = self._extract_sender(sender) + results = [] + for receiver in self.receivers_for(sender): + if is_coroutine_function(receiver): + if _async_wrapper is None: + raise RuntimeError("Cannot send to a coroutine function") + receiver = _async_wrapper(receiver) + result = receiver(sender, **kwargs) + results.append((receiver, result)) + return results + + async def send_async( + self, + *sender: t.Any, + _sync_wrapper: SyncWrapperType | None = None, + **kwargs: t.Any, + ) -> list[tuple[t.Callable, t.Any]]: + """Emit this signal on behalf of *sender*, passing on ``kwargs``. + + Returns a list of 2-tuples, pairing receivers with their return + value. The ordering of receiver notification is undefined. + + :param sender: Any object or ``None``. If omitted, synonymous + with ``None``. Only accepts one positional argument. + :param _sync_wrapper: A callable that should wrap a synchronous + receiver and run it when awaited. + + :param kwargs: Data to be sent to receivers. + """ + if self.is_muted: + return [] + + sender = self._extract_sender(sender) + results = [] + for receiver in self.receivers_for(sender): + if not is_coroutine_function(receiver): + if _sync_wrapper is None: + raise RuntimeError("Cannot send to a non-coroutine function") + receiver = _sync_wrapper(receiver) + result = await receiver(sender, **kwargs) + results.append((receiver, result)) + return results + + def _extract_sender(self, sender: t.Any) -> t.Any: + if not self.receivers: + # Ensure correct signature even on no-op sends, disable with -O + # for lowest possible cost. + if __debug__ and sender and len(sender) > 1: + raise TypeError( + f"send() accepts only one positional argument, {len(sender)} given" + ) + return [] + + # Using '*sender' rather than 'sender=None' allows 'sender' to be + # used as a keyword argument- i.e. it's an invisible name in the + # function signature. + if len(sender) == 0: + sender = None + elif len(sender) > 1: + raise TypeError( + f"send() accepts only one positional argument, {len(sender)} given" + ) + else: + sender = sender[0] + return sender + + def has_receivers_for(self, sender: t.Any) -> bool: + """True if there is probably a receiver for *sender*. + + Performs an optimistic check only. Does not guarantee that all + weakly referenced receivers are still alive. See + :meth:`receivers_for` for a stronger search. + + """ + if not self.receivers: + return False + if self._by_sender[ANY_ID]: + return True + if sender is ANY: + return False + return hashable_identity(sender) in self._by_sender + + def receivers_for( + self, sender: t.Any + ) -> t.Generator[t.Callable[[t.Any], t.Any], None, None]: + """Iterate all live receivers listening for *sender*.""" + # TODO: test receivers_for(ANY) + if self.receivers: + sender_id = hashable_identity(sender) + if sender_id in self._by_sender: + ids = self._by_sender[ANY_ID] | self._by_sender[sender_id] + else: + ids = self._by_sender[ANY_ID].copy() + for receiver_id in ids: + receiver = self.receivers.get(receiver_id) + if receiver is None: + continue + if isinstance(receiver, WeakTypes): + strong = receiver() + if strong is None: + self._disconnect(receiver_id, ANY_ID) + continue + receiver = strong + yield receiver # type: ignore[misc] + + def disconnect(self, receiver: t.Callable, sender: t.Any = ANY) -> None: + """Disconnect *receiver* from this signal's events. + + :param receiver: a previously :meth:`connected` callable + + :param sender: a specific sender to disconnect from, or :obj:`ANY` + to disconnect from all senders. Defaults to ``ANY``. + + """ + sender_id: IdentityType + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = hashable_identity(sender) + receiver_id = hashable_identity(receiver) + self._disconnect(receiver_id, sender_id) + + if ( + "receiver_disconnected" in self.__dict__ + and self.receiver_disconnected.receivers + ): + self.receiver_disconnected.send(self, receiver=receiver, sender=sender) + + def _disconnect(self, receiver_id: IdentityType, sender_id: IdentityType) -> None: + if sender_id == ANY_ID: + if self._by_receiver.pop(receiver_id, False): + for bucket in self._by_sender.values(): + bucket.discard(receiver_id) + self.receivers.pop(receiver_id, None) + else: + self._by_sender[sender_id].discard(receiver_id) + self._by_receiver[receiver_id].discard(sender_id) + + def _cleanup_receiver(self, receiver_ref: annotatable_weakref) -> None: + """Disconnect a receiver from all senders.""" + self._disconnect(t.cast(IdentityType, receiver_ref.receiver_id), ANY_ID) + + def _cleanup_sender(self, sender_ref: annotatable_weakref) -> None: + """Disconnect all receivers from a sender.""" + sender_id = t.cast(IdentityType, sender_ref.sender_id) + assert sender_id != ANY_ID + self._weak_senders.pop(sender_id, None) + for receiver_id in self._by_sender.pop(sender_id, ()): + self._by_receiver[receiver_id].discard(sender_id) + + def _cleanup_bookkeeping(self) -> None: + """Prune unused sender/receiver bookkeeping. Not threadsafe. + + Connecting & disconnecting leave behind a small amount of bookkeeping + for the receiver and sender values. Typical workloads using Blinker, + for example in most web apps, Flask, CLI scripts, etc., are not + adversely affected by this bookkeeping. + + With a long-running Python process performing dynamic signal routing + with high volume- e.g. connecting to function closures, "senders" are + all unique object instances, and doing all of this over and over- you + may see memory usage will grow due to extraneous bookkeeping. (An empty + set() for each stale sender/receiver pair.) + + This method will prune that bookkeeping away, with the caveat that such + pruning is not threadsafe. The risk is that cleanup of a fully + disconnected receiver/sender pair occurs while another thread is + connecting that same pair. If you are in the highly dynamic, unique + receiver/sender situation that has lead you to this method, that + failure mode is perhaps not a big deal for you. + """ + for mapping in (self._by_sender, self._by_receiver): + for _id, bucket in list(mapping.items()): + if not bucket: + mapping.pop(_id, None) + + def _clear_state(self) -> None: + """Throw away all signal state. Useful for unit tests.""" + self._weak_senders.clear() + self.receivers.clear() + self._by_sender.clear() + self._by_receiver.clear() + + +receiver_connected = Signal( + """\ +Sent by a :class:`Signal` after a receiver connects. + +:argument: the Signal that was connected to +:keyword receiver_arg: the connected receiver +:keyword sender_arg: the sender to connect to +:keyword weak_arg: true if the connection to receiver_arg is a weak reference + +.. deprecated:: 1.2 + +As of 1.2, individual signals have their own private +:attr:`~Signal.receiver_connected` and +:attr:`~Signal.receiver_disconnected` signals with a slightly simplified +call signature. This global signal is planned to be removed in 1.6. + +""" +) + + +class NamedSignal(Signal): + """A named generic notification emitter.""" + + def __init__(self, name: str, doc: str | None = None) -> None: + Signal.__init__(self, doc) + + #: The name of this signal. + self.name = name + + def __repr__(self) -> str: + base = Signal.__repr__(self) + return f"{base[:-1]}; {self.name!r}>" + + +class Namespace(dict): + """A mapping of signal names to signals.""" + + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` *name*, creating it if required. + + Repeated calls to this function will return the same signal object. + + """ + try: + return self[name] # type: ignore[no-any-return] + except KeyError: + result = self.setdefault(name, NamedSignal(name, doc)) + return result # type: ignore[no-any-return] + + +class WeakNamespace(WeakValueDictionary): + """A weak mapping of signal names to signals. + + Automatically cleans up unused Signals when the last reference goes out + of scope. This namespace implementation exists for a measure of legacy + compatibility with Blinker <= 1.2, and may be dropped in the future. + + .. versionadded:: 1.3 + + """ + + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` *name*, creating it if required. + + Repeated calls to this function will return the same signal object. + + """ + try: + return self[name] # type: ignore[no-any-return] + except KeyError: + result = self.setdefault(name, NamedSignal(name, doc)) + return result # type: ignore[no-any-return] + + +signal = Namespace().signal diff --git a/Meliora/gmapenv/Lib/site-packages/blinker/py.typed b/Meliora/gmapenv/Lib/site-packages/blinker/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/LICENSE.rst b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/LICENSE.rst new file mode 100644 index 00000000..d12a8491 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2014 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/METADATA new file mode 100644 index 00000000..7a6bbb24 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: click +Version: 8.1.7 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Changes, https://click.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/click/ +Project-URL: Issue Tracker, https://github.com/pallets/click/issues/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: colorama ; platform_system == "Windows" +Requires-Dist: importlib-metadata ; python_version < "3.8" + +\$ click\_ +========== + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U click + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + import click + + @click.command() + @click.option("--count", default=1, help="Number of greetings.") + @click.option("--name", prompt="Your name", help="The person to greet.") + def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo(f"Hello, {name}!") + + if __name__ == '__main__': + hello() + +.. code-block:: text + + $ python hello.py --count=3 + Your name: Click + Hello, Click! + Hello, Click! + Hello, Click! + + +Donate +------ + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://click.palletsprojects.com/ +- Changes: https://click.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/click/ +- Source Code: https://github.com/pallets/click +- Issue Tracker: https://github.com/pallets/click/issues +- Chat: https://discord.gg/pallets diff --git a/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/RECORD new file mode 100644 index 00000000..3880de5b --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/RECORD @@ -0,0 +1,39 @@ +click-8.1.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.1.7.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click-8.1.7.dist-info/METADATA,sha256=qIMevCxGA9yEmJOM_4WHuUJCwWpsIEVbCPOhs45YPN4,3014 +click-8.1.7.dist-info/RECORD,, +click-8.1.7.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92 +click-8.1.7.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=YDDbjm406dTOA0V8bTtdGnhN7zj5j-_dFRewZF_pLvw,3138 +click/__pycache__/__init__.cpython-39.pyc,, +click/__pycache__/_compat.cpython-39.pyc,, +click/__pycache__/_termui_impl.cpython-39.pyc,, +click/__pycache__/_textwrap.cpython-39.pyc,, +click/__pycache__/_winconsole.cpython-39.pyc,, +click/__pycache__/core.cpython-39.pyc,, +click/__pycache__/decorators.cpython-39.pyc,, +click/__pycache__/exceptions.cpython-39.pyc,, +click/__pycache__/formatting.cpython-39.pyc,, +click/__pycache__/globals.cpython-39.pyc,, +click/__pycache__/parser.cpython-39.pyc,, +click/__pycache__/shell_completion.cpython-39.pyc,, +click/__pycache__/termui.cpython-39.pyc,, +click/__pycache__/testing.cpython-39.pyc,, +click/__pycache__/types.cpython-39.pyc,, +click/__pycache__/utils.cpython-39.pyc,, +click/_compat.py,sha256=5318agQpbt4kroKsbqDOYpTSWzL_YCZVUQiTT04yXmc,18744 +click/_termui_impl.py,sha256=3dFYv4445Nw-rFvZOTBMBPYwB1bxnmNk9Du6Dm_oBSU,24069 +click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 +click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 +click/core.py,sha256=j6oEWtGgGna8JarD6WxhXmNnxLnfRjwXglbBc-8jr7U,114086 +click/decorators.py,sha256=-ZlbGYgV-oI8jr_oH4RpuL1PFS-5QmeuEAsLDAYgxtw,18719 +click/exceptions.py,sha256=fyROO-47HWFDjt2qupo7A3J32VlpM-ovJnfowu92K3s,9273 +click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 +click/globals.py,sha256=TP-qM88STzc7f127h35TD_v920FgfOD2EwzqA0oE8XU,1961 +click/parser.py,sha256=LKyYQE9ZLj5KgIDXkrcTHQRXIggfoivX14_UVIn56YA,19067 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=Ty3VM_ts0sQhj6u7eFTiLwHPoTgcXTGEAUg2OpLqYKw,18460 +click/termui.py,sha256=H7Q8FpmPelhJ2ovOhfCRhjMtCpNyjFXryAMLZODqsdc,28324 +click/testing.py,sha256=1Qd4kS5bucn1hsNIRryd0WtTMuCpkA93grkWxT8POsU,16084 +click/types.py,sha256=TZvz3hKvBztf-Hpa2enOmP4eznSPLzijjig5b_0XMxE,36391 +click/utils.py,sha256=1476UduUNY6UePGU4m18uzVHLt1sKM2PP3yWsQhbItM,20298 diff --git a/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/WHEEL new file mode 100644 index 00000000..2c08da08 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/top_level.txt b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/top_level.txt new file mode 100644 index 00000000..dca9a909 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click-8.1.7.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/Meliora/gmapenv/Lib/site-packages/click/__init__.py b/Meliora/gmapenv/Lib/site-packages/click/__init__.py new file mode 100644 index 00000000..9a1dab04 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/__init__.py @@ -0,0 +1,73 @@ +""" +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. +""" +from .core import Argument as Argument +from .core import BaseCommand as BaseCommand +from .core import Command as Command +from .core import CommandCollection as CommandCollection +from .core import Context as Context +from .core import Group as Group +from .core import MultiCommand as MultiCommand +from .core import Option as Option +from .core import Parameter as Parameter +from .decorators import argument as argument +from .decorators import command as command +from .decorators import confirmation_option as confirmation_option +from .decorators import group as group +from .decorators import help_option as help_option +from .decorators import make_pass_decorator as make_pass_decorator +from .decorators import option as option +from .decorators import pass_context as pass_context +from .decorators import pass_obj as pass_obj +from .decorators import password_option as password_option +from .decorators import version_option as version_option +from .exceptions import Abort as Abort +from .exceptions import BadArgumentUsage as BadArgumentUsage +from .exceptions import BadOptionUsage as BadOptionUsage +from .exceptions import BadParameter as BadParameter +from .exceptions import ClickException as ClickException +from .exceptions import FileError as FileError +from .exceptions import MissingParameter as MissingParameter +from .exceptions import NoSuchOption as NoSuchOption +from .exceptions import UsageError as UsageError +from .formatting import HelpFormatter as HelpFormatter +from .formatting import wrap_text as wrap_text +from .globals import get_current_context as get_current_context +from .parser import OptionParser as OptionParser +from .termui import clear as clear +from .termui import confirm as confirm +from .termui import echo_via_pager as echo_via_pager +from .termui import edit as edit +from .termui import getchar as getchar +from .termui import launch as launch +from .termui import pause as pause +from .termui import progressbar as progressbar +from .termui import prompt as prompt +from .termui import secho as secho +from .termui import style as style +from .termui import unstyle as unstyle +from .types import BOOL as BOOL +from .types import Choice as Choice +from .types import DateTime as DateTime +from .types import File as File +from .types import FLOAT as FLOAT +from .types import FloatRange as FloatRange +from .types import INT as INT +from .types import IntRange as IntRange +from .types import ParamType as ParamType +from .types import Path as Path +from .types import STRING as STRING +from .types import Tuple as Tuple +from .types import UNPROCESSED as UNPROCESSED +from .types import UUID as UUID +from .utils import echo as echo +from .utils import format_filename as format_filename +from .utils import get_app_dir as get_app_dir +from .utils import get_binary_stream as get_binary_stream +from .utils import get_text_stream as get_text_stream +from .utils import open_file as open_file + +__version__ = "8.1.7" diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d23942cceac506c054b58971397b51e41876dfe6 GIT binary patch literal 2621 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 WG#MMlgpXIJ_!iN(m=RO;y?+6PO@8eF literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/_winconsole.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/_winconsole.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08bc82eb1f9be70cfdaa284d29c545afabc3e7bb GIT binary patch literal 7788 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 vM1bfWq%h|K%NuEA?zd-?!}$@G{_=kTsM`RI literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/core.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/core.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7ff5c7dc8e250914173140a150ece9f36db9832 GIT binary patch literal 90622 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 Mp1Rep>VEzI0`3)4X8-^I literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/decorators.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/decorators.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5204a2f65eda15147b7180ec51ef0c0005bf75d9 GIT binary patch literal 17043 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 oTHkwon)5iw868V=_dAE3{g?qvEdG9FV_q literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/exceptions.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/exceptions.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..781a847f27ac0cf037d5820becfc7646bb6459fb GIT binary patch literal 10200 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 Mo@*X%)^I!j3uk*I%>V!Z literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/formatting.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/formatting.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a64702ebef6c6a1b6b20a2996dc3fcd8522c257 GIT binary patch literal 9416 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/globals.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/globals.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd74dd60effca29fa44fbf00ffc4527c28831ae2 GIT binary patch literal 2428 zcmah~UvC>l5WhX29mjG0wJ9ViNQ(plqt;YNP{~3F6#6GnnW{~NYK-jl?b>(g-R)_2 z&q=J5hqkYLgFdv6pYkYy%pSygKH=b3WlHQU%-xN)FFY|>h$4Z-}lyAKySw=~339Jyl0(MsU+B2`W z0=xC+gkRtnVYkY+(VA#(p;z|JH$e9ie+Rx@aJns$S0m}O=na7_>=t%p zV#J}jIa@cPeJ3%mT^|3C|+`$5|OP97wYWL)=e#VpnIHuE1b6Uc=6GEVywI26gWe9v3vAAaUK)m z%(jmm{iT88c}kAS6VQ3+aPKksl_ZVgea*QBCy>4>djgl-v-oRj0zu~iQws-RX0zC) zbT0@s^;tqkf@WH9$~0y4fE`gI8x#ifeWBm7QG8A1XkYk-j+KllOO6f#p+spCtTGx) zC1@C@kb=+@)*`5wgqd(E-~#JeXPhN|XP7dr%XADW7rs=?NLAWHB@;rrLv0PEDvX&5 zqa*ZsoJDjj6%9m`LcLI(`2hwpH!b`?4(UMrV=3?%ZxMwqzZFW}#BwW}*Xh~I0o-BqMFCRh6a%4mEXu?;68i$;W62VUzPRWoBh6v zy_~RUP67x$5WV%iEa;*+9QO!zzP$JF?v26D z?HfBk>~?SU)(hPM{NP1`RHSp)2sbJ_p^ literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/parser.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/parser.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..821b46279ef326a772fdfd5f6351696fbcda3c0e GIT binary patch literal 13573 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 Veo#JtxHy|XaAN8+Q{GhJ{{Y_u0)hYl literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/shell_completion.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/shell_completion.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..809dedbc2e368de55522c7a5f1f0c91108d64989 GIT binary patch literal 17002 zcmc&*U2GdycAh`}h@xm&R{R&+87qn{CKBUhv%7_2Z|%tT##={mEhpJ!%syhC)ma$<}Gpb_iw$aLNZ8?Bu8*KztQNUmKz*z_#`V!wX=6`y57&#W@r}LJy{h8m9lbf>>_a)ZsvS~Lqwf>; z*aum=Wbe6eRQG>fvB&Mb_Z55ZJ*|4co~RzQ_f-$slhwnx^Mt)0clP7XlejuyAH>x` z=gE6|^$4yH*@tm`n6HoG`bql;u8;8bF+B4r`zT7&dGe5AAA4V`9(Rs7$DE_~Qy=Kn zDcpIQXU6w=cGI?bTCu<49LK$9oPC(@ar^iOx;5Mo-ZOR?EoHRqL(8*hdCs0i%d=?Fo6j*^>O1#=VOQ+uac6cHJViZ6>{B0P z>=*18(QhsRfpA*E?|FwN-Po|&Hg#Qa+td}+;%nWO-x%D=zTWX0ZX0(-u2{m_aC}GL zVo!Xr8r)-7RMWz20gB`MQ6XZhOH zul6(d)U8}UXKP(WOxyaB($DpkzS`IN`aNSS-#2XIrY64OYyJGT{y@2>f`~KdW!PD? z-{5v*&`uD_IZFY@U2(*!D>h7T-D$PVaORk*iB{8Jcg(fMZKrK6T)t$|3W2Ulpq=mT#`RE!&G{M>t8KDY3h$2PN9)%{Q%9m#2xPC1_)1#k|w-*LkV~knxieAWRUo z+@jfNZMD4HErWvUH=pOHCFWb{YzC!NqeIj34x&)@jjMSruNqnj zWfA|f6i0BcP92h;SZhJ0DUL#Vs;b#4^psXL>`^Dv%sM%gc_#-Mj4Ru)GmwH=I|n&D z!uPUv9@2NjEMaTy;9a@j#cJX(dVTHd7T*21J-;TR!;e zhTHX-p7>_PyteKzJ=xBx1t~b_+3>(;{$|Gk5rQfjZM#voe8==UPQ78ZLV2(b=q>Q{ zECZoOt*k&$bTFu~irFwOO|RSOxB}Dj*4;ZK0W6a`nNnt&ZHQrd1~`Yo$f-#wa!%Z6 zKp==sNP$okgH)|HLC0z3zA(x^_M40;T}! zDwgjHFoSss6K$Jx)wt2c3h!86`=lR24;RJ&Xe@X`@(rP9(QN}gX?e$!pC`N~x5DeL zf$E4wQbK_6i@uPo5O5d~qN^?%9mWU*+3g0{GD7-*vv^%33`5+;;+Q~I%mpHEEZ3oF zPT37Hg&mRGGqu`iIk-$sgtmhu0qHQ_rFL>xAn!;%VMoKK4N32tcSyy}n}f}Y2#yKN zywPp6{5i8UOBly=frW-Qivhk_?|QzwVbXdMnDnqO4MDq3f>HJv z;DU8jgps=2ZPAuv;=Ww$LnFxWQUZg(1_muV$kZC`RX50VT2`aISk8#2z_P-m;y8*R zE0-rGa8WlQ>%Rww>*A~+B>{s zPH{JYdm23#%cHa?nqaLK6l%2%*Y38cUaZw_b*)x-Cs(W4ZXL}dwVKy*eGgUD5A<{G z%|M6L2=dZIvs&UL&F$HEg6XM>qqy-^{8)lRc25`?MOFS+(+pKpajj~Pibd{aeTY>& zGZS){Q(Nt}>t%1IY`)9n)pB9An3patotZwl+&-CTgXrymmK`atqN_90Gf+I{!t1YH zslE03)$>bdrl#K=T)qA5^{pv+cY$u7ndW<3Hxsjfp;7kE+_1d$NJ}~9^b2MAEV94` z5`pyoboBU_O?zN3(X3C-o`m4CY{^fOpHH7YZB9)OAWTWHBvrubZ@+C$GxMD}W1fTr zIcZ+M{xV6acFb?oljeQ(!j;S4Ix|yF-5|Iw#Mqo`Vl-{+fZv_g@B>IFeUT?f^%YNG z=L49#KkW(6otc?t+zgho+F+oNQ1K3vg>IfIY!wQLos#rY^I*SsVycO#iIC8CJ?KDl z?qYI(cq=7HRe-EP!Kw$^ONV?7iL z>bPq}WQ>@Z8S}U~{TyaQj+OUzYAM&va@jm_B2<~?3qw3I1D=>UyIS6jSMIn1&~~uN z%*?_YSFc`Jyf*g&Kqv4oIi;6ml+;wpTT=5mJ z(hx&}CRh=dBv(ha!tQIUbzoW7h*3Rr?)i99y8&Sn<1;{6jiKydGs2`f*G>s2Z|7<; z*CC-45-#k+xi`&jo0tyf!Y884oO^>Of=TfIuFu~2B!X$#Hb$o&wF{R4FrjH zaK~t7oGhGfM9WSqi7Opfd0dY;S(F71IA)!sV{TMO5dtN*T$OJ5J+(T9zNNtkzBg(Y z;j-@udyd&9T#cjOUi>Eb*;x)`5}ZBuIPUHn+~L|J!kl{%R-Lf-;qDX8Bw$S<7(l^d z1e8O_6f8CnP^Qqpp}| zMm&TWzzSo0(mTD=KpfD$?Fd1hY3w#5_8#ogFyV%zwn=zIhm>LPIL{!Q%XI56E zAc}p|h&)zS%4zTVvqckQE+2~E{lCZm7!8$*3G8`51C)nj&(E8`P&vhS*xL&BNMzIy zqX4J*4!NYe1G2u6LB{jg_uK8EL;e+cU;jdnOF5_eQ#`YkI)qP z4hbj^Ha%ke$KckdF&Fo$Cviq~8o@XtDj-iDKSUpzh%tUZxY2swd(#qirl4Lh3W%&l^AO9ZKUc(RT+H zbqr=KQY>0xaa(<$>_@z&toHu#ia>axPC=>R&>V&RC2`5X-7b_B5n*KqN>^5%Sy`F$ z{7obxG-daLU7~*53YvRj<*>hB!r6P?|j?VuN z+GQ*!+nd}Ci97H|l*sra_V<-~1W5z$c0_8O7q1|ozM2aYvO8X=J$bG!k2FFsU*eT%MtDGEe7_5~qa zu^Uc;eM89%nh2stA&xS=<7pi2(z~n&28{{|gXv2dNR$_SNN&@QF?k9VKjvo8q~2GN z!qa^N5k(~Q?&-_gma&D%;&uit+5?Sf)w+gxou@?Q23f*HuwiP9)iNvq1XM%IATst% zvIwG}dW?8>Fywe?NKh`$Lqr)#JHQ3q%jo(^iY)UsMuHKc@E8iwqKjaYYXU3bbQm0@ zrxZ%`hyhY$ggMmpM6hA@ke)qnUWQ9Tv=Fa=nz8d>9=X}T7$kDXYw%9o*6ldkIHWU!eQ}4uV>l}mDbfqrQ*jXmlEVJoKnDhg z_%GO#rXCL`7Zi`ISfwzjj;p<+pG0fkLqvTkr?Gp~_iTHb$mn zSUiC_>+V{+(Tf#nyv<2A{zRsXjY?w1czCoqcqHeD$#4aM$T?sJQaBDaV^O>UgggvG z)32dEjK;lkNJNqV_C(CE+1^uWB<|>&l5fP3q-BXyy_ZnDr)(<^6mXxqrJ;_Pz9uj6rC_6B*!v2C|)z^0cG1!n4!pM{(q*3zL z+mB)mV(fZpOC`inn&J1fTkuqP%gU;F9X*h(&?=_{@8nrr%kAXcN8xk}Tu<}<+6ipo zf8(ywdp5m+kvyoJ=Gdh7HB_QOfm(n$ah`xuekL%QZUcs!v?nf5Gcja!G=Ui~X4jWf zI7=O99-Og0N;D)b+#)i+6KZeB!i^?UJ}91}L95OS!M}k{e{qq8ewEqr2?*xj1Y7|S^QchD#NRZ%*^oXX8=MEQ3`D6Kl zn*XR+8qW(FQ^zm$VIvkTUK>T^b4Mv}CsRejo6LFmyhwB3H{d(xoe{cb2Fls_`^9R( z8EqEv8*@hBp^vbaOe16xyyWb`h*9{#MSBdM@A!AXq1C-$vrBI9~RlG_dveAp(4T8)s_z zYBRH)eV{-LXnoCAx~gdPwe1{>34IGH+s@onyej`|qL1@7xE6gs?~mBod#a69zptrE zdz@QF1}&5_EEg8}um$M&9ZaXE&DDGRInaW*`77s^Uah@(;p)<**B24mR&hMTw?V(X ziFam}?dQtNmGBQ2f%;N!VFyNFL4p1TDcu-Fk$dWyIM{+vAhdqle5vwMA$gT;u+X+vTkdOg4-{1~dcBktH8F)GMb^2?%0)LG*47;?Q8JxOXLpvzR|6|S2ev;2?NV#es^`1=9SS1Z9B?Vz zx{QQEWfxs3E@M=kG*|SYI!&4J#apK~6@(n1?wbfbaNt2(e5B68$v4qY=J6M)mL@e8 zyH%PRgI9aUQd_k{<(4OQ)g3c{jO_T*>u+3LxKMiqT+g0dQ1nQ3)TN=#RK$8k(hw;e z@irC9RInCgeLzY#7z;_Oju>D>UOaaa+*0dZNA1}Nt#sxIo;A=qerUotRupu%j$i6S zNIQ$4N87Z!_@~oO2(K0(+Bv*x>k#b_i4f%!SS{FDh;~v0Ms>^{ApsbSRufWPdiF`d zLQ)+)DuIryiWKRXb^Q6c5Wnc)dBUUOE)_#$K*+ZvRPLbArxNS?>;xLCDH2^E%mjfl zp=#m?TD7)jYam%1^epR(Vu>cla#K%G?r~~;9Qk%=-XZxOP0n-&^)8l6k0;;JhvAd7AawD@7I zcPusa&qv9zAij9%3zG7;F&}>yQl|D`Z_3ZPhO=t0yfQeuiKFY%7!>!=Py8x(u35LO zMvKlP%M-pH!cI7S?r}O{_mDtLfVAPz`YO(imnZd53FaVyA$ule9isO@7?Du*DX^h%=tAxN*Janm zDbkK<#p}d&eHsab$rf52qw(|aGlh(KkNI$JgggRhHu!9Agms5cEYNu@ibn2s9GCYm z+OBwu;ExPINSc+%2fhjIqKpDD3PxHQ?cxA#{RLr}^4!X+50>^_Oz41i$g9XJQ_z|3hR@)s(h+0%Vn`T;M#PrVTI|zBhmtQYiu*t@Ye1ZsFEnuI z8^&_G?g-ig=A|IZ@I2n=Ak(JDRr%$G7$r67ObOzO>L{F>*Ul}TzkF%&LXhF)L|{;? zDbQO^JKTQpK7oIViZsmx2WkxuM|q>wQJ9WjZ}}UdBO)>du@!o;prjSl@sBkfdiG;Y zD?Spxk9!e#hRiI?q({T>A=;vArY$MXy}YEV(2k&7s&bnsLGOKef!tp{H3BN&&BVbY z_oipI8aHJy9k{|dMTFb2{W!o0d0e?D;}AIQP(w=%ySUo8>p;&i+4GVEwLZM+al8}- zP&IdzMgh)0#lngGiM%TQ027BPLd+w5JVqg}k=7M`NPEZp)5HbS`+$G6rsf^)YfW7o zqm|o;%KC<%LFNSC^UC!Z&Y5Hoe$fwrQ<~YEhImy~Zhh0I*Q7G{G*Rhiw)9&S*jL~~ zcb#miW}b0o^#1lUa*tf3ab6tR}vXI|%QL;V97GJ! zhu)8)g)syC2P$Ms(%Bv&dwK(oQo5^J17h}1)$bxa-#3~F&o@B|TRM#DAEIt-Wk4<& zKMPX$VL#K%dH4I7ZM-+v*B@wj&n~-_Ltn%%VJF#rM6vrhz|KxZ{yX)NB)TLBiY zBy!Y|++A;AI}tzIg!racvmhap?~$=AhCF8RikE9R7KT1-!h{jjSQQ}k$H`W=-P%Ni zu+?(!#3^qA-Qwjjy{zCw%-yu~+oTzRBgOuoiQFS>O$t0kBKsg0DpASEbYuqnyN)+j zs(S|MNmjEv->+l7VHx`&#z_UJ*Ej5H4l&powD%Cxim#*Fe-ewHMnx&*)q{wt8DLB> zr%C}*Lz_@bU|A!)qSq97*a~Wv#+^Bz|(p%_%RRvB`S!ft8j8l5an8X z796eJR>V9d#$noMVjfX;HGBsaadvW+k#f@?sEAG?O@3PyZ^nJ!B!f!2$f0Qk`*sW5 z4#jX}D+|7dWaww_>0%We4Od!&Q@y0zTIC*x(Ibls1B7};=yvpwbGtdwm8BzpcM_-v&{X!;LY>v?bh}b{T zB>O^q70z?8iqDalf25w_h%z!FbLAYXDM894$RcfqbgCdS4+<3T4b42#C(@S6B@`Lc zBD+=;78Aci1sfn~^G&>p8#A!6JbHmk*#pN4IlytXkext~xoFUPpe2+Al-#$hE|y=A z0hf6U2(ozHfU?64)+fsvyzwf-=b0`{@-PeX zP3rO@6`Ux%O|>Ib9HpX9#jjEE9V%X;f_^rP^Cm ze2EHjBH7bH_RMu#j7o|3WxB)YC85DFy&&^O8-&fMNJth&Dy1BQ{Au~#*Vn)^if5xh zW)a^a41uAq5oaPP7kQ#|!Z3|l<3Oo7{?hpV@k5iikMB>9<&}>$Y=HJraq>uE;?Ts% S;X`s{Ue$h5oG+^TKl(qB(~_wG literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/termui.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/termui.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ead617af1000a1a9c9bfd1adfba4c9b71605c0d3 GIT binary patch literal 25873 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/testing.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/testing.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b90414998c60dff6b94bb4514271a417f27a5f66 GIT binary patch literal 15152 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 SZ1ecU+}v@~{;;qxz4E_?F@wbb literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/types.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/types.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a699695b9a72a6cfa2eef7508b05264c0cd7d59 GIT binary patch literal 33410 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 Zm-Zq3@`P3Trqpcdk^7&?TH(L+{{iRQ)MNkv literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/__pycache__/utils.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/click/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ed75259274c31e1f2f30bd63f532a4bea573ed8 GIT binary patch literal 18759 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 VKP5<6zpTwj`Og_nm$rKRe*r>hp_~8! literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/click/_compat.py b/Meliora/gmapenv/Lib/site-packages/click/_compat.py new file mode 100644 index 00000000..23f88665 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/_compat.py @@ -0,0 +1,623 @@ +import codecs +import io +import os +import re +import sys +import typing as t +from weakref import WeakKeyDictionary + +CYGWIN = sys.platform.startswith("cygwin") +WIN = sys.platform.startswith("win") +auto_wrap_for_ansi: t.Optional[t.Callable[[t.TextIO], t.TextIO]] = None +_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") + + +def _make_text_stream( + stream: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = "replace" + return _NonClosingTextIOWrapper( + stream, + encoding, + errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def is_ascii_encoding(encoding: str) -> bool: + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream: t.IO[t.Any]) -> str: + """Returns the default stream encoding if not found.""" + rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return "utf-8" + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + def __init__( + self, + stream: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, + **extra: t.Any, + ) -> None: + self._stream = stream = t.cast( + t.BinaryIO, _FixupStream(stream, force_readable, force_writable) + ) + super().__init__(stream, encoding, errors, **extra) + + def __del__(self) -> None: + try: + self.detach() + except Exception: + pass + + def isatty(self) -> bool: + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream: + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__( + self, + stream: t.BinaryIO, + force_readable: bool = False, + force_writable: bool = False, + ): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._stream, name) + + def read1(self, size: int) -> bytes: + f = getattr(self._stream, "read1", None) + + if f is not None: + return t.cast(bytes, f(size)) + + return self._stream.read(size) + + def readable(self) -> bool: + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self) -> bool: + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.write("") # type: ignore + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self) -> bool: + x = getattr(self._stream, "seekable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + +def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + +def _find_binary_reader(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _find_binary_writer(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _stream_is_misconfigured(stream: t.TextIO) -> bool: + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") + + +def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: t.Optional[str]) -> bool: + """A stream attribute is compatible if it is equal to the + desired value or the desired value is unset and the attribute + has a value. + """ + stream_value = getattr(stream, attr, None) + return stream_value == value or (value is None and stream_value is not None) + + +def _is_compatible_text_stream( + stream: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> bool: + """Check if a stream's encoding and errors attributes are + compatible with the desired values. + """ + return _is_compat_stream_attr( + stream, "encoding", encoding + ) and _is_compat_stream_attr(stream, "errors", errors) + + +def _force_correct_text_stream( + text_stream: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + is_binary: t.Callable[[t.IO[t.Any], bool], bool], + find_binary: t.Callable[[t.IO[t.Any]], t.Optional[t.BinaryIO]], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if is_binary(text_stream, False): + binary_reader = t.cast(t.BinaryIO, text_stream) + else: + text_stream = t.cast(t.TextIO, text_stream) + # If the stream looks compatible, and won't default to a + # misconfigured ascii encoding, return it as-is. + if _is_compatible_text_stream(text_stream, encoding, errors) and not ( + encoding is None and _stream_is_misconfigured(text_stream) + ): + return text_stream + + # Otherwise, get the underlying binary reader. + possible_binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if possible_binary_reader is None: + return text_stream + + binary_reader = possible_binary_reader + + # Default errors to replace instead of strict in order to get + # something that works. + if errors is None: + errors = "replace" + + # Wrap the binary stream in a text stream with the correct + # encoding parameters. + return _make_text_stream( + binary_reader, + encoding, + errors, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def _force_correct_text_reader( + text_reader: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_reader, + encoding, + errors, + _is_binary_reader, + _find_binary_reader, + force_readable=force_readable, + ) + + +def _force_correct_text_writer( + text_writer: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + force_writable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + +def get_binary_stdin() -> t.BinaryIO: + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdin.") + return reader + + +def get_binary_stdout() -> t.BinaryIO: + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdout.") + return writer + + +def get_binary_stderr() -> t.BinaryIO: + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stderr.") + return writer + + +def get_text_stdin( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) + + +def get_text_stdout( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) + + +def get_text_stderr( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) + + +def _wrap_io_open( + file: t.Union[str, "os.PathLike[str]", int], + mode: str, + encoding: t.Optional[str], + errors: t.Optional[str], +) -> t.IO[t.Any]: + """Handles not passing ``encoding`` and ``errors`` in binary mode.""" + if "b" in mode: + return open(file, mode) + + return open(file, mode, encoding=encoding, errors=errors) + + +def open_stream( + filename: "t.Union[str, os.PathLike[str]]", + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, +) -> t.Tuple[t.IO[t.Any], bool]: + binary = "b" in mode + filename = os.fspath(filename) + + # Standard streams first. These are simple because they ignore the + # atomic flag. Use fsdecode to handle Path("-"). + if os.fsdecode(filename) == "-": + if any(m in mode for m in ["w", "a", "x"]): + if binary: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if binary: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + return _wrap_io_open(filename, mode, encoding, errors), True + + # Some usability stuff for atomic writes + if "a" in mode: + raise ValueError( + "Appending to an existing file is not supported, because that" + " would involve an expensive `copy`-operation to a temporary" + " file. Open the file in normal `w`-mode and copy explicitly" + " if that's what you're after." + ) + if "x" in mode: + raise ValueError("Use the `overwrite`-parameter instead.") + if "w" not in mode: + raise ValueError("Atomic writes only make sense with `w`-mode.") + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import errno + import random + + try: + perm: t.Optional[int] = os.stat(filename).st_mode + except OSError: + perm = None + + flags = os.O_RDWR | os.O_CREAT | os.O_EXCL + + if binary: + flags |= getattr(os, "O_BINARY", 0) + + while True: + tmp_filename = os.path.join( + os.path.dirname(filename), + f".__atomic-write{random.randrange(1 << 32):08x}", + ) + try: + fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) + break + except OSError as e: + if e.errno == errno.EEXIST or ( + os.name == "nt" + and e.errno == errno.EACCES + and os.path.isdir(e.filename) + and os.access(e.filename, os.W_OK) + ): + continue + raise + + if perm is not None: + os.chmod(tmp_filename, perm) # in case perm includes bits in umask + + f = _wrap_io_open(fd, mode, encoding, errors) + af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) + return t.cast(t.IO[t.Any], af), True + + +class _AtomicFile: + def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self) -> str: + return self._real_filename + + def close(self, delete: bool = False) -> None: + if self.closed: + return + self._f.close() + os.replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._f, name) + + def __enter__(self) -> "_AtomicFile": + return self + + def __exit__(self, exc_type: t.Optional[t.Type[BaseException]], *_: t.Any) -> None: + self.close(delete=exc_type is not None) + + def __repr__(self) -> str: + return repr(self._f) + + +def strip_ansi(value: str) -> str: + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi( + stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None +) -> bool: + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) and not _is_jupyter_kernel_output(stream) + return not color + + +# On Windows, wrap the output streams with colorama to support ANSI +# color codes. +# NOTE: double check is needed so mypy does not analyze this on Linux +if sys.platform.startswith("win") and WIN: + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding() -> str: + import locale + + return locale.getpreferredencoding() + + _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def auto_wrap_for_ansi( # noqa: F811 + stream: t.TextIO, color: t.Optional[bool] = None + ) -> t.TextIO: + """Support ANSI color and style codes on Windows by wrapping a + stream with colorama. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + + if cached is not None: + return cached + + import colorama + + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = t.cast(t.TextIO, ansi_wrapper.stream) + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except BaseException: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + + return rv + +else: + + def _get_argv_encoding() -> str: + return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() + + def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] + ) -> t.Optional[t.TextIO]: + return None + + +def term_len(x: str) -> int: + return len(strip_ansi(x)) + + +def isatty(stream: t.IO[t.Any]) -> bool: + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func( + src_func: t.Callable[[], t.Optional[t.TextIO]], + wrapper_func: t.Callable[[], t.TextIO], +) -> t.Callable[[], t.Optional[t.TextIO]]: + cache: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def func() -> t.Optional[t.TextIO]: + stream = src_func() + + if stream is None: + return None + + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + cache[stream] = rv + except Exception: + pass + return rv + + return func + + +_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) + + +binary_streams: t.Mapping[str, t.Callable[[], t.BinaryIO]] = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams: t.Mapping[ + str, t.Callable[[t.Optional[str], t.Optional[str]], t.TextIO] +] = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/Meliora/gmapenv/Lib/site-packages/click/_termui_impl.py b/Meliora/gmapenv/Lib/site-packages/click/_termui_impl.py new file mode 100644 index 00000000..f7446577 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/_termui_impl.py @@ -0,0 +1,739 @@ +""" +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. +""" +import contextlib +import math +import os +import sys +import time +import typing as t +from gettext import gettext as _ +from io import StringIO +from types import TracebackType + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import isatty +from ._compat import open_stream +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +V = t.TypeVar("V") + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +class ProgressBar(t.Generic[V]): + def __init__( + self, + iterable: t.Optional[t.Iterable[V]], + length: t.Optional[int] = None, + fill_char: str = "#", + empty_char: str = " ", + bar_template: str = "%(bar)s", + info_sep: str = " ", + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + label: t.Optional[str] = None, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, + width: int = 30, + ) -> None: + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label: str = label or "" + + if file is None: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + file = StringIO() + + self.file = file + self.color = color + self.update_min_steps = update_min_steps + self._completed_intervals = 0 + self.width: int = width + self.autowidth: bool = width == 0 + + if length is None: + from operator import length_hint + + length = length_hint(iterable, -1) + + if length == -1: + length = None + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = t.cast(t.Iterable[V], range(length)) + self.iter: t.Iterable[V] = iter(iterable) + self.length = length + self.pos = 0 + self.avg: t.List[float] = [] + self.last_eta: float + self.start: float + self.start = self.last_eta = time.time() + self.eta_known: bool = False + self.finished: bool = False + self.max_width: t.Optional[int] = None + self.entered: bool = False + self.current_item: t.Optional[V] = None + self.is_hidden: bool = not isatty(self.file) + self._last_line: t.Optional[str] = None + + def __enter__(self) -> "ProgressBar[V]": + self.entered = True + self.render_progress() + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self.render_finish() + + def __iter__(self) -> t.Iterator[V]: + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + self.render_progress() + return self.generator() + + def __next__(self) -> V: + # Iteration is defined in terms of a generator function, + # returned by iter(self); use that to define next(). This works + # because `self.iter` is an iterable consumed by that generator, + # so it is re-entry safe. Calling `next(self.generator())` + # twice works and does "what you want". + return next(iter(self)) + + def render_finish(self) -> None: + if self.is_hidden: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self) -> float: + if self.finished: + return 1.0 + return min(self.pos / (float(self.length or 1) or 1), 1.0) + + @property + def time_per_iteration(self) -> float: + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self) -> float: + if self.length is not None and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self) -> str: + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" + else: + return f"{hours:02}:{minutes:02}:{seconds:02}" + return "" + + def format_pos(self) -> str: + pos = str(self.pos) + if self.length is not None: + pos += f"/{self.length}" + return pos + + def format_pct(self) -> str: + return f"{int(self.pct * 100): 4}%"[1:] + + def format_bar(self) -> str: + if self.length is not None: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + chars = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + chars[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(chars) + return bar + + def format_progress_line(self) -> str: + show_percent = self.show_percent + + info_bits = [] + if self.length is not None and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return ( + self.bar_template + % { + "label": self.label, + "bar": self.format_bar(), + "info": self.info_sep.join(info_bits), + } + ).rstrip() + + def render_progress(self) -> None: + import shutil + + if self.is_hidden: + # Only output the label as it changes if the output is not a + # TTY. Use file=stderr if you expect to be piping stdout. + if self._last_line != self.label: + self._last_line = self.label + echo(self.label, file=self.file, color=self.color) + + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, shutil.get_terminal_size().columns - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(" " * self.max_width) # type: ignore + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(" " * (clear_width - line_len)) + line = "".join(buf) + # Render the line only if it changed. + + if line != self._last_line: + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps: int) -> None: + self.pos += n_steps + if self.length is not None and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length is not None + + def update(self, n_steps: int, current_item: t.Optional[V] = None) -> None: + """Update the progress bar by advancing a specified number of + steps, and optionally set the ``current_item`` for this new + position. + + :param n_steps: Number of steps to advance. + :param current_item: Optional item to set as ``current_item`` + for the updated position. + + .. versionchanged:: 8.0 + Added the ``current_item`` optional parameter. + + .. versionchanged:: 8.0 + Only render when the number of steps meets the + ``update_min_steps`` threshold. + """ + if current_item is not None: + self.current_item = current_item + + self._completed_intervals += n_steps + + if self._completed_intervals >= self.update_min_steps: + self.make_step(self._completed_intervals) + self.render_progress() + self._completed_intervals = 0 + + def finish(self) -> None: + self.eta_known = False + self.current_item = None + self.finished = True + + def generator(self) -> t.Iterator[V]: + """Return a generator which yields the items added to the bar + during construction, and updates the progress bar *after* the + yielded block returns. + """ + # WARNING: the iterator interface for `ProgressBar` relies on + # this and only works because this is a simple generator which + # doesn't create or manage additional state. If this function + # changes, the impact should be evaluated both against + # `iter(bar)` and `next(bar)`. `next()` in particular may call + # `self.generator()` repeatedly, and this must remain safe in + # order for that interface to work. + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + + if self.is_hidden: + yield from self.iter + else: + for rv in self.iter: + self.current_item = rv + + # This allows show_item_func to be updated before the + # item is processed. Only trigger at the beginning of + # the update interval. + if self._completed_intervals == 0: + self.render_progress() + + yield rv + self.update(1) + + self.finish() + self.render_progress() + + +def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if stdout is None: + stdout = StringIO() + + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get("PAGER", None) or "").strip() + if pager_cmd: + if WIN: + return _tempfilepager(generator, pager_cmd, color) + return _pipepager(generator, pager_cmd, color) + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if WIN or sys.platform.startswith("os2"): + return _tempfilepager(generator, "more <", color) + if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0: + return _pipepager(generator, "less", color) + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, "system") and os.system(f'more "{filename}"') == 0: + return _pipepager(generator, "more", color) + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> None: + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + """ + import subprocess + + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit("/", 1)[-1].split() + if color is None and cmd_detail[0] == "less": + less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_detail[1:])}" + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env) + stdin = t.cast(t.BinaryIO, c.stdin) + encoding = get_best_encoding(stdin) + try: + for text in generator: + if not color: + text = strip_ansi(text) + + stdin.write(text.encode(encoding, "replace")) + except (OSError, KeyboardInterrupt): + pass + else: + stdin.close() + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + +def _tempfilepager( + generator: t.Iterable[str], cmd: str, color: t.Optional[bool] +) -> None: + """Page through text by invoking a program on a temporary file.""" + import tempfile + + fd, filename = tempfile.mkstemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, "wb")[0] as f: + f.write(text.encode(encoding)) + try: + os.system(f'{cmd} "{filename}"') + finally: + os.close(fd) + os.unlink(filename) + + +def _nullpager( + stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] +) -> None: + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor: + def __init__( + self, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + ) -> None: + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self) -> str: + if self.editor is not None: + return self.editor + for key in "VISUAL", "EDITOR": + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return "notepad" + for editor in "sensible-editor", "vim", "nano": + if os.system(f"which {editor} >/dev/null 2>&1") == 0: + return editor + return "vi" + + def edit_file(self, filename: str) -> None: + import subprocess + + editor = self.get_editor() + environ: t.Optional[t.Dict[str, str]] = None + + if self.env: + environ = os.environ.copy() + environ.update(self.env) + + try: + c = subprocess.Popen(f'{editor} "{filename}"', env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException( + _("{editor}: Editing failed").format(editor=editor) + ) + except OSError as e: + raise ClickException( + _("{editor}: Editing failed: {e}").format(editor=editor, e=e) + ) from e + + def edit(self, text: t.Optional[t.AnyStr]) -> t.Optional[t.AnyStr]: + import tempfile + + if not text: + data = b"" + elif isinstance(text, (bytes, bytearray)): + data = text + else: + if text and not text.endswith("\n"): + text += "\n" + + if WIN: + data = text.replace("\n", "\r\n").encode("utf-8-sig") + else: + data = text.encode("utf-8") + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + f: t.BinaryIO + + try: + with os.fdopen(fd, "wb") as f: + f.write(data) + + # If the filesystem resolution is 1 second, like Mac OS + # 10.12 Extended, or 2 seconds, like FAT32, and the editor + # closes very fast, require_save can fail. Set the modified + # time to be 2 seconds in the past to work around this. + os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) + # Depending on the resolution, the exact value might not be + # recorded, so get the new recorded value. + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + with open(name, "rb") as f: + rv = f.read() + + if isinstance(text, (bytes, bytearray)): + return rv + + return rv.decode("utf-8-sig").replace("\r\n", "\n") # type: ignore + finally: + os.unlink(name) + + +def open_url(url: str, wait: bool = False, locate: bool = False) -> int: + import subprocess + + def _unquote_file(url: str) -> str: + from urllib.parse import unquote + + if url.startswith("file://"): + url = unquote(url[7:]) + + return url + + if sys.platform == "darwin": + args = ["open"] + if wait: + args.append("-W") + if locate: + args.append("-R") + args.append(_unquote_file(url)) + null = open("/dev/null", "w") + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url.replace('"', "")) + args = f'explorer /select,"{url}"' + else: + url = url.replace('"', "") + wait_str = "/WAIT" if wait else "" + args = f'start {wait_str} "" "{url}"' + return os.system(args) + elif CYGWIN: + if locate: + url = os.path.dirname(_unquote_file(url).replace('"', "")) + args = f'cygstart "{url}"' + else: + url = url.replace('"', "") + wait_str = "-w" if wait else "" + args = f'cygstart {wait_str} "{url}"' + return os.system(args) + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or "." + else: + url = _unquote_file(url) + c = subprocess.Popen(["xdg-open", url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(("http://", "https://")) and not locate and not wait: + import webbrowser + + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch: str) -> t.Optional[BaseException]: + if ch == "\x03": + raise KeyboardInterrupt() + + if ch == "\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + + if ch == "\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + return None + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + yield -1 + + def getchar(echo: bool) -> str: + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + func: t.Callable[[], str] + + if echo: + func = msvcrt.getwche # type: ignore + else: + func = msvcrt.getwch # type: ignore + + rv = func() + + if rv in ("\x00", "\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + + _translate_ch_to_exc(rv) + return rv + +else: + import tty + import termios + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + f: t.Optional[t.TextIO] + fd: int + + if not isatty(sys.stdin): + f = open("/dev/tty") + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + + try: + old_settings = termios.tcgetattr(fd) + + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo: bool) -> str: + with raw_terminal() as fd: + ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") + + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + + _translate_ch_to_exc(ch) + return ch diff --git a/Meliora/gmapenv/Lib/site-packages/click/_textwrap.py b/Meliora/gmapenv/Lib/site-packages/click/_textwrap.py new file mode 100644 index 00000000..b47dcbd4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/_textwrap.py @@ -0,0 +1,49 @@ +import textwrap +import typing as t +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + def _handle_long_word( + self, + reversed_chunks: t.List[str], + cur_line: t.List[str], + cur_len: int, + width: int, + ) -> None: + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent: str) -> t.Iterator[None]: + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text: str) -> str: + rv = [] + + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + + if idx > 0: + indent = self.subsequent_indent + + rv.append(f"{indent}{line}") + + return "\n".join(rv) diff --git a/Meliora/gmapenv/Lib/site-packages/click/_winconsole.py b/Meliora/gmapenv/Lib/site-packages/click/_winconsole.py new file mode 100644 index 00000000..6b20df31 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/_winconsole.py @@ -0,0 +1,279 @@ +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prompt. +import io +import sys +import time +import typing as t +from ctypes import byref +from ctypes import c_char +from ctypes import c_char_p +from ctypes import c_int +from ctypes import c_ssize_t +from ctypes import c_ulong +from ctypes import c_void_p +from ctypes import POINTER +from ctypes import py_object +from ctypes import Structure +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +from ._compat import _NonClosingTextIOWrapper + +assert sys.platform == "win32" +import msvcrt # noqa: E402 +from ctypes import windll # noqa: E402 +from ctypes import WINFUNCTYPE # noqa: E402 + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetConsoleMode = kernel32.GetConsoleMode +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ("CommandLineToArgvW", windll.shell32) +) +LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b"\x1a" +MAX_BYTES_WRITTEN = 32767 + +try: + from ctypes import pythonapi +except ImportError: + # On PyPy we cannot get buffers so our ability to operate here is + # severely limited. + get_buffer = None +else: + + class Py_buffer(Structure): + _fields_ = [ + ("buf", c_void_p), + ("obj", py_object), + ("len", c_ssize_t), + ("itemsize", c_ssize_t), + ("readonly", c_int), + ("ndim", c_int), + ("format", c_char_p), + ("shape", c_ssize_p), + ("strides", c_ssize_p), + ("suboffsets", c_ssize_p), + ("internal", c_void_p), + ] + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release + + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + def __init__(self, handle): + self.handle = handle + + def isatty(self): + super().isatty() + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + def readable(self): + return True + + def readinto(self, b): + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError( + "cannot read odd number of bytes from UTF-16-LE encoded console" + ) + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW( + HANDLE(self.handle), + buffer, + code_units_to_be_read, + byref(code_units_read), + None, + ) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError(f"Windows error: {GetLastError()}") + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return "ERROR_SUCCESS" + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return "ERROR_NOT_ENOUGH_MEMORY" + return f"Windows error {errno}" + + def write(self, b): + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW( + HANDLE(self.handle), + buf, + code_units_to_be_written, + byref(code_units_written), + None, + ) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream: + def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self) -> str: + return self.buffer.name + + def write(self, x: t.AnyStr) -> int: + if isinstance(x, str): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines: t.Iterable[t.AnyStr]) -> None: + for line in lines: + self.write(line) + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._text_stream, name) + + def isatty(self) -> bool: + return self.buffer.isatty() + + def __repr__(self): + return f"" + + +def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +_stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f: t.TextIO) -> bool: + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except (OSError, io.UnsupportedOperation): + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> t.Optional[t.TextIO]: + if ( + get_buffer is not None + and encoding in {"utf-16-le", None} + and errors in {"strict", None} + and _is_console(f) + ): + func = _stream_factories.get(f.fileno()) + if func is not None: + b = getattr(f, "buffer", None) + + if b is None: + return None + + return func(b) diff --git a/Meliora/gmapenv/Lib/site-packages/click/core.py b/Meliora/gmapenv/Lib/site-packages/click/core.py new file mode 100644 index 00000000..cc65e896 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/core.py @@ -0,0 +1,3042 @@ +import enum +import errno +import inspect +import os +import sys +import typing as t +from collections import abc +from contextlib import contextmanager +from contextlib import ExitStack +from functools import update_wrapper +from gettext import gettext as _ +from gettext import ngettext +from itertools import repeat +from types import TracebackType + +from . import types +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import join_options +from .globals import pop_context +from .globals import push_context +from .parser import _flag_needs_value +from .parser import OptionParser +from .parser import split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .utils import _detect_program_name +from .utils import _expand_args +from .utils import echo +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +if t.TYPE_CHECKING: + import typing_extensions as te + from .shell_completion import CompletionItem + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +V = t.TypeVar("V") + + +def _complete_visible_commands( + ctx: "Context", incomplete: str +) -> t.Iterator[t.Tuple[str, "Command"]]: + """List all the subcommands of a group that start with the + incomplete value and aren't hidden. + + :param ctx: Invocation context for the group. + :param incomplete: Value being completed. May be empty. + """ + multi = t.cast(MultiCommand, ctx.command) + + for name in multi.list_commands(ctx): + if name.startswith(incomplete): + command = multi.get_command(ctx, name) + + if command is not None and not command.hidden: + yield name, command + + +def _check_multicommand( + base_command: "MultiCommand", cmd_name: str, cmd: "Command", register: bool = False +) -> None: + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = ( + "It is not possible to add multi commands as children to" + " another multi command that is in chain mode." + ) + else: + hint = ( + "Found a multi command as subcommand to a multi command" + " that is in chain mode. This is not supported." + ) + raise RuntimeError( + f"{hint}. Command {base_command.name!r} is set to chain and" + f" {cmd_name!r} was added as a subcommand but it in itself is a" + f" multi command. ({cmd_name!r} is a {type(cmd).__name__}" + f" within a chained {type(base_command).__name__} named" + f" {base_command.name!r})." + ) + + +def batch(iterable: t.Iterable[V], batch_size: int) -> t.List[t.Tuple[V, ...]]: + return list(zip(*repeat(iter(iterable), batch_size))) + + +@contextmanager +def augment_usage_errors( + ctx: "Context", param: t.Optional["Parameter"] = None +) -> t.Iterator[None]: + """Context manager that attaches extra information to exceptions.""" + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing( + invocation_order: t.Sequence["Parameter"], + declaration_order: t.Sequence["Parameter"], +) -> t.List["Parameter"]: + """Given a sequence of parameters in the order as should be considered + for processing and an iterable of parameters that exist, this returns + a list in the correct order as they should be processed. + """ + + def sort_key(item: "Parameter") -> t.Tuple[bool, float]: + try: + idx: float = invocation_order.index(item) + except ValueError: + idx = float("inf") + + return not item.is_eager, idx + + return sorted(declaration_order, key=sort_key) + + +class ParameterSource(enum.Enum): + """This is an :class:`~enum.Enum` that indicates the source of a + parameter's value. + + Use :meth:`click.Context.get_parameter_source` to get the + source for a parameter by name. + + .. versionchanged:: 8.0 + Use :class:`~enum.Enum` and drop the ``validate`` method. + + .. versionchanged:: 8.0 + Added the ``PROMPT`` value. + """ + + COMMANDLINE = enum.auto() + """The value was provided by the command line args.""" + ENVIRONMENT = enum.auto() + """The value was provided with an environment variable.""" + DEFAULT = enum.auto() + """Used the default specified by the parameter.""" + DEFAULT_MAP = enum.auto() + """Used a default provided by :attr:`Context.default_map`.""" + PROMPT = enum.auto() + """Used a prompt to confirm a default or provide a value.""" + + +class Context: + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + :param show_default: Show the default value for commands. If this + value is not set, it defaults to the value from the parent + context. ``Command.show_default`` overrides this default for the + specific command. + + .. versionchanged:: 8.1 + The ``show_default`` parameter is overridden by + ``Command.show_default``, instead of the other way around. + + .. versionchanged:: 8.0 + The ``show_default`` parameter defaults to the value from the + parent context. + + .. versionchanged:: 7.1 + Added the ``show_default`` parameter. + + .. versionchanged:: 4.0 + Added the ``color``, ``ignore_unknown_options``, and + ``max_content_width`` parameters. + + .. versionchanged:: 3.0 + Added the ``allow_extra_args`` and ``allow_interspersed_args`` + parameters. + + .. versionchanged:: 2.0 + Added the ``resilient_parsing``, ``help_option_names``, and + ``token_normalize_func`` parameters. + """ + + #: The formatter class to create with :meth:`make_formatter`. + #: + #: .. versionadded:: 8.0 + formatter_class: t.Type["HelpFormatter"] = HelpFormatter + + def __init__( + self, + command: "Command", + parent: t.Optional["Context"] = None, + info_name: t.Optional[str] = None, + obj: t.Optional[t.Any] = None, + auto_envvar_prefix: t.Optional[str] = None, + default_map: t.Optional[t.MutableMapping[str, t.Any]] = None, + terminal_width: t.Optional[int] = None, + max_content_width: t.Optional[int] = None, + resilient_parsing: bool = False, + allow_extra_args: t.Optional[bool] = None, + allow_interspersed_args: t.Optional[bool] = None, + ignore_unknown_options: t.Optional[bool] = None, + help_option_names: t.Optional[t.List[str]] = None, + token_normalize_func: t.Optional[t.Callable[[str], str]] = None, + color: t.Optional[bool] = None, + show_default: t.Optional[bool] = None, + ) -> None: + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: Map of parameter names to their parsed values. Parameters + #: with ``expose_value=False`` are not stored. + self.params: t.Dict[str, t.Any] = {} + #: the leftover arguments. + self.args: t.List[str] = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self.protected_args: t.List[str] = [] + #: the collected prefixes of the command's options. + self._opt_prefixes: t.Set[str] = set(parent._opt_prefixes) if parent else set() + + if obj is None and parent is not None: + obj = parent.obj + + #: the user object stored. + self.obj: t.Any = obj + self._meta: t.Dict[str, t.Any] = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and info_name is not None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + + self.default_map: t.Optional[t.MutableMapping[str, t.Any]] = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`result_callback`. + self.invoked_subcommand: t.Optional[str] = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + + #: The width of the terminal (None is autodetection). + self.terminal_width: t.Optional[int] = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width: t.Optional[int] = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args: bool = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options: bool = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ["--help"] + + #: The names for the help options. + self.help_option_names: t.List[str] = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func: t.Optional[ + t.Callable[[str], str] + ] = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing: bool = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if ( + parent is not None + and parent.auto_envvar_prefix is not None + and self.info_name is not None + ): + auto_envvar_prefix = ( + f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" + ) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + + if auto_envvar_prefix is not None: + auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") + + self.auto_envvar_prefix: t.Optional[str] = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color: t.Optional[bool] = color + + if show_default is None and parent is not None: + show_default = parent.show_default + + #: Show option default values when formatting help text. + self.show_default: t.Optional[bool] = show_default + + self._close_callbacks: t.List[t.Callable[[], t.Any]] = [] + self._depth = 0 + self._parameter_source: t.Dict[str, ParameterSource] = {} + self._exit_stack = ExitStack() + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire CLI + structure. + + .. code-block:: python + + with Context(cli) as ctx: + info = ctx.to_info_dict() + + .. versionadded:: 8.0 + """ + return { + "command": self.command.to_info_dict(self), + "info_name": self.info_name, + "allow_extra_args": self.allow_extra_args, + "allow_interspersed_args": self.allow_interspersed_args, + "ignore_unknown_options": self.ignore_unknown_options, + "auto_envvar_prefix": self.auto_envvar_prefix, + } + + def __enter__(self) -> "Context": + self._depth += 1 + push_context(self) + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup: bool = True) -> t.Iterator["Context"]: + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self) -> t.Dict[str, t.Any]: + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = f'{__name__}.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self) -> HelpFormatter: + """Creates the :class:`~click.HelpFormatter` for the help and + usage output. + + To quickly customize the formatter class used without overriding + this method, set the :attr:`formatter_class` attribute. + + .. versionchanged:: 8.0 + Added the :attr:`formatter_class` attribute. + """ + return self.formatter_class( + width=self.terminal_width, max_width=self.max_content_width + ) + + def with_resource(self, context_manager: t.ContextManager[V]) -> V: + """Register a resource as if it were used in a ``with`` + statement. The resource will be cleaned up when the context is + popped. + + Uses :meth:`contextlib.ExitStack.enter_context`. It calls the + resource's ``__enter__()`` method and returns the result. When + the context is popped, it closes the stack, which calls the + resource's ``__exit__()`` method. + + To register a cleanup function for something that isn't a + context manager, use :meth:`call_on_close`. Or use something + from :mod:`contextlib` to turn it into a context manager first. + + .. code-block:: python + + @click.group() + @click.option("--name") + @click.pass_context + def cli(ctx): + ctx.obj = ctx.with_resource(connect_db(name)) + + :param context_manager: The context manager to enter. + :return: Whatever ``context_manager.__enter__()`` returns. + + .. versionadded:: 8.0 + """ + return self._exit_stack.enter_context(context_manager) + + def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Register a function to be called when the context tears down. + + This can be used to close resources opened during the script + execution. Resources that support Python's context manager + protocol which would be used in a ``with`` statement should be + registered with :meth:`with_resource` instead. + + :param f: The function to execute on teardown. + """ + return self._exit_stack.callback(f) + + def close(self) -> None: + """Invoke all close callbacks registered with + :meth:`call_on_close`, and exit all context managers entered + with :meth:`with_resource`. + """ + self._exit_stack.close() + # In case the context is reused, create a new exit stack. + self._exit_stack = ExitStack() + + @property + def command_path(self) -> str: + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = "" + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + parent_command_path = [self.parent.command_path] + + if isinstance(self.parent.command, Command): + for param in self.parent.command.get_params(self): + parent_command_path.extend(param.get_usage_pieces(self)) + + rv = f"{' '.join(parent_command_path)} {rv}" + return rv.lstrip() + + def find_root(self) -> "Context": + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type: t.Type[V]) -> t.Optional[V]: + """Finds the closest object of a given type.""" + node: t.Optional["Context"] = self + + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + + node = node.parent + + return None + + def ensure_object(self, object_type: t.Type[V]) -> V: + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + @t.overload + def lookup_default( + self, name: str, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @t.overload + def lookup_default( + self, name: str, call: "te.Literal[False]" = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def lookup_default(self, name: str, call: bool = True) -> t.Optional[t.Any]: + """Get the default for a parameter from :attr:`default_map`. + + :param name: Name of the parameter. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + if self.default_map is not None: + value = self.default_map.get(name) + + if call and callable(value): + return value() + + return value + + return None + + def fail(self, message: str) -> "te.NoReturn": + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self) -> "te.NoReturn": + """Aborts the script.""" + raise Abort() + + def exit(self, code: int = 0) -> "te.NoReturn": + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self) -> str: + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self) -> str: + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def _make_sub_context(self, command: "Command") -> "Context": + """Create a new context of the same type as this context, but + for a new command. + + :meta private: + """ + return type(self)(command, info_name=command.name, parent=self) + + @t.overload + def invoke( + __self, # noqa: B902 + __callback: "t.Callable[..., V]", + *args: t.Any, + **kwargs: t.Any, + ) -> V: + ... + + @t.overload + def invoke( + __self, # noqa: B902 + __callback: "Command", + *args: t.Any, + **kwargs: t.Any, + ) -> t.Any: + ... + + def invoke( + __self, # noqa: B902 + __callback: t.Union["Command", "t.Callable[..., V]"], + *args: t.Any, + **kwargs: t.Any, + ) -> t.Union[t.Any, V]: + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if :meth:`forward` is called at multiple levels. + """ + if isinstance(__callback, Command): + other_cmd = __callback + + if other_cmd.callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + else: + __callback = t.cast("t.Callable[..., V]", other_cmd.callback) + + ctx = __self._make_sub_context(other_cmd) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.type_cast_value( # type: ignore + ctx, param.get_default(ctx) + ) + + # Track all kwargs as params, so that forward() will pass + # them on in subsequent calls. + ctx.params.update(kwargs) + else: + ctx = __self + + with augment_usage_errors(__self): + with ctx: + return __callback(*args, **kwargs) + + def forward( + __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 + ) -> t.Any: + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if ``forward`` is called at multiple levels. + """ + # Can only forward to other commands, not direct callbacks. + if not isinstance(__cmd, Command): + raise TypeError("Callback is not a command.") + + for param in __self.params: + if param not in kwargs: + kwargs[param] = __self.params[param] + + return __self.invoke(__cmd, *args, **kwargs) + + def set_parameter_source(self, name: str, source: ParameterSource) -> None: + """Set the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + :param name: The name of the parameter. + :param source: A member of :class:`~click.core.ParameterSource`. + """ + self._parameter_source[name] = source + + def get_parameter_source(self, name: str) -> t.Optional[ParameterSource]: + """Get the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + This can be useful for determining when a user specified a value + on the command line that is the same as the default value. It + will be :attr:`~click.core.ParameterSource.DEFAULT` only if the + value was actually taken from the default. + + :param name: The name of the parameter. + :rtype: ParameterSource + + .. versionchanged:: 8.0 + Returns ``None`` if the parameter was not provided from any + source. + """ + return self._parameter_source.get(name) + + +class BaseCommand: + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + """ + + #: The context class to create with :meth:`make_context`. + #: + #: .. versionadded:: 8.0 + context_class: t.Type[Context] = Context + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__( + self, + name: t.Optional[str], + context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, + ) -> None: + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + + if context_settings is None: + context_settings = {} + + #: an optional dictionary with defaults passed to the context. + self.context_settings: t.MutableMapping[str, t.Any] = context_settings + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire structure + below this command. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + :param ctx: A :class:`Context` representing this command. + + .. versionadded:: 8.0 + """ + return {"name": self.name} + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def get_usage(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get usage") + + def get_help(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get help") + + def make_context( + self, + info_name: t.Optional[str], + args: t.List[str], + parent: t.Optional[Context] = None, + **extra: t.Any, + ) -> Context: + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + To quickly customize the context class used without overriding + this method, set the :attr:`context_class` attribute. + + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it's + the name of the command. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + + .. versionchanged:: 8.0 + Added the :attr:`context_class` attribute. + """ + for key, value in self.context_settings.items(): + if key not in extra: + extra[key] = value + + ctx = self.context_class( + self, info_name=info_name, parent=parent, **extra # type: ignore + ) + + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError("Base commands do not know how to parse arguments.") + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError("Base commands are not invocable by default") + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of chained multi-commands. + + Any command could be part of a chained multi-command, so sibling + commands are valid at any point during command completion. Other + command classes will return more completions. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List["CompletionItem"] = [] + + while ctx.parent is not None: + ctx = ctx.parent + + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + results.extend( + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + if name not in ctx.protected_args + ) + + return results + + @t.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: "te.Literal[True]" = True, + **extra: t.Any, + ) -> "te.NoReturn": + ... + + @t.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = ..., + **extra: t.Any, + ) -> t.Any: + ... + + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = True, + windows_expand_args: bool = True, + **extra: t.Any, + ) -> t.Any: + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param windows_expand_args: Expand glob patterns, user dir, and + env vars in command line args on Windows. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + + .. versionchanged:: 8.0.1 + Added the ``windows_expand_args`` parameter to allow + disabling command line arg expansion on Windows. + + .. versionchanged:: 8.0 + When taking arguments from ``sys.argv`` on Windows, glob + patterns, user dir, and env vars are expanded. + + .. versionchanged:: 3.0 + Added the ``standalone_mode`` parameter. + """ + if args is None: + args = sys.argv[1:] + + if os.name == "nt" and windows_expand_args: + args = _expand_args(args) + else: + args = list(args) + + if prog_name is None: + prog_name = _detect_program_name() + + # Process shell completion requests and exit early. + self._main_shell_completion(extra, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt) as e: + echo(file=sys.stderr) + raise Abort() from e + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except OSError as e: + if e.errno == errno.EPIPE: + sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) + sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo(_("Aborted!"), file=sys.stderr) + sys.exit(1) + + def _main_shell_completion( + self, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: t.Optional[str] = None, + ) -> None: + """Check if the shell is asking for tab completion, process + that, then exit early. Called from :meth:`main` before the + program is invoked. + + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. Defaults to + ``_{PROG_NAME}_COMPLETE``. + + .. versionchanged:: 8.2.0 + Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). + """ + if complete_var is None: + complete_name = prog_name.replace("-", "_").replace(".", "_") + complete_var = f"_{complete_name}_COMPLETE".upper() + + instruction = os.environ.get(complete_var) + + if not instruction: + return + + from .shell_completion import shell_complete + + rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) + sys.exit(rv) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is disabled by default. + If enabled this will add ``--help`` as argument + if no arguments are passed + :param hidden: hide this command from help outputs. + + :param deprecated: issues a message indicating that + the command is deprecated. + + .. versionchanged:: 8.1 + ``help``, ``epilog``, and ``short_help`` are stored unprocessed, + all formatting is done when outputting help text, not at init, + and is done even if not using the ``@command`` decorator. + + .. versionchanged:: 8.0 + Added a ``repr`` showing the command name. + + .. versionchanged:: 7.1 + Added the ``no_args_is_help`` parameter. + + .. versionchanged:: 2.0 + Added the ``context_settings`` parameter. + """ + + def __init__( + self, + name: t.Optional[str], + context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, + callback: t.Optional[t.Callable[..., t.Any]] = None, + params: t.Optional[t.List["Parameter"]] = None, + help: t.Optional[str] = None, + epilog: t.Optional[str] = None, + short_help: t.Optional[str] = None, + options_metavar: t.Optional[str] = "[OPTIONS]", + add_help_option: bool = True, + no_args_is_help: bool = False, + hidden: bool = False, + deprecated: bool = False, + ) -> None: + super().__init__(name, context_settings) + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params: t.List["Parameter"] = params or [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + info_dict.update( + params=[param.to_info_dict() for param in self.get_params(ctx)], + help=self.help, + epilog=self.epilog, + short_help=self.short_help, + hidden=self.hidden, + deprecated=self.deprecated, + ) + return info_dict + + def get_usage(self, ctx: Context) -> str: + """Formats the usage line into a string and returns it. + + Calls :meth:`format_usage` internally. + """ + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_params(self, ctx: Context) -> t.List["Parameter"]: + rv = self.params + help_option = self.get_help_option(ctx) + + if help_option is not None: + rv = [*rv, help_option] + + return rv + + def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the usage line into the formatter. + + This is a low-level method called by :meth:`get_usage`. + """ + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, " ".join(pieces)) + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] if self.options_metavar else [] + + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + + return rv + + def get_help_option_names(self, ctx: Context) -> t.List[str]: + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return list(all_names) + + def get_help_option(self, ctx: Context) -> t.Optional["Option"]: + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + + if not help_options or not self.add_help_option: + return None + + def show_help(ctx: Context, param: "Parameter", value: str) -> None: + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + return Option( + help_options, + is_flag=True, + is_eager=True, + expose_value=False, + callback=show_help, + help=_("Show this message and exit."), + ) + + def make_parser(self, ctx: Context) -> OptionParser: + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx: Context) -> str: + """Formats the help into a string and returns it. + + Calls :meth:`format_help` internally. + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_short_help_str(self, limit: int = 45) -> str: + """Gets short help for the command or makes it by shortening the + long help string. + """ + if self.short_help: + text = inspect.cleandoc(self.short_help) + elif self.help: + text = make_default_short_help(self.help, limit) + else: + text = "" + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + return text.strip() + + def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help into the formatter if it exists. + + This is a low-level method called by :meth:`get_help`. + + This calls the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help text to the formatter if it exists.""" + if self.help is not None: + # truncate the help text to the first form feed + text = inspect.cleandoc(self.help).partition("\f")[0] + else: + text = "" + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + if text: + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(text) + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section(_("Options")): + formatter.write_dl(opts) + + def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + epilog = inspect.cleandoc(self.epilog) + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(epilog) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing(param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail( + ngettext( + "Got unexpected extra argument ({args})", + "Got unexpected extra arguments ({args})", + len(args), + ).format(args=" ".join(map(str, args))) + ) + + ctx.args = args + ctx._opt_prefixes.update(parser._opt_prefixes) + return args + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.deprecated: + message = _( + "DeprecationWarning: The command {name!r} is deprecated." + ).format(name=self.name) + echo(style(message, fg="red"), err=True) + + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options and chained multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List["CompletionItem"] = [] + + if incomplete and not incomplete[0].isalnum(): + for param in self.get_params(ctx): + if ( + not isinstance(param, Option) + or param.hidden + or ( + not param.multiple + and ctx.get_parameter_source(param.name) # type: ignore + is ParameterSource.COMMANDLINE + ) + ): + continue + + results.extend( + CompletionItem(name, help=param.help) + for name in [*param.opts, *param.secondary_opts] + if name.startswith(incomplete) + ) + + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: The result callback to attach to this multi + command. This can be set or changed later with the + :meth:`result_callback` decorator. + :param attrs: Other command arguments described in :class:`Command`. + """ + + allow_extra_args = True + allow_interspersed_args = False + + def __init__( + self, + name: t.Optional[str] = None, + invoke_without_command: bool = False, + no_args_is_help: t.Optional[bool] = None, + subcommand_metavar: t.Optional[str] = None, + chain: bool = False, + result_callback: t.Optional[t.Callable[..., t.Any]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + + if subcommand_metavar is None: + if chain: + subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + else: + subcommand_metavar = "COMMAND [ARGS]..." + + self.subcommand_metavar = subcommand_metavar + self.chain = chain + # The result callback that is stored. This can be set or + # overridden with the :func:`result_callback` decorator. + self._result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError( + "Multi commands in chain mode cannot have" + " optional arguments." + ) + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + commands = {} + + for name in self.list_commands(ctx): + command = self.get_command(ctx, name) + + if command is None: + continue + + sub_ctx = ctx._make_sub_context(command) + + with sub_ctx.scope(cleanup=False): + commands[name] = command.to_info_dict(sub_ctx) + + info_dict.update(commands=commands, chain=self.chain) + return info_dict + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + rv = super().collect_usage_pieces(ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + super().format_options(ctx, formatter) + self.format_commands(ctx, formatter) + + def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: + """Adds a result callback to the command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.result_callback() + def process_result(result, input): + return result + input + + :param replace: if set to `True` an already existing result + callback will be removed. + + .. versionchanged:: 8.0 + Renamed from ``resultcallback``. + + .. versionadded:: 3.0 + """ + + def decorator(f: F) -> F: + old_callback = self._result_callback + + if old_callback is None or replace: + self._result_callback = f + return f + + def function(__value, *args, **kwargs): # type: ignore + inner = old_callback(__value, *args, **kwargs) + return f(inner, *args, **kwargs) + + self._result_callback = rv = update_wrapper(t.cast(F, function), f) + return rv + + return decorator + + def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section(_("Commands")): + formatter.write_dl(rows) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = super().parse_args(ctx, args) + + if self.chain: + ctx.protected_args = rest + ctx.args = [] + elif rest: + ctx.protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx: Context) -> t.Any: + def _process_result(value: t.Any) -> t.Any: + if self._result_callback is not None: + value = ctx.invoke(self._result_callback, value, **ctx.params) + return value + + if not ctx.protected_args: + if self.invoke_without_command: + # No subcommand was invoked, so the result callback is + # invoked with the group return value for regular + # groups, or an empty list for chained groups. + with ctx: + rv = super().invoke(ctx) + return _process_result([] if self.chain else rv) + ctx.fail(_("Missing command.")) + + # Fetch args back out + args = [*ctx.protected_args, *ctx.args] + ctx.args = [] + ctx.protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + ctx.invoked_subcommand = cmd_name + super().invoke(ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = "*" if args else None + super().invoke(ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + sub_ctx = cmd.make_context( + cmd_name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + ) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command( + self, ctx: Context, args: t.List[str] + ) -> t.Tuple[t.Optional[str], t.Optional[Command], t.List[str]]: + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) + return cmd_name if cmd else None, cmd, args[1:] + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError + + def list_commands(self, ctx: Context) -> t.List[str]: + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options, subcommands, and chained + multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results = [ + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + ] + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is + the most common way to implement nesting in Click. + + :param name: The name of the group command. + :param commands: A dict mapping names to :class:`Command` objects. + Can also be a list of :class:`Command`, which will use + :attr:`Command.name` to create the dict. + :param attrs: Other command arguments described in + :class:`MultiCommand`, :class:`Command`, and + :class:`BaseCommand`. + + .. versionchanged:: 8.0 + The ``commands`` argument can be a list of command objects. + """ + + #: If set, this is used by the group's :meth:`command` decorator + #: as the default :class:`Command` class. This is useful to make all + #: subcommands use a custom command class. + #: + #: .. versionadded:: 8.0 + command_class: t.Optional[t.Type[Command]] = None + + #: If set, this is used by the group's :meth:`group` decorator + #: as the default :class:`Group` class. This is useful to make all + #: subgroups use a custom group class. + #: + #: If set to the special value :class:`type` (literally + #: ``group_class = type``), this group's class will be used as the + #: default class. This makes a custom group class continue to make + #: custom groups. + #: + #: .. versionadded:: 8.0 + group_class: t.Optional[t.Union[t.Type["Group"], t.Type[type]]] = None + # Literal[type] isn't valid, so use Type[type] + + def __init__( + self, + name: t.Optional[str] = None, + commands: t.Optional[ + t.Union[t.MutableMapping[str, Command], t.Sequence[Command]] + ] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + + if commands is None: + commands = {} + elif isinstance(commands, abc.Sequence): + commands = {c.name: c for c in commands if c.name is not None} + + #: The registered subcommands by their exported names. + self.commands: t.MutableMapping[str, Command] = commands + + def add_command(self, cmd: Command, name: t.Optional[str] = None) -> None: + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError("Command has no name.") + _check_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + @t.overload + def command(self, __func: t.Callable[..., t.Any]) -> Command: + ... + + @t.overload + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command]: + ... + + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], Command], Command]: + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` and + immediately registers the created command with this group by + calling :meth:`add_command`. + + To customize the command class used, set the + :attr:`command_class` attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`command_class` attribute. + """ + from .decorators import command + + func: t.Optional[t.Callable[..., t.Any]] = None + + if args and callable(args[0]): + assert ( + len(args) == 1 and not kwargs + ), "Use 'command(**kwargs)(callable)' to provide arguments." + (func,) = args + args = () + + if self.command_class and kwargs.get("cls") is None: + kwargs["cls"] = self.command_class + + def decorator(f: t.Callable[..., t.Any]) -> Command: + cmd: Command = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + @t.overload + def group(self, __func: t.Callable[..., t.Any]) -> "Group": + ... + + @t.overload + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: + ... + + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], "Group"], "Group"]: + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` and + immediately registers the created group with this group by + calling :meth:`add_command`. + + To customize the group class used, set the :attr:`group_class` + attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`group_class` attribute. + """ + from .decorators import group + + func: t.Optional[t.Callable[..., t.Any]] = None + + if args and callable(args[0]): + assert ( + len(args) == 1 and not kwargs + ), "Use 'group(**kwargs)(callable)' to provide arguments." + (func,) = args + args = () + + if self.group_class is not None and kwargs.get("cls") is None: + if self.group_class is type: + kwargs["cls"] = type(self) + else: + kwargs["cls"] = self.group_class + + def decorator(f: t.Callable[..., t.Any]) -> "Group": + cmd: Group = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + return self.commands.get(cmd_name) + + def list_commands(self, ctx: Context) -> t.List[str]: + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + + See :class:`MultiCommand` and :class:`Command` for the description of + ``name`` and ``attrs``. + """ + + def __init__( + self, + name: t.Optional[str] = None, + sources: t.Optional[t.List[MultiCommand]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + #: The list of registered multi commands. + self.sources: t.List[MultiCommand] = sources or [] + + def add_source(self, multi_cmd: MultiCommand) -> None: + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + + return rv + + return None + + def list_commands(self, ctx: Context) -> t.List[str]: + rv: t.Set[str] = set() + + for source in self.sources: + rv.update(source.list_commands(ctx)) + + return sorted(rv) + + +def _check_iter(value: t.Any) -> t.Iterator[t.Any]: + """Check if the value is iterable but not a string. Raises a type + error, or return an iterator over the value. + """ + if isinstance(value, str): + raise TypeError + + return iter(value) + + +class Parameter: + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The latter is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: A function to further process or validate the value + after type conversion. It is called as ``f(ctx, param, value)`` + and must return the value. It is called for all sources, + including prompts. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). If ``nargs=-1``, all remaining + parameters are collected. + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + :param shell_complete: A function that returns custom shell + completions. Used instead of the param's type completion if + given. Takes ``ctx, param, incomplete`` and must return a list + of :class:`~click.shell_completion.CompletionItem` or a list of + strings. + + .. versionchanged:: 8.0 + ``process_value`` validates required parameters and bounded + ``nargs``, and invokes the parameter callback before returning + the value. This allows the callback to validate prompts. + ``full_process_value`` is removed. + + .. versionchanged:: 8.0 + ``autocompletion`` is renamed to ``shell_complete`` and has new + semantics described above. The old name is deprecated and will + be removed in 8.1, until then it will be wrapped to match the + new requirements. + + .. versionchanged:: 8.0 + For ``multiple=True, nargs>1``, the default must be a list of + tuples. + + .. versionchanged:: 8.0 + Setting a default is no longer required for ``nargs>1``, it will + default to ``None``. ``multiple=True`` or ``nargs=-1`` will + default to ``()``. + + .. versionchanged:: 7.1 + Empty environment variables are ignored rather than taking the + empty string value. This makes it possible for scripts to clear + variables if they can't unset them. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. The old callback format will still work, but it will + raise a warning to give you a chance to migrate the code easier. + """ + + param_type_name = "parameter" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + required: bool = False, + default: t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]] = None, + callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]] = None, + nargs: t.Optional[int] = None, + multiple: bool = False, + metavar: t.Optional[str] = None, + expose_value: bool = True, + is_eager: bool = False, + envvar: t.Optional[t.Union[str, t.Sequence[str]]] = None, + shell_complete: t.Optional[ + t.Callable[ + [Context, "Parameter", str], + t.Union[t.List["CompletionItem"], t.List[str]], + ] + ] = None, + ) -> None: + self.name: t.Optional[str] + self.opts: t.List[str] + self.secondary_opts: t.List[str] + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + self.type: types.ParamType = types.convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = multiple + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self._custom_shell_complete = shell_complete + + if __debug__: + if self.type.is_composite and nargs != self.type.arity: + raise ValueError( + f"'nargs' must be {self.type.arity} (or None) for" + f" type {self.type!r}, but it was {nargs}." + ) + + # Skip no default or callable default. + check_default = default if not callable(default) else None + + if check_default is not None: + if multiple: + try: + # Only check the first value against nargs. + check_default = next(_check_iter(check_default), None) + except TypeError: + raise ValueError( + "'default' must be a list when 'multiple' is true." + ) from None + + # Can be None for multiple with empty default. + if nargs != 1 and check_default is not None: + try: + _check_iter(check_default) + except TypeError: + if multiple: + message = ( + "'default' must be a list of lists when 'multiple' is" + " true and 'nargs' != 1." + ) + else: + message = "'default' must be a list when 'nargs' != 1." + + raise ValueError(message) from None + + if nargs > 1 and len(check_default) != nargs: + subject = "item length" if multiple else "length" + raise ValueError( + f"'default' {subject} must match nargs={nargs}." + ) + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + return { + "name": self.name, + "param_type_name": self.param_type_name, + "opts": self.opts, + "secondary_opts": self.secondary_opts, + "type": self.type.to_info_dict(), + "required": self.required, + "nargs": self.nargs, + "multiple": self.multiple, + "default": self.default, + "envvar": self.envvar, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + raise NotImplementedError() + + @property + def human_readable_name(self) -> str: + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name # type: ignore + + def make_metavar(self) -> str: + if self.metavar is not None: + return self.metavar + + metavar = self.type.get_metavar(self) + + if metavar is None: + metavar = self.type.name.upper() + + if self.nargs != 1: + metavar += "..." + + return metavar + + @t.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + """Get the default for the parameter. Tries + :meth:`Context.lookup_default` first, then the local default. + + :param ctx: Current context. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0.2 + Type casting is no longer performed when getting a default. + + .. versionchanged:: 8.0.1 + Type casting can fail in resilient parsing mode. Invalid + defaults will not prevent showing help text. + + .. versionchanged:: 8.0 + Looks at ``ctx.default_map`` first. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + value = ctx.lookup_default(self.name, call=False) # type: ignore + + if value is None: + value = self.default + + if call and callable(value): + value = value() + + return value + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + raise NotImplementedError() + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, t.Any] + ) -> t.Tuple[t.Any, ParameterSource]: + value = opts.get(self.name) # type: ignore + source = ParameterSource.COMMANDLINE + + if value is None: + value = self.value_from_envvar(ctx) + source = ParameterSource.ENVIRONMENT + + if value is None: + value = ctx.lookup_default(self.name) # type: ignore + source = ParameterSource.DEFAULT_MAP + + if value is None: + value = self.get_default(ctx) + source = ParameterSource.DEFAULT + + return value, source + + def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: + """Convert and validate a value against the option's + :attr:`type`, :attr:`multiple`, and :attr:`nargs`. + """ + if value is None: + return () if self.multiple or self.nargs == -1 else None + + def check_iter(value: t.Any) -> t.Iterator[t.Any]: + try: + return _check_iter(value) + except TypeError: + # This should only happen when passing in args manually, + # the parser should construct an iterable when parsing + # the command line. + raise BadParameter( + _("Value must be an iterable."), ctx=ctx, param=self + ) from None + + if self.nargs == 1 or self.type.is_composite: + + def convert(value: t.Any) -> t.Any: + return self.type(value, param=self, ctx=ctx) + + elif self.nargs == -1: + + def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] + return tuple(self.type(x, self, ctx) for x in check_iter(value)) + + else: # nargs > 1 + + def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] + value = tuple(check_iter(value)) + + if len(value) != self.nargs: + raise BadParameter( + ngettext( + "Takes {nargs} values but 1 was given.", + "Takes {nargs} values but {len} were given.", + len(value), + ).format(nargs=self.nargs, len=len(value)), + ctx=ctx, + param=self, + ) + + return tuple(self.type(x, self, ctx) for x in value) + + if self.multiple: + return tuple(convert(x) for x in check_iter(value)) + + return convert(value) + + def value_is_missing(self, value: t.Any) -> bool: + if value is None: + return True + + if (self.nargs != 1 or self.multiple) and value == (): + return True + + return False + + def process_value(self, ctx: Context, value: t.Any) -> t.Any: + value = self.type_cast_value(ctx, value) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + if self.callback is not None: + value = self.callback(ctx, self, value) + + return value + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + if self.envvar is None: + return None + + if isinstance(self.envvar, str): + rv = os.environ.get(self.envvar) + + if rv: + return rv + else: + for envvar in self.envvar: + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) + + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + + return rv + + def handle_parse_result( + self, ctx: Context, opts: t.Mapping[str, t.Any], args: t.List[str] + ) -> t.Tuple[t.Any, t.List[str]]: + with augment_usage_errors(ctx, param=self): + value, source = self.consume_value(ctx, opts) + ctx.set_parameter_source(self.name, source) # type: ignore + + try: + value = self.process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + + value = None + + if self.expose_value: + ctx.params[self.name] = value # type: ignore + + return value, args + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + pass + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [] + + def get_error_hint(self, ctx: Context) -> str: + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return " / ".join(f"'{x}'" for x in hint_list) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. If a + ``shell_complete`` function was given during init, it is used. + Otherwise, the :attr:`type` + :meth:`~click.types.ParamType.shell_complete` function is used. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + if self._custom_shell_complete is not None: + results = self._custom_shell_complete(ctx, self, incomplete) + + if results and isinstance(results[0], str): + from click.shell_completion import CompletionItem + + results = [CompletionItem(c) for c in results] + + return t.cast(t.List["CompletionItem"], results) + + return self.type.shell_complete(ctx, self, incomplete) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: Show the default value for this option in its + help text. Values are not shown by default, unless + :attr:`Context.show_default` is ``True``. If this value is a + string, it shows that string in parentheses instead of the + actual value. This is particularly useful for dynamic options. + For single option boolean flags, the default remains hidden if + its value is ``False``. + :param show_envvar: Controls if an environment variable should be + shown on the help page. Normally, environment variables are not + shown. + :param prompt: If set to ``True`` or a non empty string then the + user will be prompted for input. If set to ``True`` the prompt + will be the option name capitalized. + :param confirmation_prompt: Prompt a second time to confirm the + value if it was prompted for. Can be set to a string instead of + ``True`` to customize the message. + :param prompt_required: If set to ``False``, the user will be + prompted for input only when the option was specified as a flag + without a value. + :param hide_input: If this is ``True`` then the input on the prompt + will be hidden from the user. This is useful for password input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + :param attrs: Other command arguments described in :class:`Parameter`. + + .. versionchanged:: 8.1.0 + Help text indentation is cleaned here instead of only in the + ``@option`` decorator. + + .. versionchanged:: 8.1.0 + The ``show_default`` parameter overrides + ``Context.show_default``. + + .. versionchanged:: 8.1.0 + The default of a single option boolean flag is not shown if the + default value is ``False``. + + .. versionchanged:: 8.0.1 + ``type`` is detected from ``flag_value`` if given. + """ + + param_type_name = "option" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + show_default: t.Union[bool, str, None] = None, + prompt: t.Union[bool, str] = False, + confirmation_prompt: t.Union[bool, str] = False, + prompt_required: bool = True, + hide_input: bool = False, + is_flag: t.Optional[bool] = None, + flag_value: t.Optional[t.Any] = None, + multiple: bool = False, + count: bool = False, + allow_from_autoenv: bool = True, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + help: t.Optional[str] = None, + hidden: bool = False, + show_choices: bool = True, + show_envvar: bool = False, + **attrs: t.Any, + ) -> None: + if help: + help = inspect.cleandoc(help) + + default_is_missing = "default" not in attrs + super().__init__(param_decls, type=type, multiple=multiple, **attrs) + + if prompt is True: + if self.name is None: + raise TypeError("'name' is required with 'prompt=True'.") + + prompt_text: t.Optional[str] = self.name.replace("_", " ").capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.prompt_required = prompt_required + self.hide_input = hide_input + self.hidden = hidden + + # If prompt is enabled but not required, then the option can be + # used as a flag to indicate using prompt or flag_value. + self._flag_needs_value = self.prompt is not None and not self.prompt_required + + if is_flag is None: + if flag_value is not None: + # Implicitly a flag because flag_value was set. + is_flag = True + elif self._flag_needs_value: + # Not a flag, but when used as a flag it shows a prompt. + is_flag = False + else: + # Implicitly a flag because flag options were given. + is_flag = bool(self.secondary_opts) + elif is_flag is False and not self._flag_needs_value: + # Not a flag, and prompt is not enabled, can be used as a + # flag if flag_value is set. + self._flag_needs_value = flag_value is not None + + self.default: t.Union[t.Any, t.Callable[[], t.Any]] + + if is_flag and default_is_missing and not self.required: + if multiple: + self.default = () + else: + self.default = False + + if flag_value is None: + flag_value = not self.default + + self.type: types.ParamType + if is_flag and type is None: + # Re-guess the type from the flag value instead of the + # default. + self.type = types.convert_type(None, flag_value) + + self.is_flag: bool = is_flag + self.is_bool_flag: bool = is_flag and isinstance(self.type, types.BoolParamType) + self.flag_value: t.Any = flag_value + + # Counting + self.count = count + if count: + if type is None: + self.type = types.IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + if __debug__: + if self.nargs == -1: + raise TypeError("nargs=-1 is not supported for options.") + + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError("'prompt' is not valid for non-boolean flag.") + + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Secondary flag is not valid for non-boolean flag.") + + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError( + "'prompt' with 'hide_input' is not valid for boolean flag." + ) + + if self.count: + if self.multiple: + raise TypeError("'count' is not valid with 'multiple'.") + + if self.is_flag: + raise TypeError("'count' is not valid with 'is_flag'.") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + help=self.help, + prompt=self.prompt, + is_flag=self.is_flag, + flag_value=self.flag_value, + count=self.count, + hidden=self.hidden, + ) + return info_dict + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if decl.isidentifier(): + if name is not None: + raise TypeError(f"Name '{name}' defined twice") + name = decl + else: + split_char = ";" if decl[:1] == "/" else "/" + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + if first == second: + raise ValueError( + f"Boolean option {decl!r} cannot use the" + " same flag for true/false." + ) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace("-", "_").lower() + if not name.isidentifier(): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError("Could not determine name for option") + + if not opts and not secondary_opts: + raise TypeError( + f"No options defined but a name was passed ({name})." + " Did you mean to declare an argument instead? Did" + f" you mean to pass '--{name}'?" + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + action = f"{action}_const" + + if self.is_bool_flag and self.secondary_opts: + parser.add_option( + obj=self, opts=self.opts, dest=self.name, action=action, const=True + ) + parser.add_option( + obj=self, + opts=self.secondary_opts, + dest=self.name, + action=action, + const=False, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + const=self.flag_value, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + nargs=self.nargs, + ) + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + if self.hidden: + return None + + any_prefix_is_slash = False + + def _write_opts(opts: t.Sequence[str]) -> str: + nonlocal any_prefix_is_slash + + rv, any_slashes = join_options(opts) + + if any_slashes: + any_prefix_is_slash = True + + if not self.is_flag and not self.count: + rv += f" {self.make_metavar()}" + + return rv + + rv = [_write_opts(self.opts)] + + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + extra = [] + + if self.show_envvar: + envvar = self.envvar + + if envvar is None: + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + + if envvar is not None: + var_str = ( + envvar + if isinstance(envvar, str) + else ", ".join(str(d) for d in envvar) + ) + extra.append(_("env var: {var}").format(var=var_str)) + + # Temporarily enable resilient parsing to avoid type casting + # failing for the default. Might be possible to extend this to + # help formatting in general. + resilient = ctx.resilient_parsing + ctx.resilient_parsing = True + + try: + default_value = self.get_default(ctx, call=False) + finally: + ctx.resilient_parsing = resilient + + show_default = False + show_default_is_str = False + + if self.show_default is not None: + if isinstance(self.show_default, str): + show_default_is_str = show_default = True + else: + show_default = self.show_default + elif ctx.show_default is not None: + show_default = ctx.show_default + + if show_default_is_str or (show_default and (default_value is not None)): + if show_default_is_str: + default_string = f"({self.show_default})" + elif isinstance(default_value, (list, tuple)): + default_string = ", ".join(str(d) for d in default_value) + elif inspect.isfunction(default_value): + default_string = _("(dynamic)") + elif self.is_bool_flag and self.secondary_opts: + # For boolean flags that have distinct True/False opts, + # use the opt without prefix instead of the value. + default_string = split_opt( + (self.opts if self.default else self.secondary_opts)[0] + )[1] + elif self.is_bool_flag and not self.secondary_opts and not default_value: + default_string = "" + else: + default_string = str(default_value) + + if default_string: + extra.append(_("default: {default}").format(default=default_string)) + + if ( + isinstance(self.type, types._NumberRangeBase) + # skip count with default range type + and not (self.count and self.type.min == 0 and self.type.max is None) + ): + range_str = self.type._describe_range() + + if range_str: + extra.append(range_str) + + if self.required: + extra.append(_("required")) + + if extra: + extra_str = "; ".join(extra) + help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + @t.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + # If we're a non boolean flag our default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return t.cast(Option, param).flag_value + + return None + + return super().get_default(ctx, call=call) + + def prompt_for_value(self, ctx: Context) -> t.Any: + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + assert self.prompt is not None + + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt( + self.prompt, + default=default, + type=self.type, + hide_input=self.hide_input, + show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x), + ) + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + rv = super().resolve_envvar_value(ctx) + + if rv is not None: + return rv + + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) + + if rv is None: + return None + + value_depth = (self.nargs != 1) + bool(self.multiple) + + if value_depth > 0: + rv = self.type.split_envvar_value(rv) + + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + + return rv + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, "Parameter"] + ) -> t.Tuple[t.Any, ParameterSource]: + value, source = super().consume_value(ctx, opts) + + # The parser will emit a sentinel value if the option can be + # given as a flag without a value. This is different from None + # to distinguish from the flag not being given at all. + if value is _flag_needs_value: + if self.prompt is not None and not ctx.resilient_parsing: + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + else: + value = self.flag_value + source = ParameterSource.COMMANDLINE + + elif ( + self.multiple + and value is not None + and any(v is _flag_needs_value for v in value) + ): + value = [self.flag_value if v is _flag_needs_value else v for v in value] + source = ParameterSource.COMMANDLINE + + # The value wasn't set, or used the param's default, prompt if + # prompting is enabled. + elif ( + source in {None, ParameterSource.DEFAULT} + and self.prompt is not None + and (self.required or self.prompt_required) + and not ctx.resilient_parsing + ): + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + + return value, source + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the constructor of :class:`Parameter`. + """ + + param_type_name = "argument" + + def __init__( + self, + param_decls: t.Sequence[str], + required: t.Optional[bool] = None, + **attrs: t.Any, + ) -> None: + if required is None: + if attrs.get("default") is not None: + required = False + else: + required = attrs.get("nargs", 1) > 0 + + if "multiple" in attrs: + raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") + + super().__init__(param_decls, required=required, **attrs) + + if __debug__: + if self.default is not None and self.nargs == -1: + raise TypeError("'default' is not supported for nargs=-1.") + + @property + def human_readable_name(self) -> str: + if self.metavar is not None: + return self.metavar + return self.name.upper() # type: ignore + + def make_metavar(self) -> str: + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() # type: ignore + if not self.required: + var = f"[{var}]" + if self.nargs != 1: + var += "..." + return var + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Could not determine name for argument") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + f" {len(decls)}." + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [self.make_metavar()] + + def get_error_hint(self, ctx: Context) -> str: + return f"'{self.make_metavar()}'" + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/Meliora/gmapenv/Lib/site-packages/click/decorators.py b/Meliora/gmapenv/Lib/site-packages/click/decorators.py new file mode 100644 index 00000000..d9bba950 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/decorators.py @@ -0,0 +1,561 @@ +import inspect +import types +import typing as t +from functools import update_wrapper +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .globals import get_current_context +from .utils import echo + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") +T = t.TypeVar("T") +_AnyCallable = t.Callable[..., t.Any] +FC = t.TypeVar("FC", bound=t.Union[_AnyCallable, Command]) + + +def pass_context(f: "t.Callable[te.Concatenate[Context, P], R]") -> "t.Callable[P, R]": + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(new_func, f) + + +def pass_obj(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + +def make_pass_decorator( + object_type: t.Type[T], ensure: bool = False +) -> t.Callable[["t.Callable[te.Concatenate[T, P], R]"], "t.Callable[P, R]"]: + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + + def decorator(f: "t.Callable[te.Concatenate[T, P], R]") -> "t.Callable[P, R]": + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + ctx = get_current_context() + + obj: t.Optional[T] + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + + if obj is None: + raise RuntimeError( + "Managed to invoke callback without a context" + f" object of type {object_type.__name__!r}" + " existing." + ) + + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + return decorator # type: ignore[return-value] + + +def pass_meta_key( + key: str, *, doc_description: t.Optional[str] = None +) -> "t.Callable[[t.Callable[te.Concatenate[t.Any, P], R]], t.Callable[P, R]]": + """Create a decorator that passes a key from + :attr:`click.Context.meta` as the first argument to the decorated + function. + + :param key: Key in ``Context.meta`` to pass. + :param doc_description: Description of the object being passed, + inserted into the decorator's docstring. Defaults to "the 'key' + key from Context.meta". + + .. versionadded:: 8.0 + """ + + def decorator(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> R: + ctx = get_current_context() + obj = ctx.meta[key] + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + if doc_description is None: + doc_description = f"the {key!r} key from :attr:`click.Context.meta`" + + decorator.__doc__ = ( + f"Decorator that passes {doc_description} as the first argument" + " to the decorated function." + ) + return decorator # type: ignore[return-value] + + +CmdType = t.TypeVar("CmdType", bound=Command) + + +# variant: no call, directly as decorator for a function. +@t.overload +def command(name: _AnyCallable) -> Command: + ... + + +# variant: with positional name and with positional or keyword cls argument: +# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) +@t.overload +def command( + name: t.Optional[str], + cls: t.Type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: + ... + + +# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) +@t.overload +def command( + name: None = None, + *, + cls: t.Type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: + ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def command( + name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Command]: + ... + + +def command( + name: t.Union[t.Optional[str], _AnyCallable] = None, + cls: t.Optional[t.Type[CmdType]] = None, + **attrs: t.Any, +) -> t.Union[Command, t.Callable[[_AnyCallable], t.Union[Command, CmdType]]]: + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function with + underscores replaced by dashes. If you want to change that, you can + pass the intended name as the first argument. + + All keyword arguments are forwarded to the underlying command class. + For the ``params`` argument, any decorated params are appended to + the end of the list. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.1 + The ``params`` argument can be used. Decorated params are + appended to the end of the list. + """ + + func: t.Optional[t.Callable[[_AnyCallable], t.Any]] = None + + if callable(name): + func = name + name = None + assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." + assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." + + if cls is None: + cls = t.cast(t.Type[CmdType], Command) + + def decorator(f: _AnyCallable) -> CmdType: + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + + attr_params = attrs.pop("params", None) + params = attr_params if attr_params is not None else [] + + try: + decorator_params = f.__click_params__ # type: ignore + except AttributeError: + pass + else: + del f.__click_params__ # type: ignore + params.extend(reversed(decorator_params)) + + if attrs.get("help") is None: + attrs["help"] = f.__doc__ + + if t.TYPE_CHECKING: + assert cls is not None + assert not callable(name) + + cmd = cls( + name=name or f.__name__.lower().replace("_", "-"), + callback=f, + params=params, + **attrs, + ) + cmd.__doc__ = f.__doc__ + return cmd + + if func is not None: + return decorator(func) + + return decorator + + +GrpType = t.TypeVar("GrpType", bound=Group) + + +# variant: no call, directly as decorator for a function. +@t.overload +def group(name: _AnyCallable) -> Group: + ... + + +# variant: with positional name and with positional or keyword cls argument: +# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) +@t.overload +def group( + name: t.Optional[str], + cls: t.Type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: + ... + + +# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) +@t.overload +def group( + name: None = None, + *, + cls: t.Type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: + ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def group( + name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Group]: + ... + + +def group( + name: t.Union[str, _AnyCallable, None] = None, + cls: t.Optional[t.Type[GrpType]] = None, + **attrs: t.Any, +) -> t.Union[Group, t.Callable[[_AnyCallable], t.Union[Group, GrpType]]]: + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + """ + if cls is None: + cls = t.cast(t.Type[GrpType], Group) + + if callable(name): + return command(cls=cls, **attrs)(name) + + return command(name, cls, **attrs) + + +def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] # type: ignore + + f.__click_params__.append(param) # type: ignore + + +def argument( + *param_decls: str, cls: t.Optional[t.Type[Argument]] = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default argument class, refer to :class:`Argument` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Argument + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def option( + *param_decls: str, cls: t.Optional[t.Type[Option]] = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default option class, refer to :class:`Option` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Option + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--yes`` option which shows a prompt before continuing if + not passed. If the prompt is declined, the program will exit. + + :param param_decls: One or more option names. Defaults to the single + value ``"--yes"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value: + ctx.abort() + + if not param_decls: + param_decls = ("--yes",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("callback", callback) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("prompt", "Do you want to continue?") + kwargs.setdefault("help", "Confirm the action without prompting.") + return option(*param_decls, **kwargs) + + +def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--password`` option which prompts for a password, hiding + input and asking to enter the value again for confirmation. + + :param param_decls: One or more option names. Defaults to the single + value ``"--password"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + if not param_decls: + param_decls = ("--password",) + + kwargs.setdefault("prompt", True) + kwargs.setdefault("confirmation_prompt", True) + kwargs.setdefault("hide_input", True) + return option(*param_decls, **kwargs) + + +def version_option( + version: t.Optional[str] = None, + *param_decls: str, + package_name: t.Optional[str] = None, + prog_name: t.Optional[str] = None, + message: t.Optional[str] = None, + **kwargs: t.Any, +) -> t.Callable[[FC], FC]: + """Add a ``--version`` option which immediately prints the version + number and exits the program. + + If ``version`` is not provided, Click will try to detect it using + :func:`importlib.metadata.version` to get the version for the + ``package_name``. On Python < 3.8, the ``importlib_metadata`` + backport must be installed. + + If ``package_name`` is not provided, Click will try to detect it by + inspecting the stack frames. This will be used to detect the + version, so it must match the name of the installed package. + + :param version: The version number to show. If not provided, Click + will try to detect it. + :param param_decls: One or more option names. Defaults to the single + value ``"--version"``. + :param package_name: The package name to detect the version from. If + not provided, Click will try to detect it. + :param prog_name: The name of the CLI to show in the message. If not + provided, it will be detected from the command. + :param message: The message to show. The values ``%(prog)s``, + ``%(package)s``, and ``%(version)s`` are available. Defaults to + ``"%(prog)s, version %(version)s"``. + :param kwargs: Extra arguments are passed to :func:`option`. + :raise RuntimeError: ``version`` could not be detected. + + .. versionchanged:: 8.0 + Add the ``package_name`` parameter, and the ``%(package)s`` + value for messages. + + .. versionchanged:: 8.0 + Use :mod:`importlib.metadata` instead of ``pkg_resources``. The + version is detected based on the package name, not the entry + point name. The Python package name must match the installed + package name, or be passed with ``package_name=``. + """ + if message is None: + message = _("%(prog)s, version %(version)s") + + if version is None and package_name is None: + frame = inspect.currentframe() + f_back = frame.f_back if frame is not None else None + f_globals = f_back.f_globals if f_back is not None else None + # break reference cycle + # https://docs.python.org/3/library/inspect.html#the-interpreter-stack + del frame + + if f_globals is not None: + package_name = f_globals.get("__name__") + + if package_name == "__main__": + package_name = f_globals.get("__package__") + + if package_name: + package_name = package_name.partition(".")[0] + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + nonlocal prog_name + nonlocal version + + if prog_name is None: + prog_name = ctx.find_root().info_name + + if version is None and package_name is not None: + metadata: t.Optional[types.ModuleType] + + try: + from importlib import metadata # type: ignore + except ImportError: + # Python < 3.8 + import importlib_metadata as metadata # type: ignore + + try: + version = metadata.version(package_name) # type: ignore + except metadata.PackageNotFoundError: # type: ignore + raise RuntimeError( + f"{package_name!r} is not installed. Try passing" + " 'package_name' instead." + ) from None + + if version is None: + raise RuntimeError( + f"Could not determine the version for {package_name!r} automatically." + ) + + echo( + message % {"prog": prog_name, "package": package_name, "version": version}, + color=ctx.color, + ) + ctx.exit() + + if not param_decls: + param_decls = ("--version",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show the version and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) + + +def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--help`` option which immediately prints the help page + and exits the program. + + This is usually unnecessary, as the ``--help`` option is added to + each command automatically unless ``add_help_option=False`` is + passed. + + :param param_decls: One or more option names. Defaults to the single + value ``"--help"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + if not param_decls: + param_decls = ("--help",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show this message and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) diff --git a/Meliora/gmapenv/Lib/site-packages/click/exceptions.py b/Meliora/gmapenv/Lib/site-packages/click/exceptions.py new file mode 100644 index 00000000..fe68a361 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/exceptions.py @@ -0,0 +1,288 @@ +import typing as t +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import get_text_stderr +from .utils import echo +from .utils import format_filename + +if t.TYPE_CHECKING: + from .core import Command + from .core import Context + from .core import Parameter + + +def _join_param_hints( + param_hint: t.Optional[t.Union[t.Sequence[str], str]] +) -> t.Optional[str]: + if param_hint is not None and not isinstance(param_hint, str): + return " / ".join(repr(x) for x in param_hint) + + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception. + exit_code = 1 + + def __init__(self, message: str) -> None: + super().__init__(message) + self.message = message + + def format_message(self) -> str: + return self.message + + def __str__(self) -> str: + return self.message + + def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: + if file is None: + file = get_text_stderr() + + echo(_("Error: {message}").format(message=self.format_message()), file=file) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + + exit_code = 2 + + def __init__(self, message: str, ctx: t.Optional["Context"] = None) -> None: + super().__init__(message) + self.ctx = ctx + self.cmd: t.Optional["Command"] = self.ctx.command if self.ctx else None + + def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: + if file is None: + file = get_text_stderr() + color = None + hint = "" + if ( + self.ctx is not None + and self.ctx.command.get_help_option(self.ctx) is not None + ): + hint = _("Try '{command} {option}' for help.").format( + command=self.ctx.command_path, option=self.ctx.help_option_names[0] + ) + hint = f"{hint}\n" + if self.ctx is not None: + color = self.ctx.color + echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=color, + ) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__( + self, + message: str, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + ) -> None: + super().__init__(message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + return _("Invalid value: {message}").format(message=self.message) + + return _("Invalid value for {param_hint}: {message}").format( + param_hint=_join_param_hints(param_hint), message=self.message + ) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__( + self, + message: t.Optional[str] = None, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + param_type: t.Optional[str] = None, + ) -> None: + super().__init__(message or "", ctx, param, param_hint) + self.param_type = param_type + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint: t.Optional[str] = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + param_hint = None + + param_hint = _join_param_hints(param_hint) + param_hint = f" {param_hint}" if param_hint else "" + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message(self.param) + if msg_extra: + if msg: + msg += f". {msg_extra}" + else: + msg = msg_extra + + msg = f" {msg}" if msg else "" + + # Translate param_type for known types. + if param_type == "argument": + missing = _("Missing argument") + elif param_type == "option": + missing = _("Missing option") + elif param_type == "parameter": + missing = _("Missing parameter") + else: + missing = _("Missing {param_type}").format(param_type=param_type) + + return f"{missing}{param_hint}.{msg}" + + def __str__(self) -> str: + if not self.message: + param_name = self.param.name if self.param else None + return _("Missing parameter: {param_name}").format(param_name=param_name) + else: + return self.message + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__( + self, + option_name: str, + message: t.Optional[str] = None, + possibilities: t.Optional[t.Sequence[str]] = None, + ctx: t.Optional["Context"] = None, + ) -> None: + if message is None: + message = _("No such option: {name}").format(name=option_name) + + super().__init__(message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self) -> str: + if not self.possibilities: + return self.message + + possibility_str = ", ".join(sorted(self.possibilities)) + suggest = ngettext( + "Did you mean {possibility}?", + "(Possible options: {possibilities})", + len(self.possibilities), + ).format(possibility=possibility_str, possibilities=possibility_str) + return f"{self.message} {suggest}" + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__( + self, option_name: str, message: str, ctx: t.Optional["Context"] = None + ) -> None: + super().__init__(message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename: str, hint: t.Optional[str] = None) -> None: + if hint is None: + hint = _("unknown error") + + super().__init__(hint) + self.ui_filename: str = format_filename(filename) + self.filename = filename + + def format_message(self) -> str: + return _("Could not open file {filename!r}: {message}").format( + filename=self.ui_filename, message=self.message + ) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + + __slots__ = ("exit_code",) + + def __init__(self, code: int = 0) -> None: + self.exit_code: int = code diff --git a/Meliora/gmapenv/Lib/site-packages/click/formatting.py b/Meliora/gmapenv/Lib/site-packages/click/formatting.py new file mode 100644 index 00000000..ddd2a2f8 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/formatting.py @@ -0,0 +1,301 @@ +import typing as t +from contextlib import contextmanager +from gettext import gettext as _ + +from ._compat import term_len +from .parser import split_opt + +# Can force a width. This is used by the test system +FORCED_WIDTH: t.Optional[int] = None + + +def measure_table(rows: t.Iterable[t.Tuple[str, str]]) -> t.Tuple[int, ...]: + widths: t.Dict[int, int] = {} + + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows( + rows: t.Iterable[t.Tuple[str, str]], col_count: int +) -> t.Iterator[t.Tuple[str, ...]]: + for row in rows: + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text: str, + width: int = 78, + initial_indent: str = "", + subsequent_indent: str = "", + preserve_paragraphs: bool = False, +) -> str: + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + + text = text.expandtabs() + wrapper = TextWrapper( + width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False, + ) + if not preserve_paragraphs: + return wrapper.fill(text) + + p: t.List[t.Tuple[int, bool, str]] = [] + buf: t.List[str] = [] + indent = None + + def _flush_par() -> None: + if not buf: + return + if buf[0].strip() == "\b": + p.append((indent or 0, True, "\n".join(buf[1:]))) + else: + p.append((indent or 0, False, " ".join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(" " * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return "\n\n".join(rv) + + +class HelpFormatter: + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__( + self, + indent_increment: int = 2, + width: t.Optional[int] = None, + max_width: t.Optional[int] = None, + ) -> None: + import shutil + + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer: t.List[str] = [] + + def write(self, string: str) -> None: + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self) -> None: + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self) -> None: + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage( + self, prog: str, args: str = "", prefix: t.Optional[str] = None + ) -> None: + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: The prefix for the first line. Defaults to + ``"Usage: "``. + """ + if prefix is None: + prefix = f"{_('Usage:')} " + + usage_prefix = f"{prefix:>{self.current_indent}}{prog} " + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = " " * term_len(usage_prefix) + self.write( + wrap_text( + args, + text_width, + initial_indent=usage_prefix, + subsequent_indent=indent, + ) + ) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write("\n") + indent = " " * (max(self.current_indent, term_len(prefix)) + 4) + self.write( + wrap_text( + args, text_width, initial_indent=indent, subsequent_indent=indent + ) + ) + + self.write("\n") + + def write_heading(self, heading: str) -> None: + """Writes a heading into the buffer.""" + self.write(f"{'':>{self.current_indent}}{heading}:\n") + + def write_paragraph(self) -> None: + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text: str) -> None: + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + indent = " " * self.current_indent + self.write( + wrap_text( + text, + self.width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl( + self, + rows: t.Sequence[t.Tuple[str, str]], + col_max: int = 30, + col_spacing: int = 2, + ) -> None: + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError("Expected two columns for definition list") + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write(f"{'':>{self.current_indent}}{first}") + if not second: + self.write("\n") + continue + if term_len(first) <= first_col - col_spacing: + self.write(" " * (first_col - term_len(first))) + else: + self.write("\n") + self.write(" " * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) + lines = wrapped_text.splitlines() + + if lines: + self.write(f"{lines[0]}\n") + + for line in lines[1:]: + self.write(f"{'':>{first_col + self.current_indent}}{line}\n") + else: + self.write("\n") + + @contextmanager + def section(self, name: str) -> t.Iterator[None]: + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self) -> t.Iterator[None]: + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self) -> str: + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options: t.Sequence[str]) -> t.Tuple[str, bool]: + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + + for opt in options: + prefix = split_opt(opt)[0] + + if prefix == "/": + any_prefix_is_slash = True + + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/Meliora/gmapenv/Lib/site-packages/click/globals.py b/Meliora/gmapenv/Lib/site-packages/click/globals.py new file mode 100644 index 00000000..480058f1 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/globals.py @@ -0,0 +1,68 @@ +import typing as t +from threading import local + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Context + +_local = local() + + +@t.overload +def get_current_context(silent: "te.Literal[False]" = False) -> "Context": + ... + + +@t.overload +def get_current_context(silent: bool = ...) -> t.Optional["Context"]: + ... + + +def get_current_context(silent: bool = False) -> t.Optional["Context"]: + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: if set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return t.cast("Context", _local.stack[-1]) + except (AttributeError, IndexError) as e: + if not silent: + raise RuntimeError("There is no active click context.") from e + + return None + + +def push_context(ctx: "Context") -> None: + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context() -> None: + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color: t.Optional[bool] = None) -> t.Optional[bool]: + """Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + + ctx = get_current_context(silent=True) + + if ctx is not None: + return ctx.color + + return None diff --git a/Meliora/gmapenv/Lib/site-packages/click/parser.py b/Meliora/gmapenv/Lib/site-packages/click/parser.py new file mode 100644 index 00000000..5fa7adfa --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/parser.py @@ -0,0 +1,529 @@ +""" +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright 2001-2006 Gregory P. Ward. All rights reserved. +Copyright 2002-2006 Python Software Foundation. All rights reserved. +""" +# This code uses parts of optparse written by Gregory P. Ward and +# maintained by the Python Software Foundation. +# Copyright 2001-2006 Gregory P. Ward +# Copyright 2002-2006 Python Software Foundation +import typing as t +from collections import deque +from gettext import gettext as _ +from gettext import ngettext + +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Argument as CoreArgument + from .core import Context + from .core import Option as CoreOption + from .core import Parameter as CoreParameter + +V = t.TypeVar("V") + +# Sentinel value that indicates an option was passed as a flag without a +# value but is not a flag option. Option.consume_value uses this to +# prompt or use the flag_value. +_flag_needs_value = object() + + +def _unpack_args( + args: t.Sequence[str], nargs_spec: t.Sequence[int] +) -> t.Tuple[t.Sequence[t.Union[str, t.Sequence[t.Optional[str]], None]], t.List[str]]: + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv: t.List[t.Union[str, t.Tuple[t.Optional[str], ...], None]] = [] + spos: t.Optional[int] = None + + def _fetch(c: "te.Deque[V]") -> t.Optional[V]: + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + + if nargs is None: + continue + + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError("Cannot have two nargs < 0") + + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1 :] = reversed(rv[spos + 1 :]) + + return tuple(rv), list(args) + + +def split_opt(opt: str) -> t.Tuple[str, str]: + first = opt[:1] + if first.isalnum(): + return "", opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def normalize_opt(opt: str, ctx: t.Optional["Context"]) -> str: + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return f"{prefix}{ctx.token_normalize_func(opt)}" + + +def split_arg_string(string: str) -> t.List[str]: + """Split an argument string as with :func:`shlex.split`, but don't + fail if the string is incomplete. Ignores a missing closing quote or + incomplete escape sequence and uses the partial token as-is. + + .. code-block:: python + + split_arg_string("example 'my file") + ["example", "my file"] + + split_arg_string("example my\\") + ["example", "my"] + + :param string: String to split. + """ + import shlex + + lex = shlex.shlex(string, posix=True) + lex.whitespace_split = True + lex.commenters = "" + out = [] + + try: + for token in lex: + out.append(token) + except ValueError: + # Raised when end-of-string is reached in an invalid state. Use + # the partial token as-is. The quote or escape character is in + # lex.state, not lex.token. + out.append(lex.token) + + return out + + +class Option: + def __init__( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ): + self._short_opts = [] + self._long_opts = [] + self.prefixes: t.Set[str] = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError(f"Invalid start character for option ({opt})") + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = "store" + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self) -> bool: + return self.action in ("store", "append") + + def process(self, value: t.Any, state: "ParsingState") -> None: + if self.action == "store": + state.opts[self.dest] = value # type: ignore + elif self.action == "store_const": + state.opts[self.dest] = self.const # type: ignore + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) # type: ignore + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) # type: ignore + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore + else: + raise ValueError(f"unknown action '{self.action}'") + state.order.append(self.obj) + + +class Argument: + def __init__(self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process( + self, + value: t.Union[t.Optional[str], t.Sequence[t.Optional[str]]], + state: "ParsingState", + ) -> None: + if self.nargs > 1: + assert value is not None + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage( + _("Argument {name!r} takes {nargs} values.").format( + name=self.dest, nargs=self.nargs + ) + ) + + if self.nargs == -1 and self.obj.envvar is not None and value == (): + # Replace empty tuple with None so that a value from the + # environment may be tried. + value = None + + state.opts[self.dest] = value # type: ignore + state.order.append(self.obj) + + +class ParsingState: + def __init__(self, rargs: t.List[str]) -> None: + self.opts: t.Dict[str, t.Any] = {} + self.largs: t.List[str] = [] + self.rargs = rargs + self.order: t.List["CoreParameter"] = [] + + +class OptionParser: + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + """ + + def __init__(self, ctx: t.Optional["Context"] = None) -> None: + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args: bool = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options: bool = False + + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + + self._short_opt: t.Dict[str, Option] = {} + self._long_opt: t.Dict[str, Option] = {} + self._opt_prefixes = {"-", "--"} + self._args: t.List[Argument] = [] + + def add_option( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ) -> None: + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``append_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(obj, opts, dest, action=action, nargs=nargs, const=const) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument( + self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1 + ) -> None: + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + self._args.append(Argument(obj, dest=dest, nargs=nargs)) + + def parse_args( + self, args: t.List[str] + ) -> t.Tuple[t.Dict[str, t.Any], t.List[str], t.List["CoreParameter"]]: + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state: ParsingState) -> None: + pargs, args = _unpack_args( + state.largs + state.rargs, [x.nargs for x in self._args] + ) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state: ParsingState) -> None: + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == "--": + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt( + self, opt: str, explicit_value: t.Optional[str], state: ParsingState + ) -> None: + if opt not in self._long_opt: + from difflib import get_close_matches + + possibilities = get_close_matches(opt, self._long_opt) + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + value = self._get_value_from_state(opt, option, state) + + elif explicit_value is not None: + raise BadOptionUsage( + opt, _("Option {name!r} does not take a value.").format(name=opt) + ) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg: str, state: ParsingState) -> None: + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(f"{prefix}{ch}", self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + value = self._get_value_from_state(opt, option, state) + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we recombine the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(f"{prefix}{''.join(unknown_options)}") + + def _get_value_from_state( + self, option_name: str, option: Option, state: ParsingState + ) -> t.Any: + nargs = option.nargs + + if len(state.rargs) < nargs: + if option.obj._flag_needs_value: + # Option allows omitting the value. + value = _flag_needs_value + else: + raise BadOptionUsage( + option_name, + ngettext( + "Option {name!r} requires an argument.", + "Option {name!r} requires {nargs} arguments.", + nargs, + ).format(name=option_name, nargs=nargs), + ) + elif nargs == 1: + next_rarg = state.rargs[0] + + if ( + option.obj._flag_needs_value + and isinstance(next_rarg, str) + and next_rarg[:1] in self._opt_prefixes + and len(next_rarg) > 1 + ): + # The next arg looks like the start of an option, don't + # use it as the value if omitting the value is allowed. + value = _flag_needs_value + else: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + return value + + def _process_opts(self, arg: str, state: ParsingState) -> None: + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if "=" in arg: + long_opt, explicit_value = arg.split("=", 1) + else: + long_opt = arg + norm_long_opt = normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + self._match_short_opt(arg, state) + return + + if not self.ignore_unknown_options: + raise + + state.largs.append(arg) diff --git a/Meliora/gmapenv/Lib/site-packages/click/py.typed b/Meliora/gmapenv/Lib/site-packages/click/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/click/shell_completion.py b/Meliora/gmapenv/Lib/site-packages/click/shell_completion.py new file mode 100644 index 00000000..dc9e00b9 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/shell_completion.py @@ -0,0 +1,596 @@ +import os +import re +import typing as t +from gettext import gettext as _ + +from .core import Argument +from .core import BaseCommand +from .core import Context +from .core import MultiCommand +from .core import Option +from .core import Parameter +from .core import ParameterSource +from .parser import split_arg_string +from .utils import echo + + +def shell_complete( + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + instruction: str, +) -> int: + """Perform shell completion for the given CLI program. + + :param cli: Command being called. + :param ctx_args: Extra arguments to pass to + ``cli.make_context``. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + :param instruction: Value of ``complete_var`` with the completion + instruction and shell, in the form ``instruction_shell``. + :return: Status code to exit with. + """ + shell, _, instruction = instruction.partition("_") + comp_cls = get_completion_class(shell) + + if comp_cls is None: + return 1 + + comp = comp_cls(cli, ctx_args, prog_name, complete_var) + + if instruction == "source": + echo(comp.source()) + return 0 + + if instruction == "complete": + echo(comp.complete()) + return 0 + + return 1 + + +class CompletionItem: + """Represents a completion value and metadata about the value. The + default metadata is ``type`` to indicate special shell handling, + and ``help`` if a shell supports showing a help string next to the + value. + + Arbitrary parameters can be passed when creating the object, and + accessed using ``item.attr``. If an attribute wasn't passed, + accessing it returns ``None``. + + :param value: The completion suggestion. + :param type: Tells the shell script to provide special completion + support for the type. Click uses ``"dir"`` and ``"file"``. + :param help: String shown next to the value if supported. + :param kwargs: Arbitrary metadata. The built-in implementations + don't use this, but custom type completions paired with custom + shell support could use it. + """ + + __slots__ = ("value", "type", "help", "_info") + + def __init__( + self, + value: t.Any, + type: str = "plain", + help: t.Optional[str] = None, + **kwargs: t.Any, + ) -> None: + self.value: t.Any = value + self.type: str = type + self.help: t.Optional[str] = help + self._info = kwargs + + def __getattr__(self, name: str) -> t.Any: + return self._info.get(name) + + +# Only Bash >= 4.4 has the nosort option. +_SOURCE_BASH = """\ +%(complete_func)s() { + local IFS=$'\\n' + local response + + response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ +%(complete_var)s=bash_complete $1) + + for completion in $response; do + IFS=',' read type value <<< "$completion" + + if [[ $type == 'dir' ]]; then + COMPREPLY=() + compopt -o dirnames + elif [[ $type == 'file' ]]; then + COMPREPLY=() + compopt -o default + elif [[ $type == 'plain' ]]; then + COMPREPLY+=($value) + fi + done + + return 0 +} + +%(complete_func)s_setup() { + complete -o nosort -F %(complete_func)s %(prog_name)s +} + +%(complete_func)s_setup; +""" + +_SOURCE_ZSH = """\ +#compdef %(prog_name)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(prog_name)s] )) && return 1 + + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ +%(complete_var)s=zsh_complete %(prog_name)s)}") + + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} + +if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + %(complete_func)s "$@" +else + # eval/source/. command, register function for later + compdef %(complete_func)s %(prog_name)s +fi +""" + +_SOURCE_FISH = """\ +function %(complete_func)s; + set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ +COMP_CWORD=(commandline -t) %(prog_name)s); + + for completion in $response; + set -l metadata (string split "," $completion); + + if test $metadata[1] = "dir"; + __fish_complete_directories $metadata[2]; + else if test $metadata[1] = "file"; + __fish_complete_path $metadata[2]; + else if test $metadata[1] = "plain"; + echo $metadata[2]; + end; + end; +end; + +complete --no-files --command %(prog_name)s --arguments \ +"(%(complete_func)s)"; +""" + + +class ShellComplete: + """Base class for providing shell completion support. A subclass for + a given shell will override attributes and methods to implement the + completion instructions (``source`` and ``complete``). + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + + .. versionadded:: 8.0 + """ + + name: t.ClassVar[str] + """Name to register the shell as with :func:`add_completion_class`. + This is used in completion instructions (``{name}_source`` and + ``{name}_complete``). + """ + + source_template: t.ClassVar[str] + """Completion script template formatted by :meth:`source`. This must + be provided by subclasses. + """ + + def __init__( + self, + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + ) -> None: + self.cli = cli + self.ctx_args = ctx_args + self.prog_name = prog_name + self.complete_var = complete_var + + @property + def func_name(self) -> str: + """The name of the shell function defined by the completion + script. + """ + safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) + return f"_{safe_name}_completion" + + def source_vars(self) -> t.Dict[str, t.Any]: + """Vars for formatting :attr:`source_template`. + + By default this provides ``complete_func``, ``complete_var``, + and ``prog_name``. + """ + return { + "complete_func": self.func_name, + "complete_var": self.complete_var, + "prog_name": self.prog_name, + } + + def source(self) -> str: + """Produce the shell script that defines the completion + function. By default this ``%``-style formats + :attr:`source_template` with the dict returned by + :meth:`source_vars`. + """ + return self.source_template % self.source_vars() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + """Use the env vars defined by the shell script to return a + tuple of ``args, incomplete``. This must be implemented by + subclasses. + """ + raise NotImplementedError + + def get_completions( + self, args: t.List[str], incomplete: str + ) -> t.List[CompletionItem]: + """Determine the context and last complete command or parameter + from the complete args. Call that object's ``shell_complete`` + method to get the completions for the incomplete value. + + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) + obj, incomplete = _resolve_incomplete(ctx, args, incomplete) + return obj.shell_complete(ctx, incomplete) + + def format_completion(self, item: CompletionItem) -> str: + """Format a completion item into the form recognized by the + shell script. This must be implemented by subclasses. + + :param item: Completion item to format. + """ + raise NotImplementedError + + def complete(self) -> str: + """Produce the completion data to send back to the shell. + + By default this calls :meth:`get_completion_args`, gets the + completions, then calls :meth:`format_completion` for each + completion. + """ + args, incomplete = self.get_completion_args() + completions = self.get_completions(args, incomplete) + out = [self.format_completion(item) for item in completions] + return "\n".join(out) + + +class BashComplete(ShellComplete): + """Shell completion for Bash.""" + + name = "bash" + source_template = _SOURCE_BASH + + @staticmethod + def _check_version() -> None: + import subprocess + + output = subprocess.run( + ["bash", "-c", 'echo "${BASH_VERSION}"'], stdout=subprocess.PIPE + ) + match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) + + if match is not None: + major, minor = match.groups() + + if major < "4" or major == "4" and minor < "4": + echo( + _( + "Shell completion is not supported for Bash" + " versions older than 4.4." + ), + err=True, + ) + else: + echo( + _("Couldn't detect Bash version, shell completion is not supported."), + err=True, + ) + + def source(self) -> str: + self._check_version() + return super().source() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type},{item.value}" + + +class ZshComplete(ShellComplete): + """Shell completion for Zsh.""" + + name = "zsh" + source_template = _SOURCE_ZSH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" + + +class FishComplete(ShellComplete): + """Shell completion for Fish.""" + + name = "fish" + source_template = _SOURCE_FISH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + args = cwords[1:] + + # Fish stores the partial word in both COMP_WORDS and + # COMP_CWORD, remove it from complete args. + if incomplete and args and args[-1] == incomplete: + args.pop() + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + if item.help: + return f"{item.type},{item.value}\t{item.help}" + + return f"{item.type},{item.value}" + + +ShellCompleteType = t.TypeVar("ShellCompleteType", bound=t.Type[ShellComplete]) + + +_available_shells: t.Dict[str, t.Type[ShellComplete]] = { + "bash": BashComplete, + "fish": FishComplete, + "zsh": ZshComplete, +} + + +def add_completion_class( + cls: ShellCompleteType, name: t.Optional[str] = None +) -> ShellCompleteType: + """Register a :class:`ShellComplete` subclass under the given name. + The name will be provided by the completion instruction environment + variable during completion. + + :param cls: The completion class that will handle completion for the + shell. + :param name: Name to register the class under. Defaults to the + class's ``name`` attribute. + """ + if name is None: + name = cls.name + + _available_shells[name] = cls + + return cls + + +def get_completion_class(shell: str) -> t.Optional[t.Type[ShellComplete]]: + """Look up a registered :class:`ShellComplete` subclass by the name + provided by the completion instruction environment variable. If the + name isn't registered, returns ``None``. + + :param shell: Name the class is registered under. + """ + return _available_shells.get(shell) + + +def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: + """Determine if the given parameter is an argument that can still + accept values. + + :param ctx: Invocation context for the command represented by the + parsed complete args. + :param param: Argument object being checked. + """ + if not isinstance(param, Argument): + return False + + assert param.name is not None + # Will be None if expose_value is False. + value = ctx.params.get(param.name) + return ( + param.nargs == -1 + or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE + or ( + param.nargs > 1 + and isinstance(value, (tuple, list)) + and len(value) < param.nargs + ) + ) + + +def _start_of_option(ctx: Context, value: str) -> bool: + """Check if the value looks like the start of an option.""" + if not value: + return False + + c = value[0] + return c in ctx._opt_prefixes + + +def _is_incomplete_option(ctx: Context, args: t.List[str], param: Parameter) -> bool: + """Determine if the given parameter is an option that needs a value. + + :param args: List of complete args before the incomplete value. + :param param: Option object being checked. + """ + if not isinstance(param, Option): + return False + + if param.is_flag or param.count: + return False + + last_option = None + + for index, arg in enumerate(reversed(args)): + if index + 1 > param.nargs: + break + + if _start_of_option(ctx, arg): + last_option = arg + + return last_option is not None and last_option in param.opts + + +def _resolve_context( + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + args: t.List[str], +) -> Context: + """Produce the context hierarchy starting with the command and + traversing the complete arguments. This only follows the commands, + it doesn't trigger input prompts or callbacks. + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param args: List of complete args before the incomplete value. + """ + ctx_args["resilient_parsing"] = True + ctx = cli.make_context(prog_name, args.copy(), **ctx_args) + args = ctx.protected_args + ctx.args + + while args: + command = ctx.command + + if isinstance(command, MultiCommand): + if not command.chain: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) + args = ctx.protected_args + ctx.args + else: + sub_ctx = ctx + + while args: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + sub_ctx = cmd.make_context( + name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True, + ) + args = sub_ctx.args + + ctx = sub_ctx + args = [*sub_ctx.protected_args, *sub_ctx.args] + else: + break + + return ctx + + +def _resolve_incomplete( + ctx: Context, args: t.List[str], incomplete: str +) -> t.Tuple[t.Union[BaseCommand, Parameter], str]: + """Find the Click object that will handle the completion of the + incomplete value. Return the object and the incomplete value. + + :param ctx: Invocation context for the command represented by + the parsed complete args. + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + # Different shells treat an "=" between a long option name and + # value differently. Might keep the value joined, return the "=" + # as a separate item, or return the split name and value. Always + # split and discard the "=" to make completion easier. + if incomplete == "=": + incomplete = "" + elif "=" in incomplete and _start_of_option(ctx, incomplete): + name, _, incomplete = incomplete.partition("=") + args.append(name) + + # The "--" marker tells Click to stop treating values as options + # even if they start with the option character. If it hasn't been + # given and the incomplete arg looks like an option, the current + # command will provide option name completions. + if "--" not in args and _start_of_option(ctx, incomplete): + return ctx.command, incomplete + + params = ctx.command.get_params(ctx) + + # If the last complete arg is an option name with an incomplete + # value, the option will provide value completions. + for param in params: + if _is_incomplete_option(ctx, args, param): + return param, incomplete + + # It's not an option name or value. The first argument without a + # parsed value will provide value completions. + for param in params: + if _is_incomplete_argument(ctx, param): + return param, incomplete + + # There were no unparsed arguments, the command may be a group that + # will provide command name completions. + return ctx.command, incomplete diff --git a/Meliora/gmapenv/Lib/site-packages/click/termui.py b/Meliora/gmapenv/Lib/site-packages/click/termui.py new file mode 100644 index 00000000..db7a4b28 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/termui.py @@ -0,0 +1,784 @@ +import inspect +import io +import itertools +import sys +import typing as t +from gettext import gettext as _ + +from ._compat import isatty +from ._compat import strip_ansi +from .exceptions import Abort +from .exceptions import UsageError +from .globals import resolve_color_default +from .types import Choice +from .types import convert_type +from .types import ParamType +from .utils import echo +from .utils import LazyFile + +if t.TYPE_CHECKING: + from ._termui_impl import ProgressBar + +V = t.TypeVar("V") + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func: t.Callable[[str], str] = input + +_ansi_colors = { + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, + "reset": 39, + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} +_ansi_reset_all = "\033[0m" + + +def hidden_prompt_func(prompt: str) -> str: + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text: str, + suffix: str, + show_default: bool = False, + default: t.Optional[t.Any] = None, + show_choices: bool = True, + type: t.Optional[ParamType] = None, +) -> str: + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += f" ({', '.join(map(str, type.choices))})" + if default is not None and show_default: + prompt = f"{prompt} [{_format_default(default)}]" + return f"{prompt}{suffix}" + + +def _format_default(default: t.Any) -> t.Any: + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name + + return default + + +def prompt( + text: str, + default: t.Optional[t.Any] = None, + hide_input: bool = False, + confirmation_prompt: t.Union[bool, str] = False, + type: t.Optional[t.Union[ParamType, t.Any]] = None, + value_proc: t.Optional[t.Callable[[str], t.Any]] = None, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, + show_choices: bool = True, +) -> t.Any: + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending an interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: Prompt a second time to confirm the + value. Can be set to a string instead of ``True`` to customize + the message. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + + .. versionadded:: 8.0 + ``confirmation_prompt`` can be a custom string. + + .. versionadded:: 7.0 + Added the ``show_choices`` parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + """ + + def prompt_func(text: str) -> str: + f = hidden_prompt_func if hide_input else visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + return f(" ") + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() from None + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + if confirmation_prompt: + if confirmation_prompt is True: + confirmation_prompt = _("Repeat for confirmation") + + confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) + + while True: + while True: + value = prompt_func(prompt) + if value: + break + elif default is not None: + value = default + break + try: + result = value_proc(value) + except UsageError as e: + if hide_input: + echo(_("Error: The value you entered was invalid."), err=err) + else: + echo(_("Error: {e.message}").format(e=e), err=err) # noqa: B306 + continue + if not confirmation_prompt: + return result + while True: + value2 = prompt_func(confirmation_prompt) + is_empty = not value and not value2 + if value2 or is_empty: + break + if value == value2: + return result + echo(_("Error: The two entered values do not match."), err=err) + + +def confirm( + text: str, + default: t.Optional[bool] = False, + abort: bool = False, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, +) -> bool: + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the question to ask. + :param default: The default value to use when no input is given. If + ``None``, repeat until input is given. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + + .. versionchanged:: 8.0 + Repeat until input is given if ``default`` is ``None``. + + .. versionadded:: 4.0 + Added the ``err`` parameter. + """ + prompt = _build_prompt( + text, + prompt_suffix, + show_default, + "y/n" if default is None else ("Y/n" if default else "y/N"), + ) + + while True: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + value = visible_prompt_func(" ").lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() from None + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif default is not None and value == "": + rv = default + else: + echo(_("Error: invalid input"), err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def echo_via_pager( + text_or_generator: t.Union[t.Iterable[str], t.Callable[[], t.Iterable[str]], str], + color: t.Optional[bool] = None, +) -> None: + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = t.cast(t.Callable[[], t.Iterable[str]], text_or_generator)() + elif isinstance(text_or_generator, str): + i = [text_or_generator] + else: + i = iter(t.cast(t.Iterable[str], text_or_generator)) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, str) else str(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar( + iterable: t.Optional[t.Iterable[V]] = None, + length: t.Optional[int] = None, + label: t.Optional[str] = None, + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, +) -> "ProgressBar[V]": + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already created. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + Note: The progress bar is currently designed for use cases where the + total progress can be expected to take at least several seconds. + Because of this, the ProgressBar class object won't display + progress that is considered too fast, and progress where the time + between steps is less than a second. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + The ``update()`` method also takes an optional value specifying the + ``current_item`` at the new position. This is useful when used + together with ``item_show_func`` to customize the output for each + manual step:: + + with click.progressbar( + length=total_size, + label='Unzipping archive', + item_show_func=lambda a: a.filename + ) as bar: + for archive in zip_file: + archive.extract() + bar.update(archive.size, archive) + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: A function called with the current item which + can return a string to show next to the progress bar. If the + function returns ``None`` nothing is shown. The current item can + be ``None``, such as when entering and exiting the bar. + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: The file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + :param update_min_steps: Render only when this many updates have + completed. This allows tuning for very fast iterators. + + .. versionchanged:: 8.0 + Output is shown even if execution time is less than 0.5 seconds. + + .. versionchanged:: 8.0 + ``item_show_func`` shows the current item, not the previous one. + + .. versionchanged:: 8.0 + Labels are echoed if the output is not a TTY. Reverts a change + in 7.0 that removed all output. + + .. versionadded:: 8.0 + Added the ``update_min_steps`` parameter. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. Added the ``update`` method to + the object. + + .. versionadded:: 2.0 + """ + from ._termui_impl import ProgressBar + + color = resolve_color_default(color) + return ProgressBar( + iterable=iterable, + length=length, + show_eta=show_eta, + show_percent=show_percent, + show_pos=show_pos, + item_show_func=item_show_func, + fill_char=fill_char, + empty_char=empty_char, + bar_template=bar_template, + info_sep=info_sep, + file=file, + label=label, + width=width, + color=color, + update_min_steps=update_min_steps, + ) + + +def clear() -> None: + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + + # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor + echo("\033[2J\033[1;1H", nl=False) + + +def _interpret_color( + color: t.Union[int, t.Tuple[int, int, int], str], offset: int = 0 +) -> str: + if isinstance(color, int): + return f"{38 + offset};5;{color:d}" + + if isinstance(color, (tuple, list)): + r, g, b = color + return f"{38 + offset};2;{r:d};{g:d};{b:d}" + + return str(_ansi_colors[color] + offset) + + +def style( + text: t.Any, + fg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bold: t.Optional[bool] = None, + dim: t.Optional[bool] = None, + underline: t.Optional[bool] = None, + overline: t.Optional[bool] = None, + italic: t.Optional[bool] = None, + blink: t.Optional[bool] = None, + reverse: t.Optional[bool] = None, + strikethrough: t.Optional[bool] = None, + reset: bool = True, +) -> str: + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + If the terminal supports it, color may also be specified as: + + - An integer in the interval [0, 255]. The terminal must support + 8-bit/256-color mode. + - An RGB tuple of three integers in [0, 255]. The terminal must + support 24-bit/true-color mode. + + See https://en.wikipedia.org/wiki/ANSI_color and + https://gist.github.com/XVilka/8346728 for more information. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param overline: if provided this will enable or disable overline. + :param italic: if provided this will enable or disable italic. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param strikethrough: if provided this will enable or disable + striking through text. + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. + + .. versionchanged:: 8.0 + Added support for 256 and RGB color codes. + + .. versionchanged:: 8.0 + Added the ``strikethrough``, ``italic``, and ``overline`` + parameters. + + .. versionchanged:: 7.0 + Added support for bright colors. + + .. versionadded:: 2.0 + """ + if not isinstance(text, str): + text = str(text) + + bits = [] + + if fg: + try: + bits.append(f"\033[{_interpret_color(fg)}m") + except KeyError: + raise TypeError(f"Unknown color {fg!r}") from None + + if bg: + try: + bits.append(f"\033[{_interpret_color(bg, 10)}m") + except KeyError: + raise TypeError(f"Unknown color {bg!r}") from None + + if bold is not None: + bits.append(f"\033[{1 if bold else 22}m") + if dim is not None: + bits.append(f"\033[{2 if dim else 22}m") + if underline is not None: + bits.append(f"\033[{4 if underline else 24}m") + if overline is not None: + bits.append(f"\033[{53 if overline else 55}m") + if italic is not None: + bits.append(f"\033[{3 if italic else 23}m") + if blink is not None: + bits.append(f"\033[{5 if blink else 25}m") + if reverse is not None: + bits.append(f"\033[{7 if reverse else 27}m") + if strikethrough is not None: + bits.append(f"\033[{9 if strikethrough else 29}m") + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text: str) -> str: + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO[t.AnyStr]] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, + **styles: t.Any, +) -> None: + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + Non-string types will be converted to :class:`str`. However, + :class:`bytes` are passed directly to :meth:`echo` without applying + style. If you want to style bytes that represent text, call + :meth:`bytes.decode` first. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. Bytes are + passed through without style applied. + + .. versionadded:: 2.0 + """ + if message is not None and not isinstance(message, (bytes, bytearray)): + message = style(message, **styles) + + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit( + text: t.Optional[t.AnyStr] = None, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + filename: t.Optional[str] = None, +) -> t.Optional[t.AnyStr]: + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. + """ + from ._termui_impl import Editor + + ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) + + if filename is None: + return ed.edit(text) + + ed.edit_file(filename) + return None + + +def launch(url: str, wait: bool = False, locate: bool = False) -> int: + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: Wait for the program to exit before returning. This + only works if the launched program blocks. In particular, + ``xdg-open`` on Linux does not block. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar: t.Optional[t.Callable[[bool], str]] = None + + +def getchar(echo: bool = False) -> str: + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + global _getchar + + if _getchar is None: + from ._termui_impl import getchar as f + + _getchar = f + + return _getchar(echo) + + +def raw_terminal() -> t.ContextManager[int]: + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info: t.Optional[str] = None, err: bool = False) -> None: + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: The message to print before pausing. Defaults to + ``"Press any key to continue..."``. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + + if info is None: + info = _("Press any key to continue...") + + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/Meliora/gmapenv/Lib/site-packages/click/testing.py b/Meliora/gmapenv/Lib/site-packages/click/testing.py new file mode 100644 index 00000000..e0df0d2a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/testing.py @@ -0,0 +1,479 @@ +import contextlib +import io +import os +import shlex +import shutil +import sys +import tempfile +import typing as t +from types import TracebackType + +from . import formatting +from . import termui +from . import utils +from ._compat import _find_binary_reader + +if t.TYPE_CHECKING: + from .core import BaseCommand + + +class EchoingStdin: + def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: + self._input = input + self._output = output + self._paused = False + + def __getattr__(self, x: str) -> t.Any: + return getattr(self._input, x) + + def _echo(self, rv: bytes) -> bytes: + if not self._paused: + self._output.write(rv) + + return rv + + def read(self, n: int = -1) -> bytes: + return self._echo(self._input.read(n)) + + def read1(self, n: int = -1) -> bytes: + return self._echo(self._input.read1(n)) # type: ignore + + def readline(self, n: int = -1) -> bytes: + return self._echo(self._input.readline(n)) + + def readlines(self) -> t.List[bytes]: + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self) -> t.Iterator[bytes]: + return iter(self._echo(x) for x in self._input) + + def __repr__(self) -> str: + return repr(self._input) + + +@contextlib.contextmanager +def _pause_echo(stream: t.Optional[EchoingStdin]) -> t.Iterator[None]: + if stream is None: + yield + else: + stream._paused = True + yield + stream._paused = False + + +class _NamedTextIOWrapper(io.TextIOWrapper): + def __init__( + self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any + ) -> None: + super().__init__(buffer, **kwargs) + self._name = name + self._mode = mode + + @property + def name(self) -> str: + return self._name + + @property + def mode(self) -> str: + return self._mode + + +def make_input_stream( + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]], charset: str +) -> t.BinaryIO: + # Is already an input stream. + if hasattr(input, "read"): + rv = _find_binary_reader(t.cast(t.IO[t.Any], input)) + + if rv is not None: + return rv + + raise TypeError("Could not find binary reader for input stream.") + + if input is None: + input = b"" + elif isinstance(input, str): + input = input.encode(charset) + + return io.BytesIO(input) + + +class Result: + """Holds the captured result of an invoked CLI script.""" + + def __init__( + self, + runner: "CliRunner", + stdout_bytes: bytes, + stderr_bytes: t.Optional[bytes], + return_value: t.Any, + exit_code: int, + exception: t.Optional[BaseException], + exc_info: t.Optional[ + t.Tuple[t.Type[BaseException], BaseException, TracebackType] + ] = None, + ): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or None if not available + self.stderr_bytes = stderr_bytes + #: The value returned from the invoked command. + #: + #: .. versionadded:: 8.0 + self.return_value = return_value + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self) -> str: + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self) -> str: + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self) -> str: + """The standard error as unicode string.""" + if self.stderr_bytes is None: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self) -> str: + exc_str = repr(self.exception) if self.exception else "okay" + return f"<{type(self).__name__} {exc_str}>" + + +class CliRunner: + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__( + self, + charset: str = "utf-8", + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + echo_stdin: bool = False, + mix_stderr: bool = True, + ) -> None: + self.charset = charset + self.env: t.Mapping[str, t.Optional[str]] = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli: "BaseCommand") -> str: + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or "root" + + def make_env( + self, overrides: t.Optional[t.Mapping[str, t.Optional[str]]] = None + ) -> t.Mapping[str, t.Optional[str]]: + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation( + self, + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + color: bool = False, + ) -> t.Iterator[t.Tuple[io.BytesIO, t.Optional[io.BytesIO]]]: + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + :param input: the input stream to put into sys.stdin. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionchanged:: 8.0 + ``stderr`` is opened with ``errors="backslashreplace"`` + instead of the default ``"strict"``. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + """ + bytes_input = make_input_stream(input, self.charset) + echo_input = None + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = formatting.FORCED_WIDTH + formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + bytes_output = io.BytesIO() + + if self.echo_stdin: + bytes_input = echo_input = t.cast( + t.BinaryIO, EchoingStdin(bytes_input, bytes_output) + ) + + sys.stdin = text_input = _NamedTextIOWrapper( + bytes_input, encoding=self.charset, name="", mode="r" + ) + + if self.echo_stdin: + # Force unbuffered reads, otherwise TextIOWrapper reads a + # large chunk which is echoed early. + text_input._CHUNK_SIZE = 1 # type: ignore + + sys.stdout = _NamedTextIOWrapper( + bytes_output, encoding=self.charset, name="", mode="w" + ) + + bytes_error = None + if self.mix_stderr: + sys.stderr = sys.stdout + else: + bytes_error = io.BytesIO() + sys.stderr = _NamedTextIOWrapper( + bytes_error, + encoding=self.charset, + name="", + mode="w", + errors="backslashreplace", + ) + + @_pause_echo(echo_input) # type: ignore + def visible_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(prompt or "") + val = text_input.readline().rstrip("\r\n") + sys.stdout.write(f"{val}\n") + sys.stdout.flush() + return val + + @_pause_echo(echo_input) # type: ignore + def hidden_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(f"{prompt or ''}\n") + sys.stdout.flush() + return text_input.readline().rstrip("\r\n") + + @_pause_echo(echo_input) # type: ignore + def _getchar(echo: bool) -> str: + char = sys.stdin.read(1) + + if echo: + sys.stdout.write(char) + + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi( + stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None + ) -> bool: + if color is None: + return not default_color + return not color + + old_visible_prompt_func = termui.visible_prompt_func + old_hidden_prompt_func = termui.hidden_prompt_func + old__getchar_func = termui._getchar + old_should_strip_ansi = utils.should_strip_ansi # type: ignore + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi # type: ignore + + old_env = {} + try: + for key, value in env.items(): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (bytes_output, bytes_error) + finally: + for key, value in old_env.items(): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + termui.visible_prompt_func = old_visible_prompt_func + termui.hidden_prompt_func = old_hidden_prompt_func + termui._getchar = old__getchar_func + utils.should_strip_ansi = old_should_strip_ansi # type: ignore + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli: "BaseCommand", + args: t.Optional[t.Union[str, t.Sequence[str]]] = None, + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + catch_exceptions: bool = True, + color: bool = False, + **extra: t.Any, + ) -> Result: + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionchanged:: 8.0 + The result object has the ``return_value`` attribute with + the value returned from the invoked command. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionchanged:: 3.0 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 3.0 + The result object has the ``exc_info`` attribute with the + traceback if available. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + return_value = None + exception: t.Optional[BaseException] = None + exit_code = 0 + + if isinstance(args, str): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + return_value = cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + e_code = t.cast(t.Optional[t.Union[int, t.Any]], e.code) + + if e_code is None: + e_code = 0 + + if e_code != 0: + exception = e + + if not isinstance(e_code, int): + sys.stdout.write(str(e_code)) + sys.stdout.write("\n") + e_code = 1 + + exit_code = e_code + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + if self.mix_stderr: + stderr = None + else: + stderr = outstreams[1].getvalue() # type: ignore + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + return_value=return_value, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, # type: ignore + ) + + @contextlib.contextmanager + def isolated_filesystem( + self, temp_dir: t.Optional[t.Union[str, "os.PathLike[str]"]] = None + ) -> t.Iterator[str]: + """A context manager that creates a temporary directory and + changes the current working directory to it. This isolates tests + that affect the contents of the CWD to prevent them from + interfering with each other. + + :param temp_dir: Create the temporary directory under this + directory. If given, the created directory is not removed + when exiting. + + .. versionchanged:: 8.0 + Added the ``temp_dir`` parameter. + """ + cwd = os.getcwd() + dt = tempfile.mkdtemp(dir=temp_dir) + os.chdir(dt) + + try: + yield dt + finally: + os.chdir(cwd) + + if temp_dir is None: + try: + shutil.rmtree(dt) + except OSError: # noqa: B014 + pass diff --git a/Meliora/gmapenv/Lib/site-packages/click/types.py b/Meliora/gmapenv/Lib/site-packages/click/types.py new file mode 100644 index 00000000..2b1d1797 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/types.py @@ -0,0 +1,1089 @@ +import os +import stat +import sys +import typing as t +from datetime import datetime +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import _get_argv_encoding +from ._compat import open_stream +from .exceptions import BadParameter +from .utils import format_filename +from .utils import LazyFile +from .utils import safecall + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Context + from .core import Parameter + from .shell_completion import CompletionItem + + +class ParamType: + """Represents the type of a parameter. Validates and converts values + from the command line or Python into the correct type. + + To implement a custom type, subclass and implement at least the + following: + + - The :attr:`name` class attribute must be set. + - Calling an instance of the type with ``None`` must return + ``None``. This is already implemented by default. + - :meth:`convert` must convert string values to the correct type. + - :meth:`convert` must accept values that are already the correct + type. + - It must be able to convert a value if the ``ctx`` and ``param`` + arguments are ``None``. This can occur when converting prompt + input. + """ + + is_composite: t.ClassVar[bool] = False + arity: t.ClassVar[int] = 1 + + #: the descriptive name of this type + name: str + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter: t.ClassVar[t.Optional[str]] = None + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + # The class name without the "ParamType" suffix. + param_type = type(self).__name__.partition("ParamType")[0] + param_type = param_type.partition("ParameterType")[0] + + # Custom subclasses might not remember to set a name. + if hasattr(self, "name"): + name = self.name + else: + name = param_type + + return {"param_type": param_type, "name": name} + + def __call__( + self, + value: t.Any, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> t.Any: + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param: "Parameter") -> t.Optional[str]: + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param: "Parameter") -> t.Optional[str]: + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + """Convert the value to the correct type. This is not called if + the value is ``None`` (the missing value). + + This must accept string values from the command line, as well as + values that are already the correct type. It may also convert + other compatible types. + + The ``param`` and ``ctx`` arguments may be ``None`` in certain + situations, such as when converting prompt input. + + If the value cannot be converted, call :meth:`fail` with a + descriptive message. + + :param value: The value to convert. + :param param: The parameter that is using this type to convert + its value. May be ``None``. + :param ctx: The current context that arrived at this value. May + be ``None``. + """ + return value + + def split_envvar_value(self, rv: str) -> t.Sequence[str]: + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or "").split(self.envvar_list_splitter) + + def fail( + self, + message: str, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> "t.NoReturn": + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a list of + :class:`~click.shell_completion.CompletionItem` objects for the + incomplete value. Most types do not provide completions, but + some do, and this allows custom types to provide custom + completions as well. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + return [] + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self) -> int: # type: ignore + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: + self.name: str = func.__name__ + self.func = func + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["func"] = self.func + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self.func(value) + except ValueError: + try: + value = str(value) + except UnicodeError: + value = value.decode("utf-8", "replace") + + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + return value + + def __repr__(self) -> str: + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = sys.getfilesystemencoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode("utf-8", "replace") + else: + value = value.decode("utf-8", "replace") + return value + return str(value) + + def __repr__(self) -> str: + return "STRING" + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + The resulting value will always be one of the originally passed choices + regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` + being specified. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = "choice" + + def __init__(self, choices: t.Sequence[str], case_sensitive: bool = True) -> None: + self.choices = choices + self.case_sensitive = case_sensitive + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["choices"] = self.choices + info_dict["case_sensitive"] = self.case_sensitive + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + choices_str = "|".join(self.choices) + + # Use curly braces to indicate a required argument. + if param.required and param.param_type_name == "argument": + return f"{{{choices_str}}}" + + # Use square braces to indicate an option or optional argument. + return f"[{choices_str}]" + + def get_missing_message(self, param: "Parameter") -> str: + return _("Choose from:\n\t{choices}").format(choices=",\n\t".join(self.choices)) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = {choice: choice for choice in self.choices} + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = { + ctx.token_normalize_func(normed_choice): original + for normed_choice, original in normed_choices.items() + } + + if not self.case_sensitive: + normed_value = normed_value.casefold() + normed_choices = { + normed_choice.casefold(): original + for normed_choice, original in normed_choices.items() + } + + if normed_value in normed_choices: + return normed_choices[normed_value] + + choices_str = ", ".join(map(repr, self.choices)) + self.fail( + ngettext( + "{value!r} is not {choice}.", + "{value!r} is not one of {choices}.", + len(self.choices), + ).format(value=value, choice=choices_str, choices=choices_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return f"Choice({list(self.choices)})" + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Complete choices that start with the incomplete value. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + str_choices = map(str, self.choices) + + if self.case_sensitive: + matched = (c for c in str_choices if c.startswith(incomplete)) + else: + incomplete = incomplete.lower() + matched = (c for c in str_choices if c.lower().startswith(incomplete)) + + return [CompletionItem(c) for c in matched] + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + + name = "datetime" + + def __init__(self, formats: t.Optional[t.Sequence[str]] = None): + self.formats: t.Sequence[str] = formats or [ + "%Y-%m-%d", + "%Y-%m-%dT%H:%M:%S", + "%Y-%m-%d %H:%M:%S", + ] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["formats"] = self.formats + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + return f"[{'|'.join(self.formats)}]" + + def _try_to_convert_date(self, value: t.Any, format: str) -> t.Optional[datetime]: + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, datetime): + return value + + for format in self.formats: + converted = self._try_to_convert_date(value, format) + + if converted is not None: + return converted + + formats_str = ", ".join(map(repr, self.formats)) + self.fail( + ngettext( + "{value!r} does not match the format {format}.", + "{value!r} does not match the formats {formats}.", + len(self.formats), + ).format(value=value, format=formats_str, formats=formats_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return "DateTime" + + +class _NumberParamTypeBase(ParamType): + _number_class: t.ClassVar[t.Type[t.Any]] + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self._number_class(value) + except ValueError: + self.fail( + _("{value!r} is not a valid {number_type}.").format( + value=value, number_type=self.name + ), + param, + ctx, + ) + + +class _NumberRangeBase(_NumberParamTypeBase): + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + self.min = min + self.max = max + self.min_open = min_open + self.max_open = max_open + self.clamp = clamp + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + min=self.min, + max=self.max, + min_open=self.min_open, + max_open=self.max_open, + clamp=self.clamp, + ) + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import operator + + rv = super().convert(value, param, ctx) + lt_min: bool = self.min is not None and ( + operator.le if self.min_open else operator.lt + )(rv, self.min) + gt_max: bool = self.max is not None and ( + operator.ge if self.max_open else operator.gt + )(rv, self.max) + + if self.clamp: + if lt_min: + return self._clamp(self.min, 1, self.min_open) # type: ignore + + if gt_max: + return self._clamp(self.max, -1, self.max_open) # type: ignore + + if lt_min or gt_max: + self.fail( + _("{value} is not in the range {range}.").format( + value=rv, range=self._describe_range() + ), + param, + ctx, + ) + + return rv + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + """Find the valid value to clamp to bound in the given + direction. + + :param bound: The boundary value. + :param dir: 1 or -1 indicating the direction to move. + :param open: If true, the range does not include the bound. + """ + raise NotImplementedError + + def _describe_range(self) -> str: + """Describe the range for use in help text.""" + if self.min is None: + op = "<" if self.max_open else "<=" + return f"x{op}{self.max}" + + if self.max is None: + op = ">" if self.min_open else ">=" + return f"x{op}{self.min}" + + lop = "<" if self.min_open else "<=" + rop = "<" if self.max_open else "<=" + return f"{self.min}{lop}x{rop}{self.max}" + + def __repr__(self) -> str: + clamp = " clamped" if self.clamp else "" + return f"<{type(self).__name__} {self._describe_range()}{clamp}>" + + +class IntParamType(_NumberParamTypeBase): + name = "integer" + _number_class = int + + def __repr__(self) -> str: + return "INT" + + +class IntRange(_NumberRangeBase, IntParamType): + """Restrict an :data:`click.INT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "integer range" + + def _clamp( # type: ignore + self, bound: int, dir: "te.Literal[1, -1]", open: bool + ) -> int: + if not open: + return bound + + return bound + dir + + +class FloatParamType(_NumberParamTypeBase): + name = "float" + _number_class = float + + def __repr__(self) -> str: + return "FLOAT" + + +class FloatRange(_NumberRangeBase, FloatParamType): + """Restrict a :data:`click.FLOAT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. This is not supported if either + boundary is marked ``open``. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "float range" + + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + super().__init__( + min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp + ) + + if (min_open or max_open) and clamp: + raise TypeError("Clamping is not supported for open bounds.") + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + if not open: + return bound + + # Could use Python 3.9's math.nextafter here, but clamping an + # open float range doesn't seem to be particularly useful. It's + # left up to the user to write a callback to do it if needed. + raise RuntimeError("Clamping is not supported for open bounds.") + + +class BoolParamType(ParamType): + name = "boolean" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if value in {False, True}: + return bool(value) + + norm = value.strip().lower() + + if norm in {"1", "true", "t", "yes", "y", "on"}: + return True + + if norm in {"0", "false", "f", "no", "n", "off"}: + return False + + self.fail( + _("{value!r} is not a valid boolean.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import uuid + + if isinstance(value, uuid.UUID): + return value + + value = value.strip() + + try: + return uuid.UUID(value) + except ValueError: + self.fail( + _("{value!r} is not a valid UUID.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "UUID" + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Starting with Click 2.0, files can also be opened atomically in which + case all writes go into a separate file in the same folder and upon + completion the file will be moved over to the original location. This + is useful if a file regularly read by other users is modified. + + See :ref:`file-args` for more information. + """ + + name = "filename" + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: t.Optional[bool] = None, + atomic: bool = False, + ) -> None: + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update(mode=self.mode, encoding=self.encoding) + return info_dict + + def resolve_lazy_flag(self, value: "t.Union[str, os.PathLike[str]]") -> bool: + if self.lazy is not None: + return self.lazy + if os.fspath(value) == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert( + self, + value: t.Union[str, "os.PathLike[str]", t.IO[t.Any]], + param: t.Optional["Parameter"], + ctx: t.Optional["Context"], + ) -> t.IO[t.Any]: + if _is_file_like(value): + return value + + value = t.cast("t.Union[str, os.PathLike[str]]", value) + + try: + lazy = self.resolve_lazy_flag(value) + + if lazy: + lf = LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + if ctx is not None: + ctx.call_on_close(lf.close_intelligently) + + return t.cast(t.IO[t.Any], lf) + + f, should_close = open_stream( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + + return f + except OSError as e: # noqa: B014 + self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide file path completions. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + return [CompletionItem(incomplete, type="file")] + + +def _is_file_like(value: t.Any) -> "te.TypeGuard[t.IO[t.Any]]": + return hasattr(value, "read") or hasattr(value, "write") + + +class Path(ParamType): + """The ``Path`` type is similar to the :class:`File` type, but + returns the filename instead of an open file. Various checks can be + enabled to validate the type of file and permissions. + + :param exists: The file or directory needs to exist for the value to + be valid. If this is not set to ``True``, and the file does not + exist, then all further checks are silently skipped. + :param file_okay: Allow a file as a value. + :param dir_okay: Allow a directory as a value. + :param readable: if true, a readable check is performed. + :param writable: if true, a writable check is performed. + :param executable: if true, an executable check is performed. + :param resolve_path: Make the value absolute and resolve any + symlinks. A ``~`` is not expanded, as this is supposed to be + done by the shell only. + :param allow_dash: Allow a single dash as a value, which indicates + a standard stream (but does not open it). Use + :func:`~click.open_file` to handle opening this value. + :param path_type: Convert the incoming path value to this type. If + ``None``, keep Python's default, which is ``str``. Useful to + convert to :class:`pathlib.Path`. + + .. versionchanged:: 8.1 + Added the ``executable`` parameter. + + .. versionchanged:: 8.0 + Allow passing ``path_type=pathlib.Path``. + + .. versionchanged:: 6.0 + Added the ``allow_dash`` parameter. + """ + + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + exists: bool = False, + file_okay: bool = True, + dir_okay: bool = True, + writable: bool = False, + readable: bool = True, + resolve_path: bool = False, + allow_dash: bool = False, + path_type: t.Optional[t.Type[t.Any]] = None, + executable: bool = False, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.readable = readable + self.writable = writable + self.executable = executable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name: str = _("file") + elif self.dir_okay and not self.file_okay: + self.name = _("directory") + else: + self.name = _("path") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + exists=self.exists, + file_okay=self.file_okay, + dir_okay=self.dir_okay, + writable=self.writable, + readable=self.readable, + allow_dash=self.allow_dash, + ) + return info_dict + + def coerce_path_result( + self, value: "t.Union[str, os.PathLike[str]]" + ) -> "t.Union[str, bytes, os.PathLike[str]]": + if self.type is not None and not isinstance(value, self.type): + if self.type is str: + return os.fsdecode(value) + elif self.type is bytes: + return os.fsencode(value) + else: + return t.cast("os.PathLike[str]", self.type(value)) + + return value + + def convert( + self, + value: "t.Union[str, os.PathLike[str]]", + param: t.Optional["Parameter"], + ctx: t.Optional["Context"], + ) -> "t.Union[str, bytes, os.PathLike[str]]": + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") + + if not is_dash: + if self.resolve_path: + # os.path.realpath doesn't resolve symlinks on Windows + # until Python 3.8. Use pathlib for now. + import pathlib + + rv = os.fsdecode(pathlib.Path(rv).resolve()) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail( + _("{name} {filename!r} does not exist.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + _("{name} {filename!r} is a file.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + _("{name} '{filename}' is a directory.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.readable and not os.access(rv, os.R_OK): + self.fail( + _("{name} {filename!r} is not readable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.writable and not os.access(rv, os.W_OK): + self.fail( + _("{name} {filename!r} is not writable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.executable and not os.access(value, os.X_OK): + self.fail( + _("{name} {filename!r} is not executable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide path completions for only + directories or any paths. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + type = "dir" if self.dir_okay and not self.file_okay else "file" + return [CompletionItem(incomplete, type=type)] + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types: t.Sequence[t.Union[t.Type[t.Any], ParamType]]) -> None: + self.types: t.Sequence[ParamType] = [convert_type(ty) for ty in types] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["types"] = [t.to_info_dict() for t in self.types] + return info_dict + + @property + def name(self) -> str: # type: ignore + return f"<{' '.join(ty.name for ty in self.types)}>" + + @property + def arity(self) -> int: # type: ignore + return len(self.types) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + len_type = len(self.types) + len_value = len(value) + + if len_value != len_type: + self.fail( + ngettext( + "{len_type} values are required, but {len_value} was given.", + "{len_type} values are required, but {len_value} were given.", + len_value, + ).format(len_type=len_type, len_value=len_value), + param=param, + ctx=ctx, + ) + + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty: t.Optional[t.Any], default: t.Optional[t.Any] = None) -> ParamType: + """Find the most appropriate :class:`ParamType` for the given Python + type. If the type isn't provided, it can be inferred from a default + value. + """ + guessed_type = False + + if ty is None and default is not None: + if isinstance(default, (tuple, list)): + # If the default is empty, ty will remain None and will + # return STRING. + if default: + item = default[0] + + # A tuple of tuples needs to detect the inner types. + # Can't call convert recursively because that would + # incorrectly unwind the tuple to a single type. + if isinstance(item, (tuple, list)): + ty = tuple(map(type, item)) + else: + ty = type(item) + else: + ty = type(default) + + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + + if isinstance(ty, ParamType): + return ty + + if ty is str or ty is None: + return STRING + + if ty is int: + return INT + + if ty is float: + return FLOAT + + if ty is bool: + return BOOL + + if guessed_type: + return STRING + + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + f"Attempted to use an uninstantiated parameter type ({ty})." + ) + except TypeError: + # ty is an instance (correct), so issubclass fails. + pass + + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but +#: internally no string conversion takes place if the input was bytes. +#: This is usually useful when working with file paths as they can +#: appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() diff --git a/Meliora/gmapenv/Lib/site-packages/click/utils.py b/Meliora/gmapenv/Lib/site-packages/click/utils.py new file mode 100644 index 00000000..d536434f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/click/utils.py @@ -0,0 +1,624 @@ +import os +import re +import sys +import typing as t +from functools import update_wrapper +from types import ModuleType +from types import TracebackType + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import _find_binary_writer +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import open_stream +from ._compat import should_strip_ansi +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import WIN +from .globals import resolve_color_default + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") + + +def _posixify(name: str) -> str: + return "-".join(name.split()).lower() + + +def safecall(func: "t.Callable[P, R]") -> "t.Callable[P, t.Optional[R]]": + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args: "P.args", **kwargs: "P.kwargs") -> t.Optional[R]: + try: + return func(*args, **kwargs) + except Exception: + pass + return None + + return update_wrapper(wrapper, func) + + +def make_str(value: t.Any) -> str: + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(sys.getfilesystemencoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return str(value) + + +def make_default_short_help(help: str, max_length: int = 45) -> str: + """Returns a condensed version of help string.""" + # Consider only the first paragraph. + paragraph_end = help.find("\n\n") + + if paragraph_end != -1: + help = help[:paragraph_end] + + # Collapse newlines, tabs, and spaces. + words = help.split() + + if not words: + return "" + + # The first paragraph started with a "no rewrap" marker, ignore it. + if words[0] == "\b": + words = words[1:] + + total_length = 0 + last_index = len(words) - 1 + + for i, word in enumerate(words): + total_length += len(word) + (i > 0) + + if total_length > max_length: # too long, truncate + break + + if word[-1] == ".": # sentence end, truncate without "..." + return " ".join(words[: i + 1]) + + if total_length == max_length and i != last_index: + break # not at sentence end, truncate with "..." + else: + return " ".join(words) # no truncation needed + + # Account for the length of the suffix. + total_length += len("...") + + # remove words until the length is short enough + while i > 0: + total_length -= len(words[i]) + (i > 0) + + if total_length <= max_length: + break + + i -= 1 + + return " ".join(words[:i]) + "..." + + +class LazyFile: + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__( + self, + filename: t.Union[str, "os.PathLike[str]"], + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, + ): + self.name: str = os.fspath(filename) + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + self._f: t.Optional[t.IO[t.Any]] + self.should_close: bool + + if self.name == "-": + self._f, self.should_close = open_stream(filename, mode, encoding, errors) + else: + if "r" in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self.open(), name) + + def __repr__(self) -> str: + if self._f is not None: + return repr(self._f) + return f"" + + def open(self) -> t.IO[t.Any]: + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream( + self.name, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + except OSError as e: # noqa: E402 + from .exceptions import FileError + + raise FileError(self.name, hint=e.strerror) from e + self._f = rv + return rv + + def close(self) -> None: + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self) -> None: + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self) -> "LazyFile": + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self.close_intelligently() + + def __iter__(self) -> t.Iterator[t.AnyStr]: + self.open() + return iter(self._f) # type: ignore + + +class KeepOpenFile: + def __init__(self, file: t.IO[t.Any]) -> None: + self._file: t.IO[t.Any] = file + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._file, name) + + def __enter__(self) -> "KeepOpenFile": + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + pass + + def __repr__(self) -> str: + return repr(self._file) + + def __iter__(self) -> t.Iterator[t.AnyStr]: + return iter(self._file) + + +def echo( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO[t.Any]] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, +) -> None: + """Print a message and newline to stdout or a file. This should be + used instead of :func:`print` because it provides better support + for different data, files, and environments. + + Compared to :func:`print`, this does the following: + + - Ensures that the output encoding is not misconfigured on Linux. + - Supports Unicode in the Windows console. + - Supports writing to binary outputs, and supports writing bytes + to text outputs. + - Supports colors and styles on Windows. + - Removes ANSI color and style codes if the output does not look + like an interactive terminal. + - Always flushes the output. + + :param message: The string or bytes to output. Other objects are + converted to strings. + :param file: The file to write to. Defaults to ``stdout``. + :param err: Write to ``stderr`` instead of ``stdout``. + :param nl: Print a newline after the message. Enabled by default. + :param color: Force showing or hiding colors and other styles. By + default Click will remove color if the output does not look like + an interactive terminal. + + .. versionchanged:: 6.0 + Support Unicode output on the Windows console. Click does not + modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` + will still not support Unicode. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionadded:: 3.0 + Added the ``err`` parameter. + + .. versionchanged:: 2.0 + Support colors on Windows if colorama is installed. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + return + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, (str, bytes, bytearray)): + out: t.Optional[t.Union[str, bytes]] = str(message) + else: + out = message + + if nl: + out = out or "" + if isinstance(out, str): + out += "\n" + else: + out += b"\n" + + if not out: + file.flush() + return + + # If there is a message and the value looks like bytes, we manually + # need to find the binary stream and write the message in there. + # This is done separately so that most stream types will work as you + # would expect. Eg: you can write to StringIO for other cases. + if isinstance(out, (bytes, bytearray)): + binary_file = _find_binary_writer(file) + + if binary_file is not None: + file.flush() + binary_file.write(out) + binary_file.flush() + return + + # ANSI style code support. For no message or bytes, nothing happens. + # When outputting to a file instead of a terminal, strip codes. + else: + color = resolve_color_default(color) + + if should_strip_ansi(file, color): + out = strip_ansi(out) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) # type: ignore + elif not color: + out = strip_ansi(out) + + file.write(out) # type: ignore + file.flush() + + +def get_binary_stream(name: "te.Literal['stdin', 'stdout', 'stderr']") -> t.BinaryIO: + """Returns a system stream for byte processing. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener() + + +def get_text_stream( + name: "te.Literal['stdin', 'stdout', 'stderr']", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", +) -> t.TextIO: + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts for already + correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener(encoding, errors) + + +def open_file( + filename: str, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: bool = False, + atomic: bool = False, +) -> t.IO[t.Any]: + """Open a file, with extra behavior to handle ``'-'`` to indicate + a standard stream, lazy open on write, and atomic write. Similar to + the behavior of the :class:`~click.File` param type. + + If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is + wrapped so that using it in a context manager will not close it. + This makes it possible to use the function without accidentally + closing a standard stream: + + .. code-block:: python + + with open_file(filename) as f: + ... + + :param filename: The name of the file to open, or ``'-'`` for + ``stdin``/``stdout``. + :param mode: The mode in which to open the file. + :param encoding: The encoding to decode or encode a file opened in + text mode. + :param errors: The error handling mode. + :param lazy: Wait to open the file until it is accessed. For read + mode, the file is temporarily opened to raise access errors + early, then closed until it is read again. + :param atomic: Write to a temporary file and replace the given file + on close. + + .. versionadded:: 3.0 + """ + if lazy: + return t.cast( + t.IO[t.Any], LazyFile(filename, mode, encoding, errors, atomic=atomic) + ) + + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + + if not should_close: + f = t.cast(t.IO[t.Any], KeepOpenFile(f)) + + return f + + +def format_filename( + filename: "t.Union[str, bytes, os.PathLike[str], os.PathLike[bytes]]", + shorten: bool = False, +) -> str: + """Format a filename as a string for display. Ensures the filename can be + displayed by replacing any invalid bytes or surrogate escapes in the name + with the replacement character ``�``. + + Invalid bytes or surrogate escapes will raise an error when written to a + stream with ``errors="strict". This will typically happen with ``stdout`` + when the locale is something like ``en_GB.UTF-8``. + + Many scenarios *are* safe to write surrogates though, due to PEP 538 and + PEP 540, including: + + - Writing to ``stderr``, which uses ``errors="backslashreplace"``. + - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens + stdout and stderr with ``errors="surrogateescape"``. + - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. + - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. + Python opens stdout and stderr with ``errors="surrogateescape"``. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + else: + filename = os.fspath(filename) + + if isinstance(filename, bytes): + filename = filename.decode(sys.getfilesystemencoding(), "replace") + else: + filename = filename.encode("utf-8", "surrogateescape").decode( + "utf-8", "replace" + ) + + return filename + + +def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Windows (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Windows (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no effect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = "APPDATA" if roaming else "LOCALAPPDATA" + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser("~") + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) + if sys.platform == "darwin": + return os.path.join( + os.path.expanduser("~/Library/Application Support"), app_name + ) + return os.path.join( + os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), + _posixify(app_name), + ) + + +class PacifyFlushWrapper: + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped: t.IO[t.Any]) -> None: + self.wrapped = wrapped + + def flush(self) -> None: + try: + self.wrapped.flush() + except OSError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr: str) -> t.Any: + return getattr(self.wrapped, attr) + + +def _detect_program_name( + path: t.Optional[str] = None, _main: t.Optional[ModuleType] = None +) -> str: + """Determine the command used to run the program, for use in help + text. If a file or entry point was executed, the file name is + returned. If ``python -m`` was used to execute a module or package, + ``python -m name`` is returned. + + This doesn't try to be too precise, the goal is to give a concise + name for help text. Files are only shown as their name without the + path. ``python`` is only shown for modules, and the full path to + ``sys.executable`` is not shown. + + :param path: The Python file being executed. Python puts this in + ``sys.argv[0]``, which is used by default. + :param _main: The ``__main__`` module. This should only be passed + during internal testing. + + .. versionadded:: 8.0 + Based on command args detection in the Werkzeug reloader. + + :meta private: + """ + if _main is None: + _main = sys.modules["__main__"] + + if not path: + path = sys.argv[0] + + # The value of __package__ indicates how Python was called. It may + # not exist if a setuptools script is installed as an egg. It may be + # set incorrectly for entry points created with pip on Windows. + # It is set to "" inside a Shiv or PEX zipapp. + if getattr(_main, "__package__", None) in {None, ""} or ( + os.name == "nt" + and _main.__package__ == "" + and not os.path.exists(path) + and os.path.exists(f"{path}.exe") + ): + # Executed a file, like "python app.py". + return os.path.basename(path) + + # Executed a module, like "python -m example". + # Rewritten by Python from "-m script" to "/path/to/script.py". + # Need to look at main module to determine how it was executed. + py_module = t.cast(str, _main.__package__) + name = os.path.splitext(os.path.basename(path))[0] + + # A submodule like "example.cli". + if name != "__main__": + py_module = f"{py_module}.{name}" + + return f"python -m {py_module.lstrip('.')}" + + +def _expand_args( + args: t.Iterable[str], + *, + user: bool = True, + env: bool = True, + glob_recursive: bool = True, +) -> t.List[str]: + """Simulate Unix shell expansion with Python functions. + + See :func:`glob.glob`, :func:`os.path.expanduser`, and + :func:`os.path.expandvars`. + + This is intended for use on Windows, where the shell does not do any + expansion. It may not exactly match what a Unix shell would do. + + :param args: List of command line arguments to expand. + :param user: Expand user home directory. + :param env: Expand environment variables. + :param glob_recursive: ``**`` matches directories recursively. + + .. versionchanged:: 8.1 + Invalid glob patterns are treated as empty expansions rather + than raising an error. + + .. versionadded:: 8.0 + + :meta private: + """ + from glob import glob + + out = [] + + for arg in args: + if user: + arg = os.path.expanduser(arg) + + if env: + arg = os.path.expandvars(arg) + + try: + matches = glob(arg, recursive=glob_recursive) + except re.error: + matches = [] + + if not matches: + out.append(arg) + else: + out.extend(matches) + + return out diff --git a/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA new file mode 100644 index 00000000..a1b5c575 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA @@ -0,0 +1,441 @@ +Metadata-Version: 2.1 +Name: colorama +Version: 0.4.6 +Summary: Cross-platform colored terminal text. +Project-URL: Homepage, https://github.com/tartley/colorama +Author-email: Jonathan Hartley +License-File: LICENSE.txt +Keywords: ansi,color,colour,crossplatform,terminal,text,windows,xplatform +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Terminals +Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7 +Description-Content-Type: text/x-rst + +.. image:: https://img.shields.io/pypi/v/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/pyversions/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Supported Python versions + +.. image:: https://github.com/tartley/colorama/actions/workflows/test.yml/badge.svg + :target: https://github.com/tartley/colorama/actions/workflows/test.yml + :alt: Build Status + +Colorama +======== + +Makes ANSI escape character sequences (for producing colored terminal text and +cursor positioning) work under MS Windows. + +.. |donate| image:: https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif + :target: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=2MZ9D2GMLYCUJ&item_name=Colorama¤cy_code=USD + :alt: Donate with Paypal + +`PyPI for releases `_ | +`Github for source `_ | +`Colorama for enterprise on Tidelift `_ + +If you find Colorama useful, please |donate| to the authors. Thank you! + +Installation +------------ + +Tested on CPython 2.7, 3.7, 3.8, 3.9 and 3.10 and Pypy 2.7 and 3.8. + +No requirements other than the standard library. + +.. code-block:: bash + + pip install colorama + # or + conda install -c anaconda colorama + +Description +----------- + +ANSI escape character sequences have long been used to produce colored terminal +text and cursor positioning on Unix and Macs. Colorama makes this work on +Windows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which +would appear as gobbledygook in the output), and converting them into the +appropriate win32 calls to modify the state of the terminal. On other platforms, +Colorama does nothing. + +This has the upshot of providing a simple cross-platform API for printing +colored terminal text from Python, and has the happy side-effect that existing +applications or libraries which use ANSI sequences to produce colored output on +Linux or Macs can now also work on Windows, simply by calling +``colorama.just_fix_windows_console()`` (since v0.4.6) or ``colorama.init()`` +(all versions, but may have other side-effects – see below). + +An alternative approach is to install ``ansi.sys`` on Windows machines, which +provides the same behaviour for all applications running in terminals. Colorama +is intended for situations where that isn't easy (e.g., maybe your app doesn't +have an installer.) + +Demo scripts in the source code repository print some colored text using +ANSI sequences. Compare their output under Gnome-terminal's built in ANSI +handling, versus on Windows Command-Prompt using Colorama: + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png + :width: 661 + :height: 357 + :alt: ANSI sequences on Ubuntu under gnome-terminal. + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png + :width: 668 + :height: 325 + :alt: Same ANSI sequences on Windows, using Colorama. + +These screenshots show that, on Windows, Colorama does not support ANSI 'dim +text'; it looks the same as 'normal text'. + +Usage +----- + +Initialisation +.............. + +If the only thing you want from Colorama is to get ANSI escapes to work on +Windows, then run: + +.. code-block:: python + + from colorama import just_fix_windows_console + just_fix_windows_console() + +If you're on a recent version of Windows 10 or better, and your stdout/stderr +are pointing to a Windows console, then this will flip the magic configuration +switch to enable Windows' built-in ANSI support. + +If you're on an older version of Windows, and your stdout/stderr are pointing to +a Windows console, then this will wrap ``sys.stdout`` and/or ``sys.stderr`` in a +magic file object that intercepts ANSI escape sequences and issues the +appropriate Win32 calls to emulate them. + +In all other circumstances, it does nothing whatsoever. Basically the idea is +that this makes Windows act like Unix with respect to ANSI escape handling. + +It's safe to call this function multiple times. It's safe to call this function +on non-Windows platforms, but it won't do anything. It's safe to call this +function when one or both of your stdout/stderr are redirected to a file – it +won't do anything to those streams. + +Alternatively, you can use the older interface with more features (but also more +potential footguns): + +.. code-block:: python + + from colorama import init + init() + +This does the same thing as ``just_fix_windows_console``, except for the +following differences: + +- It's not safe to call ``init`` multiple times; you can end up with multiple + layers of wrapping and broken ANSI support. + +- Colorama will apply a heuristic to guess whether stdout/stderr support ANSI, + and if it thinks they don't, then it will wrap ``sys.stdout`` and + ``sys.stderr`` in a magic file object that strips out ANSI escape sequences + before printing them. This happens on all platforms, and can be convenient if + you want to write your code to emit ANSI escape sequences unconditionally, and + let Colorama decide whether they should actually be output. But note that + Colorama's heuristic is not particularly clever. + +- ``init`` also accepts explicit keyword args to enable/disable various + functionality – see below. + +To stop using Colorama before your program exits, simply call ``deinit()``. +This will restore ``stdout`` and ``stderr`` to their original values, so that +Colorama is disabled. To resume using Colorama again, call ``reinit()``; it is +cheaper than calling ``init()`` again (but does the same thing). + +Most users should depend on ``colorama >= 0.4.6``, and use +``just_fix_windows_console``. The old ``init`` interface will be supported +indefinitely for backwards compatibility, but we don't plan to fix any issues +with it, also for backwards compatibility. + +Colored Output +.............. + +Cross-platform printing of colored text can then be done using Colorama's +constant shorthand for ANSI escape sequences. These are deliberately +rudimentary, see below. + +.. code-block:: python + + from colorama import Fore, Back, Style + print(Fore.RED + 'some red text') + print(Back.GREEN + 'and with a green background') + print(Style.DIM + 'and in dim text') + print(Style.RESET_ALL) + print('back to normal now') + +...or simply by manually printing ANSI sequences from your own code: + +.. code-block:: python + + print('\033[31m' + 'some red text') + print('\033[39m') # and reset to default color + +...or, Colorama can be used in conjunction with existing ANSI libraries +such as the venerable `Termcolor `_ +the fabulous `Blessings `_, +or the incredible `_Rich `_. + +If you wish Colorama's Fore, Back and Style constants were more capable, +then consider using one of the above highly capable libraries to generate +colors, etc, and use Colorama just for its primary purpose: to convert +those ANSI sequences to also work on Windows: + +SIMILARLY, do not send PRs adding the generation of new ANSI types to Colorama. +We are only interested in converting ANSI codes to win32 API calls, not +shortcuts like the above to generate ANSI characters. + +.. code-block:: python + + from colorama import just_fix_windows_console + from termcolor import colored + + # use Colorama to make Termcolor work on Windows too + just_fix_windows_console() + + # then use Termcolor for all colored text output + print(colored('Hello, World!', 'green', 'on_red')) + +Available formatting constants are:: + + Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Style: DIM, NORMAL, BRIGHT, RESET_ALL + +``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will +perform this reset automatically on program exit. + +These are fairly well supported, but not part of the standard:: + + Fore: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX + Back: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX + +Cursor Positioning +.................. + +ANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for +an example of how to generate them. + +Init Keyword Args +................. + +``init()`` accepts some ``**kwargs`` to override default behaviour. + +init(autoreset=False): + If you find yourself repeatedly sending reset sequences to turn off color + changes at the end of every print, then ``init(autoreset=True)`` will + automate that: + + .. code-block:: python + + from colorama import init + init(autoreset=True) + print(Fore.RED + 'some red text') + print('automatically back to default color again') + +init(strip=None): + Pass ``True`` or ``False`` to override whether ANSI codes should be + stripped from the output. The default behaviour is to strip if on Windows + or if output is redirected (not a tty). + +init(convert=None): + Pass ``True`` or ``False`` to override whether to convert ANSI codes in the + output into win32 calls. The default behaviour is to convert if on Windows + and output is to a tty (terminal). + +init(wrap=True): + On Windows, Colorama works by replacing ``sys.stdout`` and ``sys.stderr`` + with proxy objects, which override the ``.write()`` method to do their work. + If this wrapping causes you problems, then this can be disabled by passing + ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or + ``strip`` or ``convert`` are True. + + When wrapping is disabled, colored printing on non-Windows platforms will + continue to work as normal. To do cross-platform colored output, you can + use Colorama's ``AnsiToWin32`` proxy directly: + + .. code-block:: python + + import sys + from colorama import init, AnsiToWin32 + init(wrap=False) + stream = AnsiToWin32(sys.stderr).stream + + # Python 2 + print >>stream, Fore.BLUE + 'blue text on stderr' + + # Python 3 + print(Fore.BLUE + 'blue text on stderr', file=stream) + +Recognised ANSI Sequences +......................... + +ANSI sequences generally take the form:: + + ESC [ ; ... + +Where ```` is an integer, and ```` is a single letter. Zero or +more params are passed to a ````. If no params are passed, it is +generally synonymous with passing a single zero. No spaces exist in the +sequence; they have been inserted here simply to read more easily. + +The only ANSI sequences that Colorama converts into win32 calls are:: + + ESC [ 0 m # reset all (colors and brightness) + ESC [ 1 m # bright + ESC [ 2 m # dim (looks same as normal brightness) + ESC [ 22 m # normal brightness + + # FOREGROUND: + ESC [ 30 m # black + ESC [ 31 m # red + ESC [ 32 m # green + ESC [ 33 m # yellow + ESC [ 34 m # blue + ESC [ 35 m # magenta + ESC [ 36 m # cyan + ESC [ 37 m # white + ESC [ 39 m # reset + + # BACKGROUND + ESC [ 40 m # black + ESC [ 41 m # red + ESC [ 42 m # green + ESC [ 43 m # yellow + ESC [ 44 m # blue + ESC [ 45 m # magenta + ESC [ 46 m # cyan + ESC [ 47 m # white + ESC [ 49 m # reset + + # cursor positioning + ESC [ y;x H # position cursor at x across, y down + ESC [ y;x f # position cursor at x across, y down + ESC [ n A # move cursor n lines up + ESC [ n B # move cursor n lines down + ESC [ n C # move cursor n characters forward + ESC [ n D # move cursor n characters backward + + # clear the screen + ESC [ mode J # clear the screen + + # clear the line + ESC [ mode K # clear the line + +Multiple numeric params to the ``'m'`` command can be combined into a single +sequence:: + + ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background + +All other ANSI sequences of the form ``ESC [ ; ... `` +are silently stripped from the output on Windows. + +Any other form of ANSI sequence, such as single-character codes or alternative +initial characters, are not recognised or stripped. It would be cool to add +them though. Let me know if it would be useful for you, via the Issues on +GitHub. + +Status & Known Problems +----------------------- + +I've personally only tested it on Windows XP (CMD, Console2), Ubuntu +(gnome-terminal, xterm), and OS X. + +Some valid ANSI sequences aren't recognised. + +If you're hacking on the code, see `README-hacking.md`_. ESPECIALLY, see the +explanation there of why we do not want PRs that allow Colorama to generate new +types of ANSI codes. + +See outstanding issues and wish-list: +https://github.com/tartley/colorama/issues + +If anything doesn't work for you, or doesn't do what you expected or hoped for, +I'd love to hear about it on that issues list, would be delighted by patches, +and would be happy to grant commit access to anyone who submits a working patch +or two. + +.. _README-hacking.md: README-hacking.md + +License +------- + +Copyright Jonathan Hartley & Arnon Yaari, 2013-2020. BSD 3-Clause license; see +LICENSE file. + +Professional support +-------------------- + +.. |tideliftlogo| image:: https://cdn2.hubspot.net/hubfs/4008838/website/logos/logos_for_download/Tidelift_primary-shorthand-logo.png + :alt: Tidelift + :target: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + +.. list-table:: + :widths: 10 100 + + * - |tideliftlogo| + - Professional support for colorama is available as part of the + `Tidelift Subscription`_. + Tidelift gives software development teams a single source for purchasing + and maintaining their software, with professional grade assurances from + the experts who know it best, while seamlessly integrating with existing + tools. + +.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + +Thanks +------ + +See the CHANGELOG for more thanks! + +* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5. +* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``, + providing a solution to issue #7's setuptools/distutils debate, + and other fixes. +* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``. +* Matthew McCormick for politely pointing out a longstanding crash on non-Win. +* Ben Hoyt, for a magnificent fix under 64-bit Windows. +* Jesse at Empty Square for submitting a fix for examples in the README. +* User 'jamessp', an observant documentation fix for cursor positioning. +* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7 + fix. +* Julien Stuyck, for wisely suggesting Python3 compatible updates to README. +* Daniel Griffith for multiple fabulous patches. +* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty + output. +* Roger Binns, for many suggestions, valuable feedback, & bug reports. +* Tim Golden for thought and much appreciated feedback on the initial idea. +* User 'Zearin' for updates to the README file. +* John Szakmeister for adding support for light colors +* Charles Merriam for adding documentation to demos +* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes +* Florian Bruhin for a fix when stdout or stderr are None +* Thomas Weininger for fixing ValueError on Windows +* Remi Rampin for better Github integration and fixes to the README file +* Simeon Visser for closing a file handle using 'with' and updating classifiers + to include Python 3.3 and 3.4 +* Andy Neff for fixing RESET of LIGHT_EX colors. +* Jonathan Hartley for the initial idea and implementation. diff --git a/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD new file mode 100644 index 00000000..1e4031eb --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD @@ -0,0 +1,31 @@ +colorama-0.4.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +colorama-0.4.6.dist-info/METADATA,sha256=e67SnrUMOym9sz_4TjF3vxvAV4T3aF7NyqRHHH3YEMw,17158 +colorama-0.4.6.dist-info/RECORD,, +colorama-0.4.6.dist-info/WHEEL,sha256=cdcF4Fbd0FPtw2EMIOwH-3rSOTUdTCeOSXRMD1iLUb8,105 +colorama-0.4.6.dist-info/licenses/LICENSE.txt,sha256=ysNcAmhuXQSlpxQL-zs25zrtSWZW6JEQLkKIhteTAxg,1491 +colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 +colorama/__pycache__/__init__.cpython-39.pyc,, +colorama/__pycache__/ansi.cpython-39.pyc,, +colorama/__pycache__/ansitowin32.cpython-39.pyc,, +colorama/__pycache__/initialise.cpython-39.pyc,, +colorama/__pycache__/win32.cpython-39.pyc,, +colorama/__pycache__/winterm.cpython-39.pyc,, +colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 +colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128 +colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325 +colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75 +colorama/tests/__pycache__/__init__.cpython-39.pyc,, +colorama/tests/__pycache__/ansi_test.cpython-39.pyc,, +colorama/tests/__pycache__/ansitowin32_test.cpython-39.pyc,, +colorama/tests/__pycache__/initialise_test.cpython-39.pyc,, +colorama/tests/__pycache__/isatty_test.cpython-39.pyc,, +colorama/tests/__pycache__/utils.cpython-39.pyc,, +colorama/tests/__pycache__/winterm_test.cpython-39.pyc,, +colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839 +colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678 +colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741 +colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866 +colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079 +colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709 +colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181 +colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL new file mode 100644 index 00000000..d79189fd --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.11.1 +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any diff --git a/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt new file mode 100644 index 00000000..3105888e --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2010 Jonathan Hartley +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holders, nor those of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/__init__.py b/Meliora/gmapenv/Lib/site-packages/colorama/__init__.py new file mode 100644 index 00000000..383101cd --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama/__init__.py @@ -0,0 +1,7 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text, just_fix_windows_console +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.6' + diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ddc11e4510d337efd8440969eb675fc05a839cf GIT binary patch literal 466 zcmYk2OG^VW5P)~L+3j0A_TZt{Jy@j`1rbpz+Jkse5yL`=-PlI+Sd#6_f8^irXXGS! z@-KKYV-Xz4H<_7aUbNkA1YX`h4p<`$f=@91OXQ6cf9%L35Ask1GQ^>ba3m|ZA`wP1 z#&HO-NF=g~tFne`vX1MrfqhEvuZX5>;g-K6+|J{hAWgn}tsspZ;)<6p$=O<)wQi5K z(1uD%O13Or=XqvJ^2C>9!BwsomW;KsTCfy3bfFD%=!}kETzpfm1arx7W~?@8=$fa> z@>_k+)u8_x@Ame3``77)Yd|qh1-Hz=e5L|GfEbW?I7IzlQw6&Qr~_bEt_hJ+`(6fp z)BN=iGH1qetq6Gw%qBbqd_N2ivpZkKX44`&*9#>y&24rmX<@q~-!m(Z(3A5SXHg*Vs&I#!iD_1*`I-d!43=>#rc`NLMt>_2l5rHuP literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/ansi.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/ansi.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e47a59b92978584a772165e408975e8b22b9272 GIT binary patch literal 3216 zcmc&$+iu%N5ap7TL{V2Oj@=|htKQJ4ZDceBS|BL`>lWLMA{&woH;hu2(QYIrx@Acx zjo|lT%gM>rEqoscXPYvdilYK?)6!|%Z7|QKJ)UWMr$MA={el#_>AW}BMOWDC_m=z z(07MjSm}?rTmt^U9XfrlXto%;mGAlf_}0n_8x~)>&)hMiu2UTG?g~;XDA#6Q#~Cvl zg_`^7wTCbsy(6&>0iR7ToNF*DFuW{)ulVFZnUH00>9PWcR~v#14ppI5S{p+1d|n_z zN12BTkHHJ?b}F~pJ09a+yEkrEM=yu{kwd-q+Q1om`E{rB%<+4pAy_gPx4W>&hA-N6 z_i@{EeRgAv{4Vp_(okpMtT;o@EskG_6zZ`3k&W*0l6XE9Kp`9wLOEpw@@9;{!yhQi zV9b#b`|8cx1+ZeXRS{abRtGC0zU%jyG$I58WQe%Od|PrdKu&e0U>=~3Q;PrHdp~j9 za|mvO_@C03?DUz#ZLh-_8|G$I;`{>I?n!MNV>xe{8LH~LLw0#a(IP5>apFQ-S7CU_ zWeQZ60@VdI1{I}I4H82a@e;(U0ycRk&WYAWVN~$-?*V)W#e`IqN7rAI1M-$o@(1w@ zUp-I`$V7du`WnuB{Xm_NiAI#?2AyV}U5E&cx?Gr^?{MFH>H0kp>oVW*eJ)}UE1bxb zC}=|WSpSL8ht7bB$P1^xcgov_ZM#F)x9zKVI1IR=Cy5F7e(uYUD!#@HsGtS1c;3%7;o3Fr-X=D&dpK>+&YZW)$0XTMbib6AkR;AIj zY-j`;T1K`s0xc~|4H}m%ZGoCJfh~O1|WN41doy?Vc zDNIC(2gSdn;@^|J*{nRwr+s9X;jlQjs{kvK=^0CKKr3c zUbw;FAHzPLNB9H*!^hF19F63tgx^Gvb@Co$#e52k&tZ7@17HwS4R4O?9T+Dr%O45XtqDd=FQ&xtitt`#J=Q?ZU z=z?{L=Af1?2?Kp_cf?tM6&|2nK^_6^3h+n)`Xs;u2bjJA+8S604-wi3j}U%Aun~Sm zZ~z*Ii*v3Lk#Zg4EwpB>Dk5vmTCE|X4{G)L=C07o^_`lC-7l@x8rvnIS00oaBC@-_ zv0W39X027*7ODEi+WNK>Vb^{Z2}yz|Bto7PiDX*xLeWSkk6zuWA(fHTk*fD>REbn5 zOR5I)%rJfj_I(S(Lnj$TpTD(}D;)R#KjAIIA4qT=)CZWN!B+^Fr@=P}n5;n&VFdwA z3Mc|Yc!JPH=pncWPZ6F0Gnbpi0J6?Q`Yh2$5ZwJnJpZhBBcu*OB4zO wA}J!$N)fHdhJDsKh4Ewf8NZ`~1TPPuM`Su`2Hd7*>e)m#m0f~68YOuD158A5XaE2J literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b7c35a5b3e6fbff3ec128542097bcde232c4d28 GIT binary patch literal 8294 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/initialise.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/initialise.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2398196e303979bbe7b28cd9f318d582b73aa9e0 GIT binary patch literal 2267 zcma)7UvC^W5VyU5Zf`HSrlCzrDb=YG6^F_nwGtpiE2={11Ii1b6~{>@_v|E_?(Lpz zU$3c-7m^2F;4`EWFZ~*PjD14lsb2vJmEU-C`Bzn9S039lV|zUFo3UJ6Oc}mE|N2b- zyTI7rG&%W&n0$q1pMWT)c+Prt&wJd@MNcT9f;>UurBsJJ61zMoE4AG)zZ5JOjT=JZA_K+3JA#=^$ z&pFQH>_=9JPp}H-iuJW_TD3}(Z4Inb<-{FNv@unCYUFsV)m(UTPV$y?`f26{sw{MM zaWi`g)oE6!a%u;|van^YtGL#w(n(?TR%V?xRnusz-9YAf)xPVT$sSFd{>GTnykMq{ zdwKHDPxrp)|6sMT{q1r8>vCG;rBt^6?MRMo=e`_1mTtQ&I>T}_?r(vqizof>vPXTJ zIsM_7==jw`~@!DeX&PFrW2z3kYG&G<}g1$*3Fc3i=LU$_%H zfeb+-8Pgc%G4m-v(H*C`p{~6t@w;qB%3a^`>u7c;1&sN zO32hhD_DPagV1w(P3Bf3M#W~H4V~>wGq>H5#cro`+uC%b*}A=9CVHdWt^%;D^nuJL zH5jVE?%FD@k?Gy#CqSNwa92Y&uUd2pqGz-mnFg^bLkuN-mCO<6eb)`ErkuFagRg49 zq$k?AD#F@qT!pmHG58Dxp$Z8z?_p%Gf-tenlPKn~NO>HzUnTQC40+1UyU=(uC_0cH zf}%~J7zjr(;O2@8Fbm0R<~)?TQH=}&pSeiHUv`B?N4aqflqy!5th@`krK=NGV!{iV ze99gI=n+~9OdQ(*Ivxk6O{Y6yR($X6vezAKf_)!&UIg73U1lK<$MMq6#JT|r)YtCn!N!+8J8jF{@}kO2c9h{_5kVrkWwFgk<@)%bn6%kj}{-I zuBbv}0f7E^O8r^e7v}{Gh3Tmq(3w8Ws6>J%!Vo-9nTI($szn`4{x9qZ8$Jp(?0ho4 z8Ft3QZX0V(!|pmbLxSx5qiv61N77knuFZ?o3~v_T6wRUo{+yX>vuH;Uxcuv6I?z5W zmsQJdmy;Y14Dyuf0401kHt$2_44BLn@TvwWjsb?#STL&)`p6NV`H;u2VnIpcW!-RX zeI4bfE+Hw(1o=JB9@PMCNj%Q3^f<2TI6Ve+9j6N5W9l(ewGY>hWPz8+_(&OYfIsJi oUEV?u)a1)isV2F;Ljm-_OpwZnSO}8UBucL&jbs(YCPAP62d^U8cK`qY literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/win32.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/win32.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c9fd1540130f5d0c4b9bfe5812d866380c4ba88 GIT binary patch literal 4449 zcmai1TT>g!6`r0MjRtY|1!H{EVw+et%Q|+FO>McH#ei+9WZ@uevQwm{26YQ0OB%Lk zWEM(($l~WzDtS&7e%kWBv z^Bjyi7|nWFW~>^mY1TC_nX@c@z9JKclrU$;bFPj9lU4{5(cJ z=M($_>Z|-Bzl3^*U*=a(-{5)v8S0zdE*pibwSOHP9Mt{^^3H~(yhAZc1*QgzwRIWD zonjbpAu-@?*IMz;mWV1eibTFjJzn{;2we~C$GFsc* zTAL5ITMg_StvzZ6TT%XTP-8(Z|JIcM+2%76WxIcoU{()jha*F>irOeP=Env3W(p_>Jy~!vw`aue|%B=55 zQB{5AShg#1TMFe={K{q^Rrcx9VrgYz`Ph+IWYA_`qeS;XgaOwxJQFTxaZ}h;lUthF zB2#zJ%b?Dpc4%}XmXj{5%)v0Zx;A)y?HFY)Z1I_7q zxw={HAA`jd%+l`Ujq7~+fBqE;{gPCo*f)y(MxH`bo+fgJ2CbEFOW8$Hjg|8tjN`DW zGRw7%%~+lV8y0LwqES7vNJ(l|S>FeCzMn@Y8Uitx$p-MV**F_`zdLy{>NDxm5|rcm zek*7S-&Z-`Z-%_xp!R_8f7=ckDF;XKu!7;t+|ttWyd-x~_9~hxSAH^EEc(j}b1T@Y zS`!T(`SKDb^vHW;n`G+eP$Fu$%r+h7Fc&}Py`7abcuZ{;2Iw%Ywu@-Q#-8zt#ZX&p zcGw=yVY zIh#R?H-xe)(Rxi~qjsetqNqoDjrM>K^9;6XJ`68zV11+$7^F9udtjUL7REmEBXU$N z`(-p@7#%lX8!?L^FQ~Q0s^+|bTR{4PRXTQcKHzHgp?%diDf{?LkIFMTF0(Q+U;sMj}9&fL`cWb zv`Jb{^b1Wx&xaSbs+LpKB9%hsKDdMkntqMT8#G)Xa+8Rb??}jrlg;BLrbo0N z$=ucN&(W`tQVu^-4i&9m^5|4@6V^$#*_GAQvZ`^v+_lIR@m<^vWCct949is}Kxm5+ zxj&Hh+zCrxVVzE1B&z%+dMg!@>F}d%y6Doq$b5be59+WwvoSZ}@$)+X60!h%ypAw;PDDfUN%CQkPVgl=5VZ1`n9)6UGsc3U}fJSN# zHq3$Tn{N`Mw)X9g`G!%@+P67FD-&lrc85&Hik%MLuzQ(TsOwpsTQqD1H?ejK^2!m& zl6ctA*(x)ygYZTFVXe_fquo+F-fG8l$nQZV7IHR;cA1w!qb&;A1TkBuf2Sc@8}X*f zL~$TvjgIPXwVVF7ti`ctecEwOKI%^pDWVuo);Pd&EN7ZqB{lkK9Gi`~llVw7J3L66mpmDHL_X58XC4_SqXs;CN*rtfvXQV@8v)y`Onwd{2SN zITS3bjXVK)xF?@KA^WEQjfbp$*ee&$z6B{mDd~=Htpr*d&l&MaBOW@6{!9hI??;LjM}e%S&?$?b zk<^EhDwG45=8Hw;AVc#;BZ(nHU02Zvs{Y01Rw&~HPD&{{X=}XYAayAW$zi>ppS%Zk zJSWFj?h7GXqH*_*8t8pDBz~j4#SP>}qBQ66Y-zr@pt2HAD*S(zA+!mNnB%5nj+}B$`@peW6E$=G r^x_f9sQbG+Z(#qF+0cX3>MAnV$>Q*I7F%gz25&6Mqe literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/winterm.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/__pycache__/winterm.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a16464bd16429a5411dd2f456bf704cbedf52f3 GIT binary patch literal 5252 zcmcgwOLH5?5uVu>77v0TMVpMI$dqhLhGNSu=OIUN9FibJu|k3hKv^Qfsx1(+6aj+( zGrJH?7MP?WUF}=$;!!!|ke`ra4*3CdNTn(#{skXW`FeH%5D?{KfSTT(*KR+)?&;my z#6*hW_xFF__5XE+vHwu#{Le*a0WAnYj&p(u-eUW_$~k+?+LtZn8%MV}qrWhO`GQsX z7Hb=yFkuP1W$s&5i?bCb9FcgzM8db9n^gyWS0vF->V5+Klt`nW)_qrG#02h?6xj;P zPoCk)EYH=%Q$O@N!R}tIEn0q^({TJF-asp$1sRYKaz5vO;)3B0M(Oy{=3XP1Zv^dI z;rwBvEjow6b=)$sQ7KBu)W+lY_~c!5p1vQ*A9aD z2etZFwQ#S~p09WI54N9T&~HE6UTf@Z2aVAG=z!**`oVU+)9T3De(hsCF7)O8or5Du zBGMxQVi?!`Gm;(8x3TWWpVn#O{EucA(1H&^d{|eosv&sQ6h_q&X4Mu})e&|zA)Kl! z60n(DO^GD5PAT_sqg@~|B;7?OK+fpNXC@Jg2uXA15TV&pKCN8OYuEOD&r>PS+wX{O zi};M^{jOVU#WVKO+G63?%34}`R8;m#xmYYItFX0LQf9fhtP<;sE5*|0qH?y1Yik>i zm4zi++PLQkJyj+_$X`JY#O2n=U(deTB6HYsu|=T0t+lU&M=f7#e?~w)`y)sx??`%@ zoFXy}qMXu3d3|wBIZNf$l?R(@D!O`0&~l}`@u;+XPHr-p)WRcP*eqH=y-0XTW3P!! z_Fg~>z6BYIEDV6$6sE9nMYsqDS6j^M;NWoUb&(dC7aY#LAtpo?oGacHlOhK$Dc%!P zVj5gZToN%RR^YdG z&pDdBO5xCGH$u<5Mus4$GM?iZ?$X~r&c(L7(_i*xBVNT;7={`bdy2pDwG@2%wwFLBH-qxNpOL7vsB-sL?G?bN~FW(_DPlQCz8}egZl>MyM z>iT2i%bS=Y-E{mgp5j?P6n^04(wn7!51WBQG9-_2NCt&I-vE^Yyl2KTQ-;-+iePBz zhs*a#xHLVg9)VHYx-WII(*|gSFXfozDk*&}U#s=$Q2xw_{DT$u>y&BxKjH`0Uqc5r zXI&<XV;At_iN5jm#u4!dW7G<0!6zUw#&Q%Z zr$AZAo5qO=l+A-PPt1_Nw0dTbpBji7!Vxd!ZAsA9*;>8}PN(H!xvXX@gVeq0e;p2T zbPOr^6WT_$R!&r@joX~muAs%)lrpJO%$cG)&Z;eh{@h6IJ8o>o*_%B@`ox~nXC_WtuDx`X&Ruwky)@5zN&XTWV0Enw zxk%DEt>%XQ8P%-spk-RBgJFR&1+;*oO=||k$(+`VY6-K4O5()s*-iKgN286*#%I~CapGW&)3bVx!0Ggj86h-p zmhK~^J2lbl24OxiW&~NpQzSi4((~kf5G>MX5&v58qjUO`In-2iBVP=39=FRxJ+eu( za37mui$vB)@fm*nR^K8cYxRjU;&!Tf$=KQ;{{*8ALID{WBz83nV)d-11yc}pW*7|A z?(JM*@h<*DB5Yp1yW+%Va3hZ*T27D1@46v zqo{Fu_G_q#$8ei2)9$Ne|biv&1M(4d-VIp*QjiZC; z%hnd&i7E`=w2&CdqMP|-?JX{?f)M+biNk;+uYuFxe(gz=$) z$+l|7Z`XG4wdNUW64|NyLC|PF{TpVqu^FG{mSF(KDIDLp{@1co;8RA9%Q{w-@Wsg4 z51!R!tU`Kq|DYp7{cIIgg39UaH2r$0zs%@w9okQN|3&^*?&r}bq%SBWf@u&#zdmQJ OjG0U4?A#yN?Ee7f%Qeyf literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/ansi.py b/Meliora/gmapenv/Lib/site-packages/colorama/ansi.py new file mode 100644 index 00000000..11ec695f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\a' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/ansitowin32.py b/Meliora/gmapenv/Lib/site-packages/colorama/ansitowin32.py new file mode 100644 index 00000000..abf209e6 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama/ansitowin32.py @@ -0,0 +1,277 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL +from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def __setstate__(self, state): + self.__dict__ = state + + def __getstate__(self): + return self.__dict__ + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + # AttributeError in the case that the stream doesn't support being closed + # ValueError for the case that the stream has already been detached when atexit runs + except (AttributeError, ValueError): + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + try: + fd = wrapped.fileno() + except Exception: + fd = -1 + system_has_native_ansi = not on_windows or enable_vt_processing(fd) + have_tty = not self.stream.closed and self.stream.isatty() + need_conversion = conversion_supported and not system_has_native_ansi + + # should we strip ANSI sequences from our output? + if strip is None: + strip = need_conversion or not have_tty + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = need_conversion and have_tty + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command == BEL: + if paramstring.count(";") == 1: + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text + + + def flush(self): + self.wrapped.flush() diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/initialise.py b/Meliora/gmapenv/Lib/site-packages/colorama/initialise.py new file mode 100644 index 00000000..d5fd4b71 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama/initialise.py @@ -0,0 +1,121 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +def _wipe_internal_state_for_tests(): + global orig_stdout, orig_stderr + orig_stdout = None + orig_stderr = None + + global wrapped_stdout, wrapped_stderr + wrapped_stdout = None + wrapped_stderr = None + + global atexit_done + atexit_done = False + + global fixed_windows_console + fixed_windows_console = False + + try: + # no-op if it wasn't registered + atexit.unregister(reset_all) + except AttributeError: + # python 2: no atexit.unregister. Oh well, we did our best. + pass + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +def just_fix_windows_console(): + global fixed_windows_console + + if sys.platform != "win32": + return + if fixed_windows_console: + return + if wrapped_stdout is not None or wrapped_stderr is not None: + # Someone already ran init() and it did stuff, so we won't second-guess them + return + + # On newer versions of Windows, AnsiToWin32.__init__ will implicitly enable the + # native ANSI support in the console as a side-effect. We only need to actually + # replace sys.stdout/stderr if we're in the old-style conversion mode. + new_stdout = AnsiToWin32(sys.stdout, convert=None, strip=None, autoreset=False) + if new_stdout.convert: + sys.stdout = new_stdout + new_stderr = AnsiToWin32(sys.stderr, convert=None, strip=None, autoreset=False) + if new_stderr.convert: + sys.stderr = new_stderr + + fixed_windows_console = True + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream + + +# Use this for initial setup as well, to reduce code duplication +_wipe_internal_state_for_tests() diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/tests/__init__.py b/Meliora/gmapenv/Lib/site-packages/colorama/tests/__init__.py new file mode 100644 index 00000000..8c5661e9 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/colorama/tests/__init__.py @@ -0,0 +1 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65caef365e37df8b39ccd132f5952e5a825f8357 GIT binary patch literal 186 zcmYe~<>g`kf?=bf92rURjJ!W>QRXW=X1U z0Z2YQwKyg@KPSH^F*i}aB(=DtSU)~KGcU6wK3=b&@)n0pZhlH>PO2Tq;?F?L001w9 BGQa=; literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f6d08de78570689b3c85706106186ac8fe1f76c GIT binary patch literal 2546 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 b=B(X_d=6mC58>z+8*fh)rha79(&qmH@Muh} literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e5db01c32982b8c86a6fb6319a0324791f9a3e2 GIT binary patch literal 7078 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..375a33114f092d63df386ad4686f16f4c8682b98 GIT binary patch literal 1654 zcmcIk&2G~`5Z+xoiIXO2P%DrCp~5XfwDeR7m8#G}iv%em0aVM9UFxkZ>4c?sqvGcO6s9bP^m zW9mA9D}2u2GTbk$m)? zhX`?H;qym#KB4?RHjx2Ss1D1{!kY~6=d14j8rfrLccW5STE^^t zqB(BEhi^5RW~tIPX0yrU71*KeREE8o>yfxFrV7_I@LV(yR;2jI1;FPhSm;C}h*}1f zQvl75Sx&@gHcMy3fD~BTM9#yOrll=4RJy1#o(?ke7E(?uL|EQ>4oUi_?z0K3xk$Vs zML!CZLq?dgDf!b7Zh+-Kgdp)R#nR1L=4A{RNcz4+G8efnOu1rkVG=|@`Zlb) zjPxxe4RSW{@5b^nd6xhjov6ZO~P0c32W`;cde+wkSy& zt3++w2P;1NmwCNeZ+^!^I05>J)zWlT*I({$?LK<-!r$F%cb;rF3lhslm!M08GEGd? zN=&-MAez)IC28VAN4S`eQh(Sz3}k#4mMPQPSp{ltkv^vK4sNaL%4z?M!UKs_r&*Xv zEJ2ffbFumL^GmT<|J-cOn7PyRKU3|_dfsj}@JMwXRFzh#LmjJOH*7{LMUZkXzX259 BJY@g? literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b6afb7cae8c0503d577dcb046f1f6670c305f7d GIT binary patch literal 3321 zcmcImTW=dh6rR~#uXlY(+|)@+K_V(VU@k4RKm{r&7eX2-O;O^ibY*F^^-L1GdvRyh z4YAUvR6HQ@#t%py^Ug2eXUr24PyP!$6waBooit9`zI3hmc4y9+@tp5mW`c6LK;Zf7 z?_2!Y1R?)m=j7u+XAYYD4S*3wL*n7v2x(+^Mr3+sWO)`Py()~FVJ@;gJIZ@`N*<8- zsztc7yG{xIwA?+GKP0j7Ibjydg@vf-6{C_@ippM@l4ZhdmVZuIo*Vn7H^C>F^Vkr- za&sTop&O*;_F+F{t!65x&Skn7NUp3XXvL}^AGbR9cC;Qa1c#hlc z{DH%)L&|ddMz(#BxC2dxxmvR@rdeP`Eh&ykO029Ur7_6_o79r>VD$>Sp!*Yp{uH~Y z`;)8+R86bmz&K>8H`7GZgDAMR(~46t8Q(W=G?AR)gGOUpgeLC*q-38wGZ@`7d}w>L zZTMzt!I-&64sv^D+h)e0LCK((XXc3>(gHF@U^BV3egf~eu2tcrn@T%=1+x!cvhG<7VPYXUdjuK?7F+KZwJ-(nhJ2H_%ra<_Qu2jC+q zFj$oRaA|e*-UF4tJHNcNR-YHH9$i>pS-w+0GQ?$^`3?g5GJ|(frGy+pRH45mD#)t< zK)R;grWM1XQ_w7QzzfUDzN#;JmrpxlxXAfg(}RW2&l;5MnSPELfRH?p&I)9imunZ9jeX5+eyv}F9rXW$r;jWP%s7FORJPB}xl5N_y+FwFd7H{p{raS3OiMfE!B&xhf4P>`rFifE3 zf9kb-7KPXmA0c2oDhrE=wpo0PgC8KAGFT_`kD#{zLRkVpW5G--m8=JZ*rT+CEI5L;5&8}%RV-LH%HVaI1??u4dhv=Cm1Bxb=Vcc}weizTx1 zqIYGCr{jsIFBBuPeuBl`ge<&NF!T2;k6%aFAT;VVs@x=o1D|mrUO}Ju3U+bKo%kBN zw*WLlOY7_BGc@xuL-*nh{bvFuk1;~Q|?OTbiyEoG8Mu7Hw{E8cUtMT_z;yoLBJ9$zCidA;Twe82*+hi zf8jYPiU4J3au&dWGFEUav@i|tDR>u#4f+!{)!MjkynXwAts>@NmgjWgVuM5pj00gJ z;C8+8P;d>eUfD^67OCP&)Jfn1CqyDV3xz5VA&%EFeeUaHKC92TLGc~J8QWLR?TonZ Y@t-B0Z4Rv(2CdQ(oiVCrrR&iD0T3> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) + + +def enable_vt_processing(fd): + if win32.windll is None or not win32.winapi_test(): + return False + + try: + handle = get_osfhandle(fd) + mode = win32.GetConsoleMode(handle) + win32.SetConsoleMode( + handle, + mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING, + ) + + mode = win32.GetConsoleMode(handle) + if mode & win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING: + return True + # Can get TypeError in testsuite where 'fd' is a Mock() + except (OSError, TypeError): + return False diff --git a/Meliora/gmapenv/Lib/site-packages/distutils-precedence.pth b/Meliora/gmapenv/Lib/site-packages/distutils-precedence.pth new file mode 100644 index 00000000..6de4198f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/distutils-precedence.pth @@ -0,0 +1 @@ +import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'stdlib') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/LICENSE.rst b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/LICENSE.rst new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/METADATA new file mode 100644 index 00000000..b802e937 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/METADATA @@ -0,0 +1,116 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 3.0.0 +Summary: A simple framework for building complex web applications. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Dist: Werkzeug>=3.0.0 +Requires-Dist: Jinja2>=3.1.2 +Requires-Dist: itsdangerous>=2.1.2 +Requires-Dist: click>=8.1.3 +Requires-Dist: blinker>=1.6.2 +Requires-Dist: importlib-metadata>=3.6.0; python_version < '3.10' +Requires-Dist: asgiref>=3.2 ; extra == "async" +Requires-Dist: python-dotenv ; extra == "dotenv" +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/ +Project-URL: Source Code, https://github.com/pallets/flask/ +Provides-Extra: async +Provides-Extra: dotenv + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + +.. _WSGI: https://wsgi.readthedocs.io/ +.. _Werkzeug: https://werkzeug.palletsprojects.com/ +.. _Jinja: https://jinja.palletsprojects.com/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + # save this as app.py + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask.palletsprojects.com/ +- Changes: https://flask.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask/ +- Source Code: https://github.com/pallets/flask/ +- Issue Tracker: https://github.com/pallets/flask/issues/ +- Chat: https://discord.gg/pallets + diff --git a/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/RECORD new file mode 100644 index 00000000..81785ba1 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/RECORD @@ -0,0 +1,58 @@ +../../Scripts/flask.exe,sha256=dVrtcuiEZ3Mpfj8hjJxQOeoy84Ddhb1x0W-ur3pEJsI,106369 +flask-3.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask-3.0.0.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +flask-3.0.0.dist-info/METADATA,sha256=02XP69VTiwn5blcRgHcyuSQ2cLTuJFV8FXw2x4QnxKo,3588 +flask-3.0.0.dist-info/RECORD,, +flask-3.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask-3.0.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +flask-3.0.0.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 +flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-39.pyc,, +flask/__pycache__/__main__.cpython-39.pyc,, +flask/__pycache__/app.cpython-39.pyc,, +flask/__pycache__/blueprints.cpython-39.pyc,, +flask/__pycache__/cli.cpython-39.pyc,, +flask/__pycache__/config.cpython-39.pyc,, +flask/__pycache__/ctx.cpython-39.pyc,, +flask/__pycache__/debughelpers.cpython-39.pyc,, +flask/__pycache__/globals.cpython-39.pyc,, +flask/__pycache__/helpers.cpython-39.pyc,, +flask/__pycache__/logging.cpython-39.pyc,, +flask/__pycache__/sessions.cpython-39.pyc,, +flask/__pycache__/signals.cpython-39.pyc,, +flask/__pycache__/templating.cpython-39.pyc,, +flask/__pycache__/testing.cpython-39.pyc,, +flask/__pycache__/typing.cpython-39.pyc,, +flask/__pycache__/views.cpython-39.pyc,, +flask/__pycache__/wrappers.cpython-39.pyc,, +flask/app.py,sha256=voUkc9xk9B039AhVrU21GDpsQ6wqrr-NobqLx8fURfQ,59201 +flask/blueprints.py,sha256=zO8bLO9Xy1aVD92bDmzihutjVEXf8xdDaVfiy7c--Ck,3129 +flask/cli.py,sha256=PDwZCfPagi5GUzb-D6dEN7y20gWiVAg3ejRnxBKNHPA,33821 +flask/config.py,sha256=YZSZ-xpFj1iW1B1Kj1iDhpc5s7pHncloiRLqXhsU7Hs,12856 +flask/ctx.py,sha256=x2kGzUXtPzVyi2YSKrU_PV1AvtxTmh2iRdriJRTSPGM,14841 +flask/debughelpers.py,sha256=WKzD2FNTSimNSwCJVLr9_fFo1f2VlTWB5EZ6lmR5bwE,5548 +flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 +flask/helpers.py,sha256=ynEoMB7fdF5Y1P-ngxMjZDZWfrJ4St-9OGZZsTcUwx8,22992 +flask/json/__init__.py,sha256=pdtpoK2b0b1u7Sxbx3feM7VWhsI20l1yGAvbYWxaxvc,5572 +flask/json/__pycache__/__init__.cpython-39.pyc,, +flask/json/__pycache__/provider.cpython-39.pyc,, +flask/json/__pycache__/tag.cpython-39.pyc,, +flask/json/provider.py,sha256=VBKSK75t3OsTvZ3N10B3Fsu7-NdpfrGYcl41goQJ3q8,7640 +flask/json/tag.py,sha256=ihb7QWrNEr0YC3KD4TolZbftgSPCuLk7FAvK49huYC0,8871 +flask/logging.py,sha256=VcdJgW4Axm5l_-7vXLQjRTL0eckaMks7Ya_HaoDm0wg,2330 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 +flask/sansio/__pycache__/app.cpython-39.pyc,, +flask/sansio/__pycache__/blueprints.cpython-39.pyc,, +flask/sansio/__pycache__/scaffold.cpython-39.pyc,, +flask/sansio/app.py,sha256=nZWCFMOW8qK95Ck9UvDzxvswQr-coLJhIFaa_OVobCc,37977 +flask/sansio/blueprints.py,sha256=caskVI1Zf3mM5msevK5-tWy3VqX_A8mlB0KGNyRx5_0,24319 +flask/sansio/scaffold.py,sha256=-Cus0cVS4PmLof4qLvfjSQzk4AKsLqPR6LBpv6ALw3Y,30580 +flask/sessions.py,sha256=rFH2QKXG24dEazkKGxAHqUpAUh_30hDHrddhVYgAcY0,14169 +flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 +flask/templating.py,sha256=EtL8CE5z2aefdR1I-TWYVNg0cSuXBqz_lvOGKeggktk,7538 +flask/testing.py,sha256=h7AinggrMgGzKlDN66VfB0JjWW4Z1U_OD6FyjqBNiYM,10017 +flask/typing.py,sha256=2pGlhSaZqJVJOoh-QdH-20QVzl2r-zLXyP8otXfCCs4,3156 +flask/views.py,sha256=V5hOGZLx0Bn99QGcM6mh5x_uM-MypVT0-RysEFU84jc,6789 +flask/wrappers.py,sha256=PhMp3teK3SnEmIdog59cO_DHiZ9Btn0qI1EifrTdwP8,5709 diff --git a/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/REQUESTED b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/WHEEL new file mode 100644 index 00000000..3b5e64b5 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/entry_points.txt b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/entry_points.txt new file mode 100644 index 00000000..eec6733e --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask-3.0.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask=flask.cli:main + diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__init__.py b/Meliora/gmapenv/Lib/site-packages/flask/__init__.py new file mode 100644 index 00000000..e86eb43e --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/__init__.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +import typing as t + +from . import json as json +from .app import Flask as Flask +from .blueprints import Blueprint as Blueprint +from .config import Config as Config +from .ctx import after_this_request as after_this_request +from .ctx import copy_current_request_context as copy_current_request_context +from .ctx import has_app_context as has_app_context +from .ctx import has_request_context as has_request_context +from .globals import current_app as current_app +from .globals import g as g +from .globals import request as request +from .globals import session as session +from .helpers import abort as abort +from .helpers import flash as flash +from .helpers import get_flashed_messages as get_flashed_messages +from .helpers import get_template_attribute as get_template_attribute +from .helpers import make_response as make_response +from .helpers import redirect as redirect +from .helpers import send_file as send_file +from .helpers import send_from_directory as send_from_directory +from .helpers import stream_with_context as stream_with_context +from .helpers import url_for as url_for +from .json import jsonify as jsonify +from .signals import appcontext_popped as appcontext_popped +from .signals import appcontext_pushed as appcontext_pushed +from .signals import appcontext_tearing_down as appcontext_tearing_down +from .signals import before_render_template as before_render_template +from .signals import got_request_exception as got_request_exception +from .signals import message_flashed as message_flashed +from .signals import request_finished as request_finished +from .signals import request_started as request_started +from .signals import request_tearing_down as request_tearing_down +from .signals import template_rendered as template_rendered +from .templating import render_template as render_template +from .templating import render_template_string as render_template_string +from .templating import stream_template as stream_template +from .templating import stream_template_string as stream_template_string +from .wrappers import Request as Request +from .wrappers import Response as Response + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Flask 3.1. Use feature detection or" + " 'importlib.metadata.version(\"flask\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("flask") + + raise AttributeError(name) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__main__.py b/Meliora/gmapenv/Lib/site-packages/flask/__main__.py new file mode 100644 index 00000000..4e28416e --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/__main__.py @@ -0,0 +1,3 @@ +from .cli import main + +main() diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..832ac6bf23f191712e19525b2b3ed3452a765988 GIT binary patch literal 2282 zcmb`INpBlB7=~v?%gC#|@5^|V zr+~%-%d*u!wq=D@XbUU0nQaq0!eNE55Eex-F0m54LRb>z*k!KavZ%x(Y{alDM&mIy zX1F58;|VrlcmzDjCJm2*tE_5x3_QiA43CTHc!tdwo&e9XS;LdyIW}jw3Z7^4hNr|r zyvP;}PlK1(lHnQfGFvu03tnL>hUdVmY}N2Qc#W+YUI4GNb;FC`4Ypx;3B1WR4KIT| z<{4fQrFe^N8D16J@ebQDyawK7yN1`ndu-3}26&(C8{P!hSk15pK41rix4?B)H@po# zWQT@#z&F?p!@J-kc4T-@+>9HnVR#>W%#ID$z_-{f!w2Bo?6%>$xD(%HcMTtc@3DK} z8{tuS^Jgb)gvUP=**l^0)T-ZlMRifP^RXaFQXS|hP1NI8C<`)+&s3V=S^882>J%{Y zvFP(mMu|qFe3B-es0*42I+{yg_afy>{%xNt>R)T8*@fTkOUV;G^!;|4X#Sk~tGz(^ zL6%*yX2}}NaK#=QPJ+?+p-pSLZx?bER|Shn~`b)FzI( zp>-{Y>EW`2Fw9{5{(49Y*DPNl_X(Y86-0>}P6TV=n)PfwjpfF=B$&|B~U;1X}aQ%BwlozN22OWQo{m(Hd0%n1t` z@58Y4W5KpA?PtYbN@4j|`>CbNm)7_8cXnvuCb^IEG2cJqk}A>nC9U@2r!RZlt6i~c z-kVDEBISj+OuUT(480%;z4J&2uf;vd(I9Fp|IO>JyfR!kcLyuylMjb?>JuqZ^#yr^h4Ya&E66)& z|7OYe@%ZcOllx6{rjfK=4#Ih^&b&9rAaBS!AvODg`58&6|%}0H| z)2AHc3@KB2Szlz>eQxXAl0`VIfQu-pde~@d_&!v!YzE^hgp%WAO^{5IR841(iwud7Q)Eq(%#h5IQ1o)1WPxOnWQk;%WCg-p6?GGu ze3h&g`kg2NBYQ{{m4V-N=!FabFZKwK;aBvKes7;_kM8KW2(8B!UW85kK-n1UHJ znO`yjB{dmuvE(LZ=J{zd-C|D8$t(hCUCB_y0;IsiuP|q;n9$J+(L{Ehn)! hTR%P?WLJE=UP0w84x8Nkl+v73JCHMqLDupx0RUMxH%kBj literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/app.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/app.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6deee690a2fcc0269f4122b8169cd9e3ba8484f1 GIT binary patch literal 49146 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 NmBbFmf7!AA{~xM4t(*V= literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/blueprints.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/blueprints.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b031b8ed4056905104c967819bf4cbb564b81e05 GIT binary patch literal 3379 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 CR~@ea literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/config.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/config.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbb9de00d6052c9a73a92d271546aa2de30db7ac GIT binary patch literal 12669 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/debughelpers.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/debughelpers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fde584939203cc43c1615610f7f4f26fca0e715 GIT binary patch literal 5996 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/globals.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/globals.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61026beeaea1bd09f72d5ded4dc95d7226f696ed GIT binary patch literal 1585 zcmb_c%Wfk@6zzxYcG}N8CNs&*go4#r0<%Oy5gKHM1Tl;v;tZnks8#7I+fAygnyPBQ z#Evx|!jf;`FPaS!tN8_3z^(2M@ghrX`TEwW`#kq{<4(u7;PcxbAJJbMmi4DOY=7!- zcy3v?dS+YJl|?LKGb^zJ+cvtxoWO;Dm(`MbP%p3=Yb0La*%o!bZ^|D@oix}^;s-w5 z)``bjNjqp4dK2_c&?)pC(7Qpm(0$fR`a!?YTWmMk3-&;72m7>6IzQRL0qN2Qq<3mj zj~>u{(*M~B4#_THdnHEp3)BrBk^?{=ROn%aJ|YhRJv_C@qu>Z)9zo1watzqx!t$6N z6)_)^CxAUIF>+F%Zt#S>1L#SGq6&RV-USpvOy|-Xy!X~{II!~;=3Hp3W5LxcIQt{P zHC^e~SenyI5n*;A#cKT)=rs=Y&ly%Xpmf7e({!X)XG~mUri`@#N_TVrHT@x@O5Y*v zOR5wk`YK+<94x%bV)OSmLf*uDhD4@SOehjlgwvG8QBfF*%AiBvAJ1cj^g4wb#?~mI zn8SIFHCl@dVXbMBYD$n6C{q+oGai}NFpKrNwBwW#N_;)1D9WUyTyLiuqOm|qumuI{ zSiO%F)hJ65=G#`c1^LTZ&&|aUeqmMRv%wHuQsYk%5mA;vin5KVkSGz7qL_o46yR{v znHoaN2zs?StoVWfe0Rs^o7@YdMF?pIcF@cCwa7RL6W|lisBFS$a<8aCuW}a@36F}E zx2g_}UvAH&2jJ%Sd&rjMsBZiEKZ!QX!3==V^YQosRhfne+Ef|S_s}Fb(y%vXAAlx* zi!6kpZ;j?+X$FiJB8EwujYy@qW;7XYc1tp=EMWwM9&Zs^EnJ1X$yX&6e!7&Odc@>ya2a%$RNic8HXAbY zOv#$@=#0O;coB}yUyQ!|;??$b z942Ze+a`D~47VO`D6(V1_l)TO=K&oS9=itKGh*L}0}#Jh^2F#y{B7mf%#Oa~$1ZJ%_IuIYVK!LO^WG!I4j>6!*rcD rPZL2hMn5rc7xf%O*J;{qr|mTC_TAU5d41clYyWgz$8Oxp+I{H1Zzki7 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/helpers.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/helpers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..080a885f759ac92721e74661e5b9f3fbe4d3335e GIT binary patch literal 21229 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 U7qV!x^1r-qj=Xo^7ZdLP0e|(-`2YX_ literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/logging.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/logging.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02011f640a29bf75c9a1efa66d845203c1f98dc6 GIT binary patch literal 2508 zcmZuzOK;mo5Z~4$_N;VH=49iP zw&&&i$pXw4#r!Ef#oZUcb`dNuiOXPlNjMKl^U51U-lXXakK@E}6DG0VhIwr(33&8C zB~K@BXl7DY@?b2rfwzS(Mx&#O@pj}>bN_2tC@E>iDh@E(`OAUHD%RpM3=C1ThU`&6 z-y;u+arO#;z~Mhb{Pi#v%nT$OCfYDQ8mVNYLT)6JN+pVEqa+`)9t_b645BcwXgzkn z$2iNe)fil%W;`(A6S>5qq|Z#keE(4QL(j(2zQ4p0h@uWdE!h};zON_R(?)=S?|U^H z1;S2}F$xGeIkf#U(bGExpmB9`+Sis{OhK0jXqF@7zDnca#6HT(s z;XM?jC!tsg3!$Fcy7@jFSL@cT9>CxCrs%OU-K;X*3>20C>v%MCu4+wJA+gi4jGu%m ziPHkqEG=b4dri~~ytKE!AFZ}JkF->}GZ=O5LBXPg3*Ffm@{wknJlN-Eki?MMaMbC; zA_VMgg}WUc8u`fx-}j~NSdh1-AV-sQ@gmSU*i$3LNKG~1el$C^--4r&Ds^|0Bx*Wo z3D+UVG8hF&=jnycF8m6}(Yr7>CMV>S`~=Tu^q8t;Lw_JWV61RnR*vbObC0~BFQ{4) zz+IRZ^ydf5@N}QigSv2m&&8u(RtGZJXJHSi3df3cWP^+yEQ~FIbDS&~aJ#|{I}D>J zH$xM90(~HHj3fr|H#BPvr5Ut*+3Ue!!z&iaCo*Eo&+~BJmbLWy(yUEww$NlHKhX=h zL*C>w%>Am({qa0zy+?i|`}7+^$pL5;jy=>P(PR`ggbrH~>Qw;k}yZ85Kme7h)7l4)GXC8NcSQ7s>WdzsvHt@&~$A$DgE zSCC+qvEL4Wu({Xs^HxIcj{80~gN*rZB*hZbc>*~QTji-HXNhqk7`M2mnts+w?}|Fgc4pTb$3e@_Q^Uyk z1-K|pK9tl9pz(LP4g+)_a)67n+N`DJ+%c^Jebb`N z-?B5U0qD(4P0~3bdwd+3X=6b%dh5`Ur3EzYa-DW-@||Q)=3?hf?hy$#EY(CD6?Z*`1dA zQL+oIoqa4CJKsH6>#lCDt$uZXd!t>`Jl0|2VS`|^Skcb1YP?f#bsb~XA^&w-I0IT< sJsVn>=hAzdV`Vw(%oWslji@m(_;Vmh=<#~Nq4V|mD>drU%0F)LU&jN{djJ3c literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/sessions.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/sessions.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb16abdfea590abe7bd34e52330061b34655b3a7 GIT binary patch literal 13102 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 F_YZW_3GM&@ literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/templating.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/templating.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a7ad732a94f6aaf4355914723fb4926bb65540b GIT binary patch literal 6997 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 I`bcf+-;MU#e*gdg literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/testing.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/testing.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a6a818cbfa41b89f5e6337dfa8e2fbab9df6b72 GIT binary patch literal 9451 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 Uf)zEg<=7alDJ*AW&l*Pm0o?rWJOBUy literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/views.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/views.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf8d32e7f82e670990c5e4a46b82a3dc88391971 GIT binary patch literal 5381 zcmb_gOLN@D5yk-62bU{ZPd{WQ88c48O{lfw9GtLZ$BHCdc5GHkufv)w0L09aps>Jd zFd)s%>S8J->5?Ci*i}->7yW=#en9>OPN~Ythx`FwoUaGi2T7}P30MGUfS#V7etg}% z!HE+s3)esY^^W}017b)cg($=1GM<;%L>A4bU*eGYS_WTL%bIK;G}FJjylC%$Cjq6afM0-TJnHz$waCsEO}hq3^FPBF1G3ND?uDj_yn0pFKPL7so_I!c|T7= zQX-@YboD*sLBgXX(?JqSp7!xgR)X$DdfQC5qFtF7Hi6p82QV0|57j`~0X)mNOamS9lT(|Z~ooZ~KFqQ&=(8~CO7 z$$mcyBbkKzD?Cr&s+rk;Kh1d}O93+|L&EF^u`X`K>1Ggf5$J%l?)xOO?|03zwb2{8 zdxbpnPM|)+FpXnrBJs0Ks|`NpYiS}kibiFV(MxmWn`s(PDP9?>bQjU!1-VWKz}3*J zaB=k7+#0e3?SuHFK-<_TS~H{E8l9RWCH5P|nd4gd_Qk&L-jLZ4&@FEm@4genxdcwv zOJ@%W&nFj+>ApgEOBqR92i6x%Fr))}^p9KcfFRU4baWVsHsyA(8>OntCs-*nKFG)oc8Qmsy`YGV@bd##Wkf;^^6rRS@@ZyUcp(vy?JGI{dOi*w!S@F zznbnPaTWzW6S{SeQWOpx>f4&`LKCA?WWY4na^eRaw{Qtwik8Vl9uAxp z?Q(o~k7nvTn1^Ny+6Gq*HPojytkQG3vS>?BKL z>yZ^%kJ#7j&+M^1rL+4?Aj=XBI54#{W{(`t#@NAs^X{s((Z27F-AB#=d+gj>2PemK zr*t*UYIF2;%V%~g;SZ50@jh+CxJEzLWB1xkjkS>x1un`HtMVUbgGbTyJaQb*D_Wj6NCjZq^VA#kso{C37BM?T)Ti<2)CwnzGxbAy zG1J1rH0ha5JMQe8QJGPT5v6EU8n^`x8OOsqTemMXPTJ?3I;*oLYq3_N95pd(vQc|p zahc z_5>OeB3l_TZZUVMU28Yn?Y4cgVKYTv4jB(~V?6w0*{|`OG(%-8L>(YOIUpKM(1SKw zBU?1+o$2)4UhN^4_v(PyR?+&@l=XD_;6L#1t5xfQv|SZLv(mCE<5Dzvl%fT?z8R{N zXGE<@;q(E4;O7CQ*%co3IaONGB%J^1JVUc@CxTm5>h%>*uk7C?GmwAEE{P#mWUF77J3sp-n5#n82|rUo-1jN>O?{I<(Yww^eNQUK#iu6Ir52wtja1>5TM8i zIJ-o>6qc;flf2cbnhheSi#Sq~{ydfypUlW72iAQme_WJ3uibZaZS0^}vJM=zJhq?I$IedUDPz{XW!*Fs zu3i{hWB0&TALDy#>^@n1Y8eX5l^TPW*ANz!+iM1II_;vC^}5QlY5lL$oup#IDoZS`WR_yN%kiqOl!hhR{J*Th#I)w(8W> z&vEb)?G5O;#J6xzW20uqHf6Qx&1HdKVZqn9Gs-F!J7c$49e10Zv_G7*VqNJy~KM1C7+G*^d3hd5Yh?4jgFS7FKSlx9F{4cWsP71KgW^W!d$Q z@rxKy{MG)-K44!k?LMiECn?X^6#9183itZ8%U4wcJB`lYPNu*G04P<)J9YIAzAE}j zs;HMQi&~uS;dh{Eu0-CXOm4JSxI{Du{s#9cMf@GN>9C+H_Y7;>FSF6BbNV^j6LcE0 z+@vlNf0L3(?It-FCn~Fi_yGc0X_jh!OC)CBw=jB)J0tm<%)M~#w4!&N6O^9&Iez<~ z^i1WBBE=U>7gk~SHQdQ`##wnvbNmG~W+Rj`Qmfz40!mkg+uYVh2->=6UMjQydsKmB WR2#JIrrm~rv>lt(zjJFRNB;$>L*GsS literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/wrappers.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/__pycache__/wrappers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..924a77191a0ccbf1f81712f655c82fc72721e153 GIT binary patch literal 5154 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 timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class Flask(App): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + default_config = ImmutableDict( + { + "DEBUG": None, + "TESTING": False, + "PROPAGATE_EXCEPTIONS": None, + "SECRET_KEY": None, + "PERMANENT_SESSION_LIFETIME": timedelta(days=31), + "USE_X_SENDFILE": False, + "SERVER_NAME": None, + "APPLICATION_ROOT": "/", + "SESSION_COOKIE_NAME": "session", + "SESSION_COOKIE_DOMAIN": None, + "SESSION_COOKIE_PATH": None, + "SESSION_COOKIE_HTTPONLY": True, + "SESSION_COOKIE_SECURE": False, + "SESSION_COOKIE_SAMESITE": None, + "SESSION_REFRESH_EACH_REQUEST": True, + "MAX_CONTENT_LENGTH": None, + "SEND_FILE_MAX_AGE_DEFAULT": None, + "TRAP_BAD_REQUEST_ERRORS": None, + "TRAP_HTTP_EXCEPTIONS": False, + "EXPLAIN_TEMPLATE_LOADING": False, + "PREFERRED_URL_SCHEME": "http", + "TEMPLATES_AUTO_RELOAD": None, + "MAX_COOKIE_SIZE": 4093, + } + ) + + #: The class that is used for request objects. See :class:`~flask.Request` + #: for more information. + request_class = Request + + #: The class that is used for response objects. See + #: :class:`~flask.Response` for more information. + response_class = Response + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface: SessionInterface = SecureCookieSessionInterface() + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ): + super().__init__( + import_name=import_name, + static_url_path=static_url_path, + static_folder=static_folder, + static_host=static_host, + host_matching=host_matching, + subdomain_matching=subdomain_matching, + template_folder=template_folder, + instance_path=instance_path, + instance_relative_config=instance_relative_config, + root_path=root_path, + ) + + # Add a static route using the provided static_url_path, static_host, + # and static_folder if there is a configured static_folder. + # Note we do this without checking if static_folder exists. + # For one, it might be created while the server is running (e.g. during + # development). Also, Google App Engine stores static files somewhere + if self.has_static_folder: + assert ( + bool(static_host) == host_matching + ), "Invalid static_host/host_matching combination" + # Use a weakref to avoid creating a reference cycle between the app + # and the view function (see #3761). + self_ref = weakref.ref(self) + self.add_url_rule( + f"{self.static_url_path}/", + endpoint="static", + host=static_host, + view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 + ) + + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for + reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to + :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is + supported, valid values are "r" (or "rt") and "rb". + + Note this is a duplicate of the same method in the Flask + class. + + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + return open(os.path.join(self.root_path, resource), mode) + + def open_instance_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Opens a resource from the application's instance folder + (:attr:`instance_path`). Otherwise works like + :meth:`open_resource`. Instance resources can also be opened for + writing. + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + return open(os.path.join(self.instance_path, resource), mode) + + def create_jinja_environment(self) -> Environment: + """Create the Jinja environment based on :attr:`jinja_options` + and the various Jinja-related methods of the app. Changing + :attr:`jinja_options` after this will have no effect. Also adds + Flask-related globals and filters to the environment. + + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + + .. versionadded:: 0.5 + """ + options = dict(self.jinja_options) + + if "autoescape" not in options: + options["autoescape"] = self.select_jinja_autoescape + + if "auto_reload" not in options: + auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] + + if auto_reload is None: + auto_reload = self.debug + + options["auto_reload"] = auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=self.url_for, + get_flashed_messages=get_flashed_messages, + config=self.config, + # request, session and g are normally added with the + # context processor for efficiency reasons but for imported + # templates we also want the proxies in there. + request=request, + session=session, + g=g, + ) + rv.policies["json.dumps_function"] = self.json.dumps + return rv + + def create_url_adapter(self, request: Request | None) -> MapAdapter | None: + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. + + .. versionadded:: 0.6 + + .. versionchanged:: 0.9 + This can now also be called without a request object when the + URL adapter is created for the application context. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. + """ + if request is not None: + # If subdomain matching is disabled (the default), use the + # default subdomain in all cases. This should be the default + # in Werkzeug but it currently does not have that feature. + if not self.subdomain_matching: + subdomain = self.url_map.default_subdomain or None + else: + subdomain = None + + return self.url_map.bind_to_environ( + request.environ, + server_name=self.config["SERVER_NAME"], + subdomain=subdomain, + ) + # We need at the very least the server name to be set for this + # to work. + if self.config["SERVER_NAME"] is not None: + return self.url_map.bind( + self.config["SERVER_NAME"], + script_name=self.config["APPLICATION_ROOT"], + url_scheme=self.config["PREFERRED_URL_SCHEME"], + ) + + return None + + def raise_routing_exception(self, request: Request) -> t.NoReturn: + """Intercept routing exceptions and possibly do something else. + + In debug mode, intercept a routing redirect and replace it with + an error if the body will be discarded. + + With modern Werkzeug this shouldn't occur, since it now uses a + 308 status which tells the browser to resend the method and + body. + + .. versionchanged:: 2.1 + Don't intercept 307 and 308 redirects. + + :meta private: + :internal: + """ + if ( + not self.debug + or not isinstance(request.routing_exception, RequestRedirect) + or request.routing_exception.code in {307, 308} + or request.method in {"GET", "HEAD", "OPTIONS"} + ): + raise request.routing_exception # type: ignore + + from .debughelpers import FormDataRoutingRedirect + + raise FormDataRoutingRedirect(request) + + def update_template_context(self, context: dict) -> None: + """Update the template context with some commonly used variables. + This injects request, session, config and g into the template + context as well as everything template context processors want + to inject. Note that the as of Flask 0.6, the original values + in the context will not be overridden if a context processor + decides to return a value with the same key. + + :param context: the context as a dictionary that is updated in place + to add extra variables. + """ + names: t.Iterable[str | None] = (None,) + + # A template may be rendered outside a request context. + if request: + names = chain(names, reversed(request.blueprints)) + + # The values passed to render_template take precedence. Keep a + # copy to re-apply after all context functions. + orig_ctx = context.copy() + + for name in names: + if name in self.template_context_processors: + for func in self.template_context_processors[name]: + context.update(self.ensure_sync(func)()) + + context.update(orig_ctx) + + def make_shell_context(self) -> dict: + """Returns the shell context for an interactive shell for this + application. This runs all the registered shell context + processors. + + .. versionadded:: 0.11 + """ + rv = {"app": self, "g": g} + for processor in self.shell_context_processors: + rv.update(processor()) + return rv + + def run( + self, + host: str | None = None, + port: int | None = None, + debug: bool | None = None, + load_dotenv: bool = True, + **options: t.Any, + ) -> None: + """Runs the application on a local development server. + + Do not use ``run()`` in a production setting. It is not intended to + meet security and performance requirements for a production server. + Instead, see :doc:`/deploying/index` for WSGI server recommendations. + + If the :attr:`debug` flag is set the server will automatically reload + for code changes and show a debugger in case an exception happened. + + If you want to run the application in debug mode, but disable the + code execution on the interactive debugger, you can pass + ``use_evalex=False`` as parameter. This will keep the debugger's + traceback screen active, but disable code execution. + + It is not recommended to use this function for development with + automatic reloading as this is badly supported. Instead you should + be using the :command:`flask` command line script's ``run`` support. + + .. admonition:: Keep in Mind + + Flask will suppress any server error with a generic error page + unless it is in debug mode. As such to enable just the + interactive debugger without the code reloading, you have to + invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. + Setting ``use_debugger`` to ``True`` without being in debug mode + won't catch any exceptions because there won't be any to + catch. + + :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to + have the server available externally as well. Defaults to + ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable + if present. + :param port: the port of the webserver. Defaults to ``5000`` or the + port defined in the ``SERVER_NAME`` config variable if present. + :param debug: if given, enable or disable debug mode. See + :attr:`debug`. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param options: the options to be forwarded to the underlying Werkzeug + server. See :func:`werkzeug.serving.run_simple` for more + information. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment + variables from :file:`.env` and :file:`.flaskenv` files. + + The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Ignore this call so that it doesn't start another server if + # the 'flask run' command is used. + if os.environ.get("FLASK_RUN_FROM_CLI") == "true": + if not is_running_from_reloader(): + click.secho( + " * Ignoring a call to 'app.run()' that would block" + " the current 'flask' CLI command.\n" + " Only call 'app.run()' in an 'if __name__ ==" + ' "__main__"\' guard.', + fg="red", + ) + + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, env var overrides existing value + if "FLASK_DEBUG" in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources + if debug is not None: + self.debug = bool(debug) + + server_name = self.config.get("SERVER_NAME") + sn_host = sn_port = None + + if server_name: + sn_host, _, sn_port = server_name.partition(":") + + if not host: + if sn_host: + host = sn_host + else: + host = "127.0.0.1" + + if port or port == 0: + port = int(port) + elif sn_port: + port = int(sn_port) + else: + port = 5000 + + options.setdefault("use_reloader", self.debug) + options.setdefault("use_debugger", self.debug) + options.setdefault("threaded", True) + + cli.show_server_banner(self.debug, self.name) + + from werkzeug.serving import run_simple + + try: + run_simple(t.cast(str, host), port, self, **options) + finally: + # reset the first request information if the development server + # reset normally. This makes it possible to restart the server + # without reloader and that stuff from an interactive shell. + self._got_first_request = False + + def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> FlaskClient: + """Creates a test client for this application. For information + about unit testing head over to :doc:`/testing`. + + Note that if you are testing for assertions or exceptions in your + application code, you must set ``app.testing = True`` in order for the + exceptions to propagate to the test client. Otherwise, the exception + will be handled by the application (not visible to the test client) and + the only indication of an AssertionError or other exception will be a + 500 status code response to the test client. See the :attr:`testing` + attribute. For example:: + + app.testing = True + client = app.test_client() + + The test client can be used in a ``with`` block to defer the closing down + of the context until the end of the ``with`` block. This is useful if + you want to access the context locals for testing:: + + with app.test_client() as c: + rv = c.get('/?vodka=42') + assert request.args['vodka'] == '42' + + Additionally, you may pass optional keyword arguments that will then + be passed to the application's :attr:`test_client_class` constructor. + For example:: + + from flask.testing import FlaskClient + + class CustomClient(FlaskClient): + def __init__(self, *args, **kwargs): + self._authentication = kwargs.pop("authentication") + super(CustomClient,self).__init__( *args, **kwargs) + + app.test_client_class = CustomClient + client = app.test_client(authentication='Basic ....') + + See :class:`~flask.testing.FlaskClient` for more information. + + .. versionchanged:: 0.4 + added support for ``with`` block usage for the client. + + .. versionadded:: 0.7 + The `use_cookies` parameter was added as well as the ability + to override the client to be used by setting the + :attr:`test_client_class` attribute. + + .. versionchanged:: 0.11 + Added `**kwargs` to support passing additional keyword arguments to + the constructor of :attr:`test_client_class`. + """ + cls = self.test_client_class + if cls is None: + from .testing import FlaskClient as cls + return cls( # type: ignore + self, self.response_class, use_cookies=use_cookies, **kwargs + ) + + def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from .testing import FlaskCliRunner as cls + + return cls(self, **kwargs) # type: ignore + + def handle_http_exception( + self, e: HTTPException + ) -> HTTPException | ft.ResponseReturnValue: + """Handles an HTTP exception. By default this will invoke the + registered error handlers and fall back to returning the + exception as response. + + .. versionchanged:: 1.0.3 + ``RoutingException``, used internally for actions such as + slash redirects during routing, is not passed to error + handlers. + + .. versionchanged:: 1.0 + Exceptions are looked up by code *and* by MRO, so + ``HTTPException`` subclasses can be handled with a catch-all + handler for the base ``HTTPException``. + + .. versionadded:: 0.3 + """ + # Proxy exceptions don't have error codes. We want to always return + # those unchanged as errors + if e.code is None: + return e + + # RoutingExceptions are used internally to trigger routing + # actions, such as slash redirects raising RequestRedirect. They + # are not raised or handled in user code. + if isinstance(e, RoutingException): + return e + + handler = self._find_error_handler(e, request.blueprints) + if handler is None: + return e + return self.ensure_sync(handler)(e) + + def handle_user_exception( + self, e: Exception + ) -> HTTPException | ft.ResponseReturnValue: + """This method is called whenever an exception occurs that + should be handled. A special case is :class:`~werkzeug + .exceptions.HTTPException` which is forwarded to the + :meth:`handle_http_exception` method. This function will either + return a response value or reraise the exception with the same + traceback. + + .. versionchanged:: 1.0 + Key errors raised from request data like ``form`` show the + bad key in debug mode rather than a generic bad request + message. + + .. versionadded:: 0.7 + """ + if isinstance(e, BadRequestKeyError) and ( + self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] + ): + e.show_exception = True + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e, request.blueprints) + + if handler is None: + raise + + return self.ensure_sync(handler)(e) + + def handle_exception(self, e: Exception) -> Response: + """Handle an exception that did not have an error handler + associated with it, or that was raised from an error handler. + This always causes a 500 ``InternalServerError``. + + Always sends the :data:`got_request_exception` signal. + + If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug + mode, the error will be re-raised so that the debugger can + display it. Otherwise, the original exception is logged, and + an :exc:`~werkzeug.exceptions.InternalServerError` is returned. + + If an error handler is registered for ``InternalServerError`` or + ``500``, it will be used. For consistency, the handler will + always receive the ``InternalServerError``. The original + unhandled exception is available as ``e.original_exception``. + + .. versionchanged:: 1.1.0 + Always passes the ``InternalServerError`` instance to the + handler, setting ``original_exception`` to the unhandled + error. + + .. versionchanged:: 1.1.0 + ``after_request`` functions and other finalization is done + even for the default 500 response when there is no handler. + + .. versionadded:: 0.3 + """ + exc_info = sys.exc_info() + got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) + propagate = self.config["PROPAGATE_EXCEPTIONS"] + + if propagate is None: + propagate = self.testing or self.debug + + if propagate: + # Re-raise if called with an active exception, otherwise + # raise the passed in exception. + if exc_info[1] is e: + raise + + raise e + + self.log_exception(exc_info) + server_error: InternalServerError | ft.ResponseReturnValue + server_error = InternalServerError(original_exception=e) + handler = self._find_error_handler(server_error, request.blueprints) + + if handler is not None: + server_error = self.ensure_sync(handler)(server_error) + + return self.finalize_request(server_error, from_error_handler=True) + + def log_exception( + self, + exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), + ) -> None: + """Logs an exception. This is called by :meth:`handle_exception` + if debugging is disabled and right before the handler is called. + The default implementation logs the exception as error on the + :attr:`logger`. + + .. versionadded:: 0.8 + """ + self.logger.error( + f"Exception on {request.path} [{request.method}]", exc_info=exc_info + ) + + def dispatch_request(self) -> ft.ResponseReturnValue: + """Does the request dispatching. Matches the URL and returns the + return value of the view or error handler. This does not have to + be a response object. In order to convert the return value to a + proper response object, call :func:`make_response`. + + .. versionchanged:: 0.7 + This no longer does the exception handling, this code was + moved to the new :meth:`full_dispatch_request`. + """ + req = request_ctx.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule: Rule = req.url_rule # type: ignore[assignment] + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if ( + getattr(rule, "provide_automatic_options", False) + and req.method == "OPTIONS" + ): + return self.make_default_options_response() + # otherwise dispatch to the handler for that endpoint + view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) + + def full_dispatch_request(self) -> Response: + """Dispatches the request and on top of that performs request + pre and postprocessing as well as HTTP exception catching and + error handling. + + .. versionadded:: 0.7 + """ + self._got_first_request = True + + try: + request_started.send(self, _async_wrapper=self.ensure_sync) + rv = self.preprocess_request() + if rv is None: + rv = self.dispatch_request() + except Exception as e: + rv = self.handle_user_exception(e) + return self.finalize_request(rv) + + def finalize_request( + self, + rv: ft.ResponseReturnValue | HTTPException, + from_error_handler: bool = False, + ) -> Response: + """Given the return value from a view function this finalizes + the request by converting it into a response and invoking the + postprocessing functions. This is invoked for both normal + request dispatching as well as error handlers. + + Because this means that it might be called as a result of a + failure a special safe mode is available which can be enabled + with the `from_error_handler` flag. If enabled, failures in + response processing will be logged and otherwise ignored. + + :internal: + """ + response = self.make_response(rv) + try: + response = self.process_response(response) + request_finished.send( + self, _async_wrapper=self.ensure_sync, response=response + ) + except Exception: + if not from_error_handler: + raise + self.logger.exception( + "Request finalizing failed with an error while handling an error" + ) + return response + + def make_default_options_response(self) -> Response: + """This method is called to create the default ``OPTIONS`` response. + This can be changed through subclassing to change the default + behavior of ``OPTIONS`` responses. + + .. versionadded:: 0.7 + """ + adapter = request_ctx.url_adapter + methods = adapter.allowed_methods() # type: ignore[union-attr] + rv = self.response_class() + rv.allow.update(methods) + return rv + + def ensure_sync(self, func: t.Callable) -> t.Callable: + """Ensure that the function is synchronous for WSGI workers. + Plain ``def`` functions are returned as-is. ``async def`` + functions are wrapped to run and wait for the response. + + Override this method to change how the app runs async views. + + .. versionadded:: 2.0 + """ + if iscoroutinefunction(func): + return self.async_to_sync(func) + + return func + + def async_to_sync( + self, func: t.Callable[..., t.Coroutine] + ) -> t.Callable[..., t.Any]: + """Return a sync function that will run the coroutine function. + + .. code-block:: python + + result = app.async_to_sync(func)(*args, **kwargs) + + Override this method to change how the app converts async code + to be synchronously callable. + + .. versionadded:: 2.0 + """ + try: + from asgiref.sync import async_to_sync as asgiref_async_to_sync + except ImportError: + raise RuntimeError( + "Install Flask with the 'async' extra in order to use async views." + ) from None + + return asgiref_async_to_sync(func) + + def url_for( + self, + /, + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, + ) -> str: + """Generate a URL to the given endpoint with the given values. + + This is called by :func:`flask.url_for`, and can be called + directly as well. + + An *endpoint* is the name of a URL rule, usually added with + :meth:`@app.route() `, and usually the same name as the + view function. A route defined in a :class:`~flask.Blueprint` + will prepend the blueprint's name separated by a ``.`` to the + endpoint. + + In some cases, such as email messages, you want URLs to include + the scheme and domain, like ``https://example.com/hello``. When + not in an active request, URLs will be external by default, but + this requires setting :data:`SERVER_NAME` so Flask knows what + domain to use. :data:`APPLICATION_ROOT` and + :data:`PREFERRED_URL_SCHEME` should also be configured as + needed. This config is only used when not in an active request. + + Functions can be decorated with :meth:`url_defaults` to modify + keyword arguments before the URL is built. + + If building fails for some reason, such as an unknown endpoint + or incorrect values, the app's :meth:`handle_url_build_error` + method is called. If that returns a string, that is returned, + otherwise a :exc:`~werkzeug.routing.BuildError` is raised. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it + is external. + :param _external: If given, prefer the URL to be internal + (False) or require it to be external (True). External URLs + include the scheme and domain. When not in an active + request, URLs are external by default. + :param values: Values to use for the variable parts of the URL + rule. Unknown keys are appended as query string arguments, + like ``?a=b&c=d``. + + .. versionadded:: 2.2 + Moved from ``flask.url_for``, which calls this method. + """ + req_ctx = _cv_request.get(None) + + if req_ctx is not None: + url_adapter = req_ctx.url_adapter + blueprint_name = req_ctx.request.blueprint + + # If the endpoint starts with "." and the request matches a + # blueprint, the endpoint is relative to the blueprint. + if endpoint[:1] == ".": + if blueprint_name is not None: + endpoint = f"{blueprint_name}{endpoint}" + else: + endpoint = endpoint[1:] + + # When in a request, generate a URL without scheme and + # domain by default, unless a scheme is given. + if _external is None: + _external = _scheme is not None + else: + app_ctx = _cv_app.get(None) + + # If called by helpers.url_for, an app context is active, + # use its url_adapter. Otherwise, app.url_for was called + # directly, build an adapter. + if app_ctx is not None: + url_adapter = app_ctx.url_adapter + else: + url_adapter = self.create_url_adapter(None) + + if url_adapter is None: + raise RuntimeError( + "Unable to build URLs outside an active request" + " without 'SERVER_NAME' configured. Also configure" + " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" + " needed." + ) + + # When outside a request, generate a URL with scheme and + # domain by default. + if _external is None: + _external = True + + # It is an error to set _scheme when _external=False, in order + # to avoid accidental insecure URLs. + if _scheme is not None and not _external: + raise ValueError("When specifying '_scheme', '_external' must be True.") + + self.inject_url_defaults(endpoint, values) + + try: + rv = url_adapter.build( # type: ignore[union-attr] + endpoint, + values, + method=_method, + url_scheme=_scheme, + force_external=_external, + ) + except BuildError as error: + values.update( + _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external + ) + return self.handle_url_build_error(error, endpoint, values) + + if _anchor is not None: + _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") + rv = f"{rv}#{_anchor}" + + return rv + + def make_response(self, rv: ft.ResponseReturnValue) -> Response: + """Convert the return value from a view function to an instance of + :attr:`response_class`. + + :param rv: the return value from the view function. The view function + must return a response. Returning ``None``, or the view ending + without returning, is not allowed. The following types are allowed + for ``view_rv``: + + ``str`` + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` + A response object is created with the bytes as the body. + + ``dict`` + A dictionary that will be jsonify'd before being returned. + + ``list`` + A list that will be jsonify'd before being returned. + + ``generator`` or ``iterator`` + A generator that returns ``str`` or ``bytes`` to be + streamed as the response. + + ``tuple`` + Either ``(body, status, headers)``, ``(body, status)``, or + ``(body, headers)``, where ``body`` is any of the other types + allowed here, ``status`` is a string or an integer, and + ``headers`` is a dictionary or a list of ``(key, value)`` + tuples. If ``body`` is a :attr:`response_class` instance, + ``status`` overwrites the exiting value and ``headers`` are + extended. + + :attr:`response_class` + The object is returned unchanged. + + other :class:`~werkzeug.wrappers.Response` class + The object is coerced to :attr:`response_class`. + + :func:`callable` + The function is called as a WSGI application. The result is + used to create a response object. + + .. versionchanged:: 2.2 + A generator will be converted to a streaming response. + A list will be converted to a JSON response. + + .. versionchanged:: 1.1 + A dict will be converted to a JSON response. + + .. versionchanged:: 0.9 + Previously a tuple was interpreted as the arguments for the + response object. + """ + + status = headers = None + + # unpack tuple returns + if isinstance(rv, tuple): + len_rv = len(rv) + + # a 3-tuple is unpacked directly + if len_rv == 3: + rv, status, headers = rv # type: ignore[misc] + # decide if a 2-tuple has status or headers + elif len_rv == 2: + if isinstance(rv[1], (Headers, dict, tuple, list)): + rv, headers = rv + else: + rv, status = rv # type: ignore[assignment,misc] + # other sized tuples are not allowed + else: + raise TypeError( + "The view function did not return a valid response tuple." + " The tuple must have the form (body, status, headers)," + " (body, status), or (body, headers)." + ) + + # the body must not be None + if rv is None: + raise TypeError( + f"The view function for {request.endpoint!r} did not" + " return a valid response. The function either returned" + " None or ended without a return statement." + ) + + # make sure the body is an instance of the response class + if not isinstance(rv, self.response_class): + if isinstance(rv, (str, bytes, bytearray)) or isinstance(rv, _abc_Iterator): + # let the response class set the status and headers instead of + # waiting to do it manually, so that the class can handle any + # special logic + rv = self.response_class( + rv, + status=status, + headers=headers, # type: ignore[arg-type] + ) + status = headers = None + elif isinstance(rv, (dict, list)): + rv = self.json.response(rv) + elif isinstance(rv, BaseResponse) or callable(rv): + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type( + rv, request.environ # type: ignore[arg-type] + ) + except TypeError as e: + raise TypeError( + f"{e}\nThe view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it" + f" was a {type(rv).__name__}." + ).with_traceback(sys.exc_info()[2]) from None + else: + raise TypeError( + "The view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it was a" + f" {type(rv).__name__}." + ) + + rv = t.cast(Response, rv) + # prefer the status if it was provided + if status is not None: + if isinstance(status, (str, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.update(headers) # type: ignore[arg-type] + + return rv + + def preprocess_request(self) -> ft.ResponseReturnValue | None: + """Called before the request is dispatched. Calls + :attr:`url_value_preprocessors` registered with the app and the + current blueprint (if any). Then calls :attr:`before_request_funcs` + registered with the app and the blueprint. + + If any :meth:`before_request` handler returns a non-None value, the + value is handled as if it was the return value from the view, and + further request handling is stopped. + """ + names = (None, *reversed(request.blueprints)) + + for name in names: + if name in self.url_value_preprocessors: + for url_func in self.url_value_preprocessors[name]: + url_func(request.endpoint, request.view_args) + + for name in names: + if name in self.before_request_funcs: + for before_func in self.before_request_funcs[name]: + rv = self.ensure_sync(before_func)() + + if rv is not None: + return rv + + return None + + def process_response(self, response: Response) -> Response: + """Can be overridden in order to modify the response object + before it's sent to the WSGI server. By default this will + call all the :meth:`after_request` decorated functions. + + .. versionchanged:: 0.5 + As of Flask 0.5 the functions registered for after request + execution are called in reverse order of registration. + + :param response: a :attr:`response_class` object. + :return: a new response object or the same, has to be an + instance of :attr:`response_class`. + """ + ctx = request_ctx._get_current_object() # type: ignore[attr-defined] + + for func in ctx._after_request_functions: + response = self.ensure_sync(func)(response) + + for name in chain(request.blueprints, (None,)): + if name in self.after_request_funcs: + for func in reversed(self.after_request_funcs[name]): + response = self.ensure_sync(func)(response) + + if not self.session_interface.is_null_session(ctx.session): + self.session_interface.save_session(self, ctx.session, response) + + return response + + def do_teardown_request( + self, exc: BaseException | None = _sentinel # type: ignore + ) -> None: + """Called after the request is dispatched and the response is + returned, right before the request context is popped. + + This calls all functions decorated with + :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` + if a blueprint handled the request. Finally, the + :data:`request_tearing_down` signal is sent. + + This is called by + :meth:`RequestContext.pop() `, + which may be delayed during testing to maintain access to + resources. + + :param exc: An unhandled exception raised while dispatching the + request. Detected from the current exception information if + not passed. Passed to each teardown function. + + .. versionchanged:: 0.9 + Added the ``exc`` argument. + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for name in chain(request.blueprints, (None,)): + if name in self.teardown_request_funcs: + for func in reversed(self.teardown_request_funcs[name]): + self.ensure_sync(func)(exc) + + request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def do_teardown_appcontext( + self, exc: BaseException | None = _sentinel # type: ignore + ) -> None: + """Called right before the application context is popped. + + When handling a request, the application context is popped + after the request context. See :meth:`do_teardown_request`. + + This calls all functions decorated with + :meth:`teardown_appcontext`. Then the + :data:`appcontext_tearing_down` signal is sent. + + This is called by + :meth:`AppContext.pop() `. + + .. versionadded:: 0.9 + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for func in reversed(self.teardown_appcontext_funcs): + self.ensure_sync(func)(exc) + + appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def app_context(self) -> AppContext: + """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` + block to push the context, which will make :data:`current_app` + point at this application. + + An application context is automatically pushed by + :meth:`RequestContext.push() ` + when handling a request, and when running a CLI command. Use + this to manually create a context outside of these situations. + + :: + + with app.app_context(): + init_db() + + See :doc:`/appcontext`. + + .. versionadded:: 0.9 + """ + return AppContext(self) + + def request_context(self, environ: dict) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` representing a + WSGI environment. Use a ``with`` block to push the context, + which will make :data:`request` point at this request. + + See :doc:`/reqcontext`. + + Typically you should not call this from your own code. A request + context is automatically pushed by the :meth:`wsgi_app` when + handling a request. Use :meth:`test_request_context` to create + an environment and context instead of this method. + + :param environ: a WSGI environment + """ + return RequestContext(self, environ) + + def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` for a WSGI + environment created from the given values. This is mostly useful + during testing, where you may want to run a function that uses + request data without dispatching a full request. + + See :doc:`/reqcontext`. + + Use a ``with`` block to push the context, which will make + :data:`request` point at the request for the created + environment. :: + + with app.test_request_context(...): + generate_report() + + When using the shell, it may be easier to push and pop the + context manually to avoid indentation. :: + + ctx = app.test_request_context(...) + ctx.push() + ... + ctx.pop() + + Takes the same arguments as Werkzeug's + :class:`~werkzeug.test.EnvironBuilder`, with some defaults from + the application. See the linked Werkzeug docs for most of the + available arguments. Flask-specific behavior is listed here. + + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to + :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param data: The request body, either as a string or a dict of + form keys and values. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + from .testing import EnvironBuilder + + builder = EnvironBuilder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app(self, environ: dict, start_response: t.Callable) -> t.Any: + """The actual WSGI application. This is not implemented in + :meth:`__call__` so that middlewares can be applied without + losing a reference to the app object. Instead of doing this:: + + app = MyMiddleware(app) + + It's a better idea to do this instead:: + + app.wsgi_app = MyMiddleware(app.wsgi_app) + + Then you still have the original application object around and + can continue to call methods on it. + + .. versionchanged:: 0.7 + Teardown events for the request and app contexts are called + even if an unhandled error occurs. Other events may not be + called depending on when an error occurs during dispatch. + See :ref:`callbacks-and-errors`. + + :param environ: A WSGI environment. + :param start_response: A callable accepting a status code, + a list of headers, and an optional exception context to + start the response. + """ + ctx = self.request_context(environ) + error: BaseException | None = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: # noqa: B001 + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if "werkzeug.debug.preserve_context" in environ: + environ["werkzeug.debug.preserve_context"](_cv_app.get()) + environ["werkzeug.debug.preserve_context"](_cv_request.get()) + + if error is not None and self.should_ignore_error(error): + error = None + + ctx.pop(error) + + def __call__(self, environ: dict, start_response: t.Callable) -> t.Any: + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app`, which can be + wrapped to apply middleware. + """ + return self.wsgi_app(environ, start_response) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/blueprints.py b/Meliora/gmapenv/Lib/site-packages/flask/blueprints.py new file mode 100644 index 00000000..3a37a2c4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/blueprints.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +import os +import typing as t +from datetime import timedelta + +from .globals import current_app +from .helpers import send_from_directory +from .sansio.blueprints import Blueprint as SansioBlueprint +from .sansio.blueprints import BlueprintSetupState as BlueprintSetupState # noqa + +if t.TYPE_CHECKING: # pragma: no cover + from .wrappers import Response + + +class Blueprint(SansioBlueprint): + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for + reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to + :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is + supported, valid values are "r" (or "rt") and "rb". + + Note this is a duplicate of the same method in the Flask + class. + + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + return open(os.path.join(self.root_path, resource), mode) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/cli.py b/Meliora/gmapenv/Lib/site-packages/flask/cli.py new file mode 100644 index 00000000..dda266b3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/cli.py @@ -0,0 +1,1068 @@ +from __future__ import annotations + +import ast +import importlib.metadata +import inspect +import os +import platform +import re +import sys +import traceback +import typing as t +from functools import update_wrapper +from operator import itemgetter + +import click +from click.core import ParameterSource +from werkzeug import run_simple +from werkzeug.serving import is_running_from_reloader +from werkzeug.utils import import_string + +from .globals import current_app +from .helpers import get_debug_flag +from .helpers import get_load_dotenv + +if t.TYPE_CHECKING: + from .app import Flask + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(module): + """Given a module instance this tries to find the best possible + application in the module or raises an exception. + """ + from . import Flask + + # Search for the most common names first. + for attr_name in ("app", "application"): + app = getattr(module, attr_name, None) + + if isinstance(app, Flask): + return app + + # Otherwise find the only object that is a Flask instance. + matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + "Detected multiple Flask applications in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify the correct one." + ) + + # Search for app factory functions. + for attr_name in ("create_app", "make_app"): + app_factory = getattr(module, attr_name, None) + + if inspect.isfunction(app_factory): + try: + app = app_factory() + + if isinstance(app, Flask): + return app + except TypeError as e: + if not _called_with_wrong_args(app_factory): + raise + + raise NoAppException( + f"Detected factory '{attr_name}' in module '{module.__name__}'," + " but could not call it without arguments. Use" + f" '{module.__name__}:{attr_name}(args)'" + " to specify arguments." + ) from e + + raise NoAppException( + "Failed to find Flask application or factory in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify one." + ) + + +def _called_with_wrong_args(f): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param f: The function that was called. + :return: ``True`` if the call failed. + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is f.__code__: + # In the function, it was called successfully. + return False + + tb = tb.tb_next + + # Didn't reach the function. + return True + finally: + # Delete tb to break a circular reference. + # https://docs.python.org/2/library/sys.html#sys.exc_info + del tb + + +def find_app_by_string(module, app_name): + """Check if the given string is a variable name or a function. Call + a function to get the app instance, or return the variable directly. + """ + from . import Flask + + # Parse app_name as a single expression to determine if it's a valid + # attribute name or function call. + try: + expr = ast.parse(app_name.strip(), mode="eval").body + except SyntaxError: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) from None + + if isinstance(expr, ast.Name): + name = expr.id + args = [] + kwargs = {} + elif isinstance(expr, ast.Call): + # Ensure the function name is an attribute name only. + if not isinstance(expr.func, ast.Name): + raise NoAppException( + f"Function reference must be a simple name: {app_name!r}." + ) + + name = expr.func.id + + # Parse the positional and keyword arguments as literals. + try: + args = [ast.literal_eval(arg) for arg in expr.args] + kwargs = {kw.arg: ast.literal_eval(kw.value) for kw in expr.keywords} + except ValueError: + # literal_eval gives cryptic error messages, show a generic + # message with the full expression instead. + raise NoAppException( + f"Failed to parse arguments as literal values: {app_name!r}." + ) from None + else: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException( + f"Failed to find attribute {name!r} in {module.__name__!r}." + ) from e + + # If the attribute is a function, call it with any args and kwargs + # to get the real application. + if inspect.isfunction(attr): + try: + app = attr(*args, **kwargs) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + f"The factory {app_name!r} in module" + f" {module.__name__!r} could not be called with the" + " specified arguments." + ) from e + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + "A valid Flask application was not obtained from" + f" '{module.__name__}:{app_name}'." + ) + + +def prepare_import(path): + """Given a filename this will try to calculate the python path, add it + to the search path and return the actual module name that is expected. + """ + path = os.path.realpath(path) + + fname, ext = os.path.splitext(path) + if ext == ".py": + path = fname + + if os.path.basename(path) == "__init__": + path = os.path.dirname(path) + + module_name = [] + + # move up until outside package structure (no __init__.py) + while True: + path, name = os.path.split(path) + module_name.append(name) + + if not os.path.exists(os.path.join(path, "__init__.py")): + break + + if sys.path[0] != path: + sys.path.insert(0, path) + + return ".".join(module_name[::-1]) + + +def locate_app(module_name, app_name, raise_if_not_found=True): + try: + __import__(module_name) + except ImportError: + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[2].tb_next: + raise NoAppException( + f"While importing {module_name!r}, an ImportError was" + f" raised:\n\n{traceback.format_exc()}" + ) from None + elif raise_if_not_found: + raise NoAppException(f"Could not import {module_name!r}.") from None + else: + return + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(module) + else: + return find_app_by_string(module, app_name) + + +def get_version(ctx, param, value): + if not value or ctx.resilient_parsing: + return + + flask_version = importlib.metadata.version("flask") + werkzeug_version = importlib.metadata.version("werkzeug") + + click.echo( + f"Python {platform.python_version()}\n" + f"Flask {flask_version}\n" + f"Werkzeug {werkzeug_version}", + color=ctx.color, + ) + ctx.exit() + + +version_option = click.Option( + ["--version"], + help="Show the Flask version.", + expose_value=False, + callback=get_version, + is_flag=True, + is_eager=True, +) + + +class ScriptInfo: + """Helper object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + """ + + def __init__( + self, + app_import_path: str | None = None, + create_app: t.Callable[..., Flask] | None = None, + set_debug_flag: bool = True, + ) -> None: + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data: dict[t.Any, t.Any] = {} + self.set_debug_flag = set_debug_flag + self._loaded_app: Flask | None = None + + def load_app(self) -> Flask: + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + if self._loaded_app is not None: + return self._loaded_app + + if self.create_app is not None: + app = self.create_app() + else: + if self.app_import_path: + path, name = ( + re.split(r":(?![\\/])", self.app_import_path, maxsplit=1) + [None] + )[:2] + import_name = prepare_import(path) + app = locate_app(import_name, name) + else: + for path in ("wsgi.py", "app.py"): + import_name = prepare_import(path) + app = locate_app(import_name, None, raise_if_not_found=False) + + if app: + break + + if not app: + raise NoAppException( + "Could not locate a Flask application. Use the" + " 'flask --app' option, 'FLASK_APP' environment" + " variable, or a 'wsgi.py' or 'app.py' file in the" + " current directory." + ) + + if self.set_debug_flag: + # Update the app's debug flag through the descriptor so that + # other values repopulate as well. + app.debug = get_debug_flag() + + self._loaded_app = app + return app + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + + +def with_appcontext(f): + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. + + Custom commands (and their options) registered under ``app.cli`` or + ``blueprint.cli`` will always have an app context available, this + decorator is not required in that case. + + .. versionchanged:: 2.2 + The app context is active for subcommands as well as the + decorated callback. The app context is always available to + ``app.cli`` command and parameter callbacks. + """ + + @click.pass_context + def decorator(__ctx, *args, **kwargs): + if not current_app: + app = __ctx.ensure_object(ScriptInfo).load_app() + __ctx.with_resource(app.app_context()) + + return __ctx.invoke(f, *args, **kwargs) + + return update_wrapper(decorator, f) + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop("with_appcontext", True) + + def decorator(f): + if wrap_for_ctx: + f = with_appcontext(f) + return click.Group.command(self, *args, **kwargs)(f) + + return decorator + + def group(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault("cls", AppGroup) + return click.Group.group(self, *args, **kwargs) + + +def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: + if value is None: + return None + + info = ctx.ensure_object(ScriptInfo) + info.app_import_path = value + return value + + +# This option is eager so the app will be available if --help is given. +# --help is also eager, so --app must be before it in the param list. +# no_args_is_help bypasses eager processing, so this option must be +# processed manually in that case to ensure FLASK_APP gets picked up. +_app_option = click.Option( + ["-A", "--app"], + metavar="IMPORT", + help=( + "The Flask application or factory function to load, in the form 'module:name'." + " Module can be a dotted import or file path. Name is not required if it is" + " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" + " pass arguments." + ), + is_eager=True, + expose_value=False, + callback=_set_app, +) + + +def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: + # If the flag isn't provided, it will default to False. Don't use + # that, let debug be set by env in that case. + source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] + + if source is not None and source in ( + ParameterSource.DEFAULT, + ParameterSource.DEFAULT_MAP, + ): + return None + + # Set with env var instead of ScriptInfo.load so that it can be + # accessed early during a factory function. + os.environ["FLASK_DEBUG"] = "1" if value else "0" + return value + + +_debug_option = click.Option( + ["--debug/--no-debug"], + help="Set debug mode.", + expose_value=False, + callback=_set_debug, +) + + +def _env_file_callback( + ctx: click.Context, param: click.Option, value: str | None +) -> str | None: + if value is None: + return None + + import importlib + + try: + importlib.import_module("dotenv") + except ImportError: + raise click.BadParameter( + "python-dotenv must be installed to load an env file.", + ctx=ctx, + param=param, + ) from None + + # Don't check FLASK_SKIP_DOTENV, that only disables automatically + # loading .env and .flaskenv files. + load_dotenv(value) + return value + + +# This option is eager so env vars are loaded as early as possible to be +# used by other options. +_env_file_option = click.Option( + ["-e", "--env-file"], + type=click.Path(exists=True, dir_okay=False), + help="Load environment variables from this file. python-dotenv must be installed.", + is_eager=True, + expose_value=False, + callback=_env_file_callback, +) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands will be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info and + returns the loaded app. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param set_debug_flag: Set the app's debug flag. + + .. versionchanged:: 2.2 + Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. + + .. versionchanged:: 2.2 + An app context is pushed when running ``app.cli`` commands, so + ``@with_appcontext`` is no longer required for those commands. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment variables + from :file:`.env` and :file:`.flaskenv` files. + """ + + def __init__( + self, + add_default_commands: bool = True, + create_app: t.Callable[..., Flask] | None = None, + add_version_option: bool = True, + load_dotenv: bool = True, + set_debug_flag: bool = True, + **extra: t.Any, + ) -> None: + params = list(extra.pop("params", None) or ()) + # Processing is done with option callbacks instead of a group + # callback. This allows users to make a custom group callback + # without losing the behavior. --env-file must come first so + # that it is eagerly evaluated before --app. + params.extend((_env_file_option, _app_option, _debug_option)) + + if add_version_option: + params.append(version_option) + + if "context_settings" not in extra: + extra["context_settings"] = {} + + extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") + + super().__init__(params=params, **extra) + + self.create_app = create_app + self.load_dotenv = load_dotenv + self.set_debug_flag = set_debug_flag + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + self.add_command(routes_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self): + if self._loaded_plugin_commands: + return + + if sys.version_info >= (3, 10): + from importlib import metadata + else: + # Use a backport on Python < 3.10. We technically have + # importlib.metadata on 3.8+, but the API changed in 3.10, + # so use the backport for consistency. + import importlib_metadata as metadata + + for ep in metadata.entry_points(group="flask.commands"): + self.add_command(ep.load(), ep.name) + + self._loaded_plugin_commands = True + + def get_command(self, ctx, name): + self._load_plugin_commands() + # Look up built-in and plugin commands, which should be + # available even if the app fails to load. + rv = super().get_command(ctx, name) + + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + + # Look up commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + app = info.load_app() + except NoAppException as e: + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + return None + + # Push an app context for the loaded app unless it is already + # active somehow. This makes the context available to parameter + # and command callbacks without needing @with_appcontext. + if not current_app or current_app._get_current_object() is not app: + ctx.with_resource(app.app_context()) + + return app.cli.get_command(ctx, name) + + def list_commands(self, ctx): + self._load_plugin_commands() + # Start with the built-in and plugin commands. + rv = set(super().list_commands(ctx)) + info = ctx.ensure_object(ScriptInfo) + + # Add commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except NoAppException as e: + # When an app couldn't be loaded, show the error message + # without the traceback. + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + except Exception: + # When any other errors occurred during loading, show the + # full traceback. + click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") + + return sorted(rv) + + def make_context( + self, + info_name: str | None, + args: list[str], + parent: click.Context | None = None, + **extra: t.Any, + ) -> click.Context: + # Set a flag to tell app.run to become a no-op. If app.run was + # not in a __name__ == __main__ guard, it would start the server + # when importing, blocking whatever command is being called. + os.environ["FLASK_RUN_FROM_CLI"] = "true" + + # Attempt to load .env and .flask env files. The --env-file + # option can cause another file to be loaded. + if get_load_dotenv(self.load_dotenv): + load_dotenv() + + if "obj" not in extra and "obj" not in self.context_settings: + extra["obj"] = ScriptInfo( + create_app=self.create_app, set_debug_flag=self.set_debug_flag + ) + + return super().make_context(info_name, args, parent=parent, **extra) + + def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help: + # Attempt to load --env-file and --app early in case they + # were given as env vars. Otherwise no_args_is_help will not + # see commands from app.cli. + _env_file_option.handle_parse_result(ctx, {}, []) + _app_option.handle_parse_result(ctx, {}, []) + + return super().parse_args(ctx, args) + + +def _path_is_ancestor(path, other): + """Take ``other`` and remove the length of ``path`` from it. Then join it + to ``path``. If it is the original value, ``path`` is an ancestor of + ``other``.""" + return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other + + +def load_dotenv(path: str | os.PathLike | None = None) -> bool: + """Load "dotenv" files in order of precedence to set environment variables. + + If an env var is already set it is not overwritten, so earlier files in the + list are preferred over later files. + + This is a no-op if `python-dotenv`_ is not installed. + + .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme + + :param path: Load the file at this location instead of searching. + :return: ``True`` if a file was loaded. + + .. versionchanged:: 2.0 + The current directory is not changed to the location of the + loaded file. + + .. versionchanged:: 2.0 + When loading the env files, set the default encoding to UTF-8. + + .. versionchanged:: 1.1.0 + Returns ``False`` when python-dotenv is not installed, or when + the given path isn't a file. + + .. versionadded:: 1.0 + """ + try: + import dotenv + except ImportError: + if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): + click.secho( + " * Tip: There are .env or .flaskenv files present." + ' Do "pip install python-dotenv" to use them.', + fg="yellow", + err=True, + ) + + return False + + # Always return after attempting to load a given path, don't load + # the default files. + if path is not None: + if os.path.isfile(path): + return dotenv.load_dotenv(path, encoding="utf-8") + + return False + + loaded = False + + for name in (".env", ".flaskenv"): + path = dotenv.find_dotenv(name, usecwd=True) + + if not path: + continue + + dotenv.load_dotenv(path, encoding="utf-8") + loaded = True + + return loaded # True if at least one file was located and loaded. + + +def show_server_banner(debug, app_import_path): + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if is_running_from_reloader(): + return + + if app_import_path is not None: + click.echo(f" * Serving Flask app '{app_import_path}'") + + if debug is not None: + click.echo(f" * Debug mode: {'on' if debug else 'off'}") + + +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = "path" + + def __init__(self): + self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) + + def convert(self, value, param, ctx): + try: + import ssl + except ImportError: + raise click.BadParameter( + 'Using "--cert" requires Python to be compiled with SSL support.', + ctx, + param, + ) from None + + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == "adhoc": + try: + import cryptography # noqa: F401 + except ImportError: + raise click.BadParameter( + "Using ad-hoc certificates requires the cryptography library.", + ctx, + param, + ) from None + + return value + + obj = import_string(value, silent=True) + + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx, param, value): + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get("cert") + is_adhoc = cert == "adhoc" + + try: + import ssl + except ImportError: + is_context = False + else: + is_context = isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', ctx, param + ) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key is not used.', ctx, param + ) + + if not cert: + raise click.BadParameter('"--cert" must also be specified.', ctx, param) + + ctx.params["cert"] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter('Required when using "--cert".', ctx, param) + + return value + + +class SeparatedPathType(click.Path): + """Click option type that accepts a list of values separated by the + OS's path separator (``:``, ``;`` on Windows). Each value is + validated as a :class:`click.Path` type. + """ + + def convert(self, value, param, ctx): + items = self.split_envvar_value(value) + super_convert = super().convert + return [super_convert(item, param, ctx) for item in items] + + +@click.command("run", short_help="Run a development server.") +@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") +@click.option("--port", "-p", default=5000, help="The port to bind to.") +@click.option( + "--cert", + type=CertParamType(), + help="Specify a certificate file to use HTTPS.", + is_eager=True, +) +@click.option( + "--key", + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, + expose_value=False, + help="The key file to use when specifying a certificate.", +) +@click.option( + "--reload/--no-reload", + default=None, + help="Enable or disable the reloader. By default the reloader " + "is active if debug is enabled.", +) +@click.option( + "--debugger/--no-debugger", + default=None, + help="Enable or disable the debugger. By default the debugger " + "is active if debug is enabled.", +) +@click.option( + "--with-threads/--without-threads", + default=True, + help="Enable or disable multithreading.", +) +@click.option( + "--extra-files", + default=None, + type=SeparatedPathType(), + help=( + "Extra files that trigger a reload on change. Multiple paths" + f" are separated by {os.path.pathsep!r}." + ), +) +@click.option( + "--exclude-patterns", + default=None, + type=SeparatedPathType(), + help=( + "Files matching these fnmatch patterns will not trigger a reload" + " on change. Multiple patterns are separated by" + f" {os.path.pathsep!r}." + ), +) +@pass_script_info +def run_command( + info, + host, + port, + reload, + debugger, + with_threads, + cert, + extra_files, + exclude_patterns, +): + """Run a local development server. + + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. + + The reloader and debugger are enabled by default with the '--debug' + option. + """ + try: + app = info.load_app() + except Exception as e: + if is_running_from_reloader(): + # When reloading, print out the error immediately, but raise + # it later so the debugger or server can handle it. + traceback.print_exc() + err = e + + def app(environ, start_response): + raise err from None + + else: + # When not reloading, raise the error immediately so the + # command fails. + raise e from None + + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + show_server_banner(debug, info.app_import_path) + + run_simple( + host, + port, + app, + use_reloader=reload, + use_debugger=debugger, + threaded=with_threads, + ssl_context=cert, + extra_files=extra_files, + exclude_patterns=exclude_patterns, + ) + + +run_command.params.insert(0, _debug_option) + + +@click.command("shell", short_help="Run a shell in the app context.") +@with_appcontext +def shell_command() -> None: + """Run an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to its configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + + banner = ( + f"Python {sys.version} on {sys.platform}\n" + f"App: {current_app.import_name}\n" + f"Instance: {current_app.instance_path}" + ) + ctx: dict = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get("PYTHONSTARTUP") + if startup and os.path.isfile(startup): + with open(startup) as f: + eval(compile(f.read(), startup, "exec"), ctx) + + ctx.update(current_app.make_shell_context()) + + # Site, customize, or startup script can set a hook to call when + # entering interactive mode. The default one sets up readline with + # tab and history completion. + interactive_hook = getattr(sys, "__interactivehook__", None) + + if interactive_hook is not None: + try: + import readline + from rlcompleter import Completer + except ImportError: + pass + else: + # rlcompleter uses __main__.__dict__ by default, which is + # flask.__main__. Use the shell context instead. + readline.set_completer(Completer(ctx).complete) + + interactive_hook() + + code.interact(banner=banner, local=ctx) + + +@click.command("routes", short_help="Show the routes for the app.") +@click.option( + "--sort", + "-s", + type=click.Choice(("endpoint", "methods", "domain", "rule", "match")), + default="endpoint", + help=( + "Method to sort routes by. 'match' is the order that Flask will match routes" + " when dispatching a request." + ), +) +@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") +@with_appcontext +def routes_command(sort: str, all_methods: bool) -> None: + """Show all registered routes with endpoints and methods.""" + rules = list(current_app.url_map.iter_rules()) + + if not rules: + click.echo("No routes were registered.") + return + + ignored_methods = set() if all_methods else {"HEAD", "OPTIONS"} + host_matching = current_app.url_map.host_matching + has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) + rows = [] + + for rule in rules: + row = [ + rule.endpoint, + ", ".join(sorted((rule.methods or set()) - ignored_methods)), + ] + + if has_domain: + row.append((rule.host if host_matching else rule.subdomain) or "") + + row.append(rule.rule) + rows.append(row) + + headers = ["Endpoint", "Methods"] + sorts = ["endpoint", "methods"] + + if has_domain: + headers.append("Host" if host_matching else "Subdomain") + sorts.append("domain") + + headers.append("Rule") + sorts.append("rule") + + try: + rows.sort(key=itemgetter(sorts.index(sort))) + except ValueError: + pass + + rows.insert(0, headers) + widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] + rows.insert(1, ["-" * w for w in widths]) + template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) + + for row in rows: + click.echo(template.format(*row)) + + +cli = FlaskGroup( + name="flask", + help="""\ +A general utility script for Flask applications. + +An application to load must be given with the '--app' option, +'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file +in the current directory. +""", +) + + +def main() -> None: + cli.main() + + +if __name__ == "__main__": + main() diff --git a/Meliora/gmapenv/Lib/site-packages/flask/config.py b/Meliora/gmapenv/Lib/site-packages/flask/config.py new file mode 100644 index 00000000..5f921b4d --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/config.py @@ -0,0 +1,347 @@ +from __future__ import annotations + +import errno +import json +import os +import types +import typing as t + +from werkzeug.utils import import_string + + +class ConfigAttribute: + """Makes an attribute forward to the config""" + + def __init__(self, name: str, get_converter: t.Callable | None = None) -> None: + self.__name__ = name + self.get_converter = get_converter + + def __get__(self, obj: t.Any, owner: t.Any = None) -> t.Any: + if obj is None: + return self + rv = obj.config[self.__name__] + if self.get_converter is not None: + rv = self.get_converter(rv) + return rv + + def __set__(self, obj: t.Any, value: t.Any) -> None: + obj.config[self.__name__] = value + + +class Config(dict): + """Works exactly like a dict but provides ways to fill it from files + or special dictionaries. There are two common patterns to populate the + config. + + Either you can fill the config from a config file:: + + app.config.from_pyfile('yourconfig.cfg') + + Or alternatively you can define the configuration options in the + module that calls :meth:`from_object` or provide an import path to + a module that should be loaded. It is also possible to tell it to + use the same module and with that provide the configuration values + just before the call:: + + DEBUG = True + SECRET_KEY = 'development key' + app.config.from_object(__name__) + + In both cases (loading from any Python file or loading from modules), + only uppercase keys are added to the config. This makes it possible to use + lowercase values in the config file for temporary values that are not added + to the config or to define the config keys in the same file that implements + the application. + + Probably the most interesting way to load configurations is from an + environment variable pointing to a file:: + + app.config.from_envvar('YOURAPPLICATION_SETTINGS') + + In this case before launching the application you have to set this + environment variable to the file you want to use. On Linux and OS X + use the export statement:: + + export YOURAPPLICATION_SETTINGS='/path/to/config/file' + + On windows use `set` instead. + + :param root_path: path to which files are read relative from. When the + config object is created by the application, this is + the application's :attr:`~flask.Flask.root_path`. + :param defaults: an optional dictionary of default values + """ + + def __init__( + self, root_path: str | os.PathLike, defaults: dict | None = None + ) -> None: + super().__init__(defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name: str, silent: bool = False) -> bool: + """Loads a configuration from an environment variable pointing to + a configuration file. This is basically just a shortcut with nicer + error messages for this line of code:: + + app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) + + :param variable_name: name of the environment variable + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError( + f"The environment variable {variable_name!r} is not set" + " and as such configuration could not be loaded. Set" + " this variable and make it point to a configuration" + " file" + ) + return self.from_pyfile(rv, silent=silent) + + def from_prefixed_env( + self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads + ) -> bool: + """Load any environment variables that start with ``FLASK_``, + dropping the prefix from the env key for the config key. Values + are passed through a loading function to attempt to convert them + to more specific types than strings. + + Keys are loaded in :func:`sorted` order. + + The default loading function attempts to parse values as any + valid JSON type, including dicts and lists. + + Specific items in nested dicts can be set by separating the + keys with double underscores (``__``). If an intermediate key + doesn't exist, it will be initialized to an empty dict. + + :param prefix: Load env vars that start with this prefix, + separated with an underscore (``_``). + :param loads: Pass each string value to this function and use + the returned value as the config value. If any error is + raised it is ignored and the value remains a string. The + default is :func:`json.loads`. + + .. versionadded:: 2.1 + """ + prefix = f"{prefix}_" + len_prefix = len(prefix) + + for key in sorted(os.environ): + if not key.startswith(prefix): + continue + + value = os.environ[key] + + try: + value = loads(value) + except Exception: + # Keep the value as a string if loading failed. + pass + + # Change to key.removeprefix(prefix) on Python >= 3.9. + key = key[len_prefix:] + + if "__" not in key: + # A non-nested key, set directly. + self[key] = value + continue + + # Traverse nested dictionaries with keys separated by "__". + current = self + *parts, tail = key.split("__") + + for part in parts: + # If an intermediate dict does not exist, create it. + if part not in current: + current[part] = {} + + current = current[part] + + current[tail] = value + + return True + + def from_pyfile(self, filename: str | os.PathLike, silent: bool = False) -> bool: + """Updates the values in the config from a Python file. This function + behaves as if the file was imported as module with the + :meth:`from_object` function. + + :param filename: the filename of the config. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + + .. versionadded:: 0.7 + `silent` parameter. + """ + filename = os.path.join(self.root_path, filename) + d = types.ModuleType("config") + d.__file__ = filename + try: + with open(filename, mode="rb") as config_file: + exec(compile(config_file.read(), filename, "exec"), d.__dict__) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): + return False + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + self.from_object(d) + return True + + def from_object(self, obj: object | str) -> None: + """Updates the values from the given object. An object can be of one + of the following two types: + + - a string: in this case the object with that name will be imported + - an actual object reference: that object is used directly + + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. + + Example of module-based configuration:: + + app.config.from_object('yourapplication.default_config') + from yourapplication import default_config + app.config.from_object(default_config) + + Nothing is done to the object before loading. If the object is a + class and has ``@property`` attributes, it needs to be + instantiated before being passed to this method. + + You should not use this function to load the actual configuration but + rather configuration defaults. The actual config should be loaded + with :meth:`from_pyfile` and ideally from a location not within the + package because the package might be installed system wide. + + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + + :param obj: an import name or object + """ + if isinstance(obj, str): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_file( + self, + filename: str | os.PathLike, + load: t.Callable[[t.IO[t.Any]], t.Mapping], + silent: bool = False, + text: bool = True, + ) -> bool: + """Update the values in the config from a file that is loaded + using the ``load`` parameter. The loaded data is passed to the + :meth:`from_mapping` method. + + .. code-block:: python + + import json + app.config.from_file("config.json", load=json.load) + + import tomllib + app.config.from_file("config.toml", load=tomllib.load, text=False) + + :param filename: The path to the data file. This can be an + absolute path or relative to the config root path. + :param load: A callable that takes a file handle and returns a + mapping of loaded data from the file. + :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` + implements a ``read`` method. + :param silent: Ignore the file if it doesn't exist. + :param text: Open the file in text or binary mode. + :return: ``True`` if the file was loaded successfully. + + .. versionchanged:: 2.3 + The ``text`` parameter was added. + + .. versionadded:: 2.0 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename, "r" if text else "rb") as f: + obj = load(f) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + + return self.from_mapping(obj) + + def from_mapping( + self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any + ) -> bool: + """Updates the config like :meth:`update` ignoring items with + non-upper keys. + + :return: Always returns ``True``. + + .. versionadded:: 0.11 + """ + mappings: dict[str, t.Any] = {} + if mapping is not None: + mappings.update(mapping) + mappings.update(kwargs) + for key, value in mappings.items(): + if key.isupper(): + self[key] = value + return True + + def get_namespace( + self, namespace: str, lowercase: bool = True, trim_namespace: bool = True + ) -> dict[str, t.Any]: + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in self.items(): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace) :] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + + def __repr__(self) -> str: + return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/Meliora/gmapenv/Lib/site-packages/flask/ctx.py b/Meliora/gmapenv/Lib/site-packages/flask/ctx.py new file mode 100644 index 00000000..b37e4e04 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/ctx.py @@ -0,0 +1,440 @@ +from __future__ import annotations + +import contextvars +import sys +import typing as t +from functools import update_wrapper +from types import TracebackType + +from werkzeug.exceptions import HTTPException + +from . import typing as ft +from .globals import _cv_app +from .globals import _cv_request +from .signals import appcontext_popped +from .signals import appcontext_pushed + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .sessions import SessionMixin + from .wrappers import Request + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals: + """A plain object. Used as a namespace for storing data during an + application context. + + Creating an app context automatically creates this object, which is + made available as the :data:`g` proxy. + + .. describe:: 'key' in g + + Check whether an attribute is present. + + .. versionadded:: 0.10 + + .. describe:: iter(g) + + Return an iterator over the attribute names. + + .. versionadded:: 0.10 + """ + + # Define attr methods to let mypy know this is a namespace object + # that has arbitrary attributes. + + def __getattr__(self, name: str) -> t.Any: + try: + return self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def __setattr__(self, name: str, value: t.Any) -> None: + self.__dict__[name] = value + + def __delattr__(self, name: str) -> None: + try: + del self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def get(self, name: str, default: t.Any | None = None) -> t.Any: + """Get an attribute by name, or a default value. Like + :meth:`dict.get`. + + :param name: Name of attribute to get. + :param default: Value to return if the attribute is not present. + + .. versionadded:: 0.10 + """ + return self.__dict__.get(name, default) + + def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: + """Get and remove an attribute by name. Like :meth:`dict.pop`. + + :param name: Name of attribute to pop. + :param default: Value to return if the attribute is not present, + instead of raising a ``KeyError``. + + .. versionadded:: 0.11 + """ + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name: str, default: t.Any = None) -> t.Any: + """Get the value of an attribute if it is present, otherwise + set and return a default value. Like :meth:`dict.setdefault`. + + :param name: Name of attribute to get. + :param default: Value to set and return if the attribute is not + present. + + .. versionadded:: 0.11 + """ + return self.__dict__.setdefault(name, default) + + def __contains__(self, item: str) -> bool: + return item in self.__dict__ + + def __iter__(self) -> t.Iterator[str]: + return iter(self.__dict__) + + def __repr__(self) -> str: + ctx = _cv_app.get(None) + if ctx is not None: + return f"" + return object.__repr__(self) + + +def after_this_request(f: ft.AfterRequestCallable) -> ft.AfterRequestCallable: + """Executes a function after this request. This is useful to modify + response objects. The function is passed the response object and has + to return the same or a new one. + + Example:: + + @app.route('/') + def index(): + @after_this_request + def add_header(response): + response.headers['X-Foo'] = 'Parachute' + return response + return 'Hello World!' + + This is more useful if a function other than the view function wants to + modify a response. For instance think of a decorator that wants to add + some headers without converting the return value into a response object. + + .. versionadded:: 0.9 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'after_this_request' can only be used when a request" + " context is active, such as in a view function." + ) + + ctx._after_request_functions.append(f) + return f + + +def copy_current_request_context(f: t.Callable) -> t.Callable: + """A helper function that decorates a function to retain the current + request context. This is useful when working with greenlets. The moment + the function is decorated a copy of the request context is created and + then pushed when the function is called. The current session is also + included in the copied request context. + + Example:: + + import gevent + from flask import copy_current_request_context + + @app.route('/') + def index(): + @copy_current_request_context + def do_some_work(): + # do some work here, it can access flask.request or + # flask.session like you would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'copy_current_request_context' can only be used when a" + " request context is active, such as in a view function." + ) + + ctx = ctx.copy() + + def wrapper(*args, **kwargs): + with ctx: + return ctx.app.ensure_sync(f)(*args, **kwargs) + + return update_wrapper(wrapper, f) + + +def has_request_context() -> bool: + """If you have code that wants to test if a request context is there or + not this function can be used. For instance, you may want to take advantage + of request information if the request object is available, but fail + silently if it is unavailable. + + :: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and has_request_context(): + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + Alternatively you can also just test any of the context bound objects + (such as :class:`request` or :class:`g`) for truthness:: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and request: + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + .. versionadded:: 0.7 + """ + return _cv_request.get(None) is not None + + +def has_app_context() -> bool: + """Works like :func:`has_request_context` but for the application + context. You can also just do a boolean check on the + :data:`current_app` object instead. + + .. versionadded:: 0.9 + """ + return _cv_app.get(None) is not None + + +class AppContext: + """The app context contains application-specific information. An app + context is created and pushed at the beginning of each request if + one is not already active. An app context is also pushed when + running CLI commands. + """ + + def __init__(self, app: Flask) -> None: + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g: _AppCtxGlobals = app.app_ctx_globals_class() + self._cv_tokens: list[contextvars.Token] = [] + + def push(self) -> None: + """Binds the app context to the current context.""" + self._cv_tokens.append(_cv_app.set(self)) + appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the app context.""" + try: + if len(self._cv_tokens) == 1: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + ctx = _cv_app.get() + _cv_app.reset(self._cv_tokens.pop()) + + if ctx is not self: + raise AssertionError( + f"Popped wrong app context. ({ctx!r} instead of {self!r})" + ) + + appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) + + def __enter__(self) -> AppContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + +class RequestContext: + """The request context contains per-request information. The Flask + app creates and pushes it at the beginning of the request, then pops + it at the end of the request. It will create the URL adapter and + request object for the WSGI environment provided. + + Do not attempt to use this class directly, instead use + :meth:`~flask.Flask.test_request_context` and + :meth:`~flask.Flask.request_context` to create this object. + + When the request context is popped, it will evaluate all the + functions registered on the application for teardown execution + (:meth:`~flask.Flask.teardown_request`). + + The request context is automatically popped at the end of the + request. When using the interactive debugger, the context will be + restored so ``request`` is still accessible. Similarly, the test + client can preserve the context after the request ends. However, + teardown functions may already have closed some resources such as + database connections. + """ + + def __init__( + self, + app: Flask, + environ: dict, + request: Request | None = None, + session: SessionMixin | None = None, + ) -> None: + self.app = app + if request is None: + request = app.request_class(environ) + request.json_module = app.json + self.request: Request = request + self.url_adapter = None + try: + self.url_adapter = app.create_url_adapter(self.request) + except HTTPException as e: + self.request.routing_exception = e + self.flashes: list[tuple[str, str]] | None = None + self.session: SessionMixin | None = session + # Functions that should be executed after the request on the response + # object. These will be called before the regular "after_request" + # functions. + self._after_request_functions: list[ft.AfterRequestCallable] = [] + + self._cv_tokens: list[tuple[contextvars.Token, AppContext | None]] = [] + + def copy(self) -> RequestContext: + """Creates a copy of this request context with the same request object. + This can be used to move a request context to a different greenlet. + Because the actual request object is the same this cannot be used to + move a request context to a different thread unless access to the + request object is locked. + + .. versionadded:: 0.10 + + .. versionchanged:: 1.1 + The current session object is used instead of reloading the original + data. This prevents `flask.session` pointing to an out-of-date object. + """ + return self.__class__( + self.app, + environ=self.request.environ, + request=self.request, + session=self.session, + ) + + def match_request(self) -> None: + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + result = self.url_adapter.match(return_rule=True) # type: ignore + self.request.url_rule, self.request.view_args = result # type: ignore + except HTTPException as e: + self.request.routing_exception = e + + def push(self) -> None: + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _cv_app.get(None) + + if app_ctx is None or app_ctx.app is not self.app: + app_ctx = self.app.app_context() + app_ctx.push() + else: + app_ctx = None + + self._cv_tokens.append((_cv_request.set(self), app_ctx)) + + # Open the session at the moment that the request context is available. + # This allows a custom open_session method to use the request context. + # Only open a new session if this is the first time the request was + # pushed, otherwise stream_with_context loses the session. + if self.session is None: + session_interface = self.app.session_interface + self.session = session_interface.open_session(self.app, self.request) + + if self.session is None: + self.session = session_interface.make_null_session(self.app) + + # Match the request URL after loading the session, so that the + # session is available in custom URL converters. + if self.url_adapter is not None: + self.match_request() + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the request context and unbinds it by doing that. This will + also trigger the execution of functions registered by the + :meth:`~flask.Flask.teardown_request` decorator. + + .. versionchanged:: 0.9 + Added the `exc` argument. + """ + clear_request = len(self._cv_tokens) == 1 + + try: + if clear_request: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + request_close = getattr(self.request, "close", None) + if request_close is not None: + request_close() + finally: + ctx = _cv_request.get() + token, app_ctx = self._cv_tokens.pop() + _cv_request.reset(token) + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + ctx.request.environ["werkzeug.request"] = None + + if app_ctx is not None: + app_ctx.pop(exc) + + if ctx is not self: + raise AssertionError( + f"Popped wrong request context. ({ctx!r} instead of {self!r})" + ) + + def __enter__(self) -> RequestContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + def __repr__(self) -> str: + return ( + f"<{type(self).__name__} {self.request.url!r}" + f" [{self.request.method}] of {self.app.name}>" + ) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/debughelpers.py b/Meliora/gmapenv/Lib/site-packages/flask/debughelpers.py new file mode 100644 index 00000000..e8360043 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/debughelpers.py @@ -0,0 +1,160 @@ +from __future__ import annotations + +import typing as t + +from .blueprints import Blueprint +from .globals import request_ctx +from .sansio.app import App + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +class DebugFilesKeyError(KeyError, AssertionError): + """Raised from request.files during debugging. The idea is that it can + provide a better error message than just a generic KeyError/BadRequest. + """ + + def __init__(self, request, key): + form_matches = request.form.getlist(key) + buf = [ + f"You tried to access the file {key!r} in the request.files" + " dictionary but it does not exist. The mimetype for the" + f" request is {request.mimetype!r} instead of" + " 'multipart/form-data' which means that no file contents" + " were transmitted. To fix this error you should provide" + ' enctype="multipart/form-data" in your form.' + ] + if form_matches: + names = ", ".join(repr(x) for x in form_matches) + buf.append( + "\n\nThe browser instead transmitted some file names. " + f"This was submitted: {names}" + ) + self.msg = "".join(buf) + + def __str__(self): + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised in debug mode if a routing redirect + would cause the browser to drop the method or body. This happens + when method is not GET, HEAD or OPTIONS and the status code is not + 307 or 308. + """ + + def __init__(self, request): + exc = request.routing_exception + buf = [ + f"A request was sent to '{request.url}', but routing issued" + f" a redirect to the canonical URL '{exc.new_url}'." + ] + + if f"{request.base_url}/" == exc.new_url.partition("?")[0]: + buf.append( + " The URL was defined with a trailing slash. Flask" + " will redirect to the URL with a trailing slash if it" + " was accessed without one." + ) + + buf.append( + " Send requests to the canonical URL, or use 307 or 308 for" + " routing redirects. Otherwise, browsers will drop form" + " data.\n\n" + "This exception is only raised in debug mode." + ) + super().__init__("".join(buf)) + + +def attach_enctype_error_multidict(request): + """Patch ``request.files.__getitem__`` to raise a descriptive error + about ``enctype=multipart/form-data``. + + :param request: The request to patch. + :meta private: + """ + oldcls = request.files.__class__ + + class newcls(oldcls): + def __getitem__(self, key): + try: + return super().__getitem__(key) + except KeyError as e: + if key not in request.form: + raise + + raise DebugFilesKeyError(request, key).with_traceback( + e.__traceback__ + ) from None + + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader) -> t.Generator: + yield f"class: {type(loader).__module__}.{type(loader).__name__}" + for key, value in sorted(loader.__dict__.items()): + if key.startswith("_"): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, str) for x in value): + continue + yield f"{key}:" + for item in value: + yield f" - {item}" + continue + elif not isinstance(value, (str, int, float, bool)): + continue + yield f"{key}: {value!r}" + + +def explain_template_loading_attempts(app: App, template, attempts) -> None: + """This should help developers understand what failed""" + info = [f"Locating template {template!r}:"] + total_found = 0 + blueprint = None + if request_ctx and request_ctx.request.blueprint is not None: + blueprint = request_ctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, App): + src_info = f"application {srcobj.import_name!r}" + elif isinstance(srcobj, Blueprint): + src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" + else: + src_info = repr(srcobj) + + info.append(f"{idx + 1:5}: trying loader of {src_info}") + + for line in _dump_loader_info(loader): + info.append(f" {line}") + + if triple is None: + detail = "no match" + else: + detail = f"found ({triple[1] or ''!r})" + total_found += 1 + info.append(f" -> {detail}") + + seems_fishy = False + if total_found == 0: + info.append("Error: the template could not be found.") + seems_fishy = True + elif total_found > 1: + info.append("Warning: multiple loaders returned a match for the template.") + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append( + " The template was looked up from an endpoint that belongs" + f" to the blueprint {blueprint!r}." + ) + info.append(" Maybe you did not place a template in the right folder?") + info.append(" See https://flask.palletsprojects.com/blueprints/#templates") + + app.logger.info("\n".join(info)) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/globals.py b/Meliora/gmapenv/Lib/site-packages/flask/globals.py new file mode 100644 index 00000000..e2c410cc --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/globals.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import typing as t +from contextvars import ContextVar + +from werkzeug.local import LocalProxy + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .ctx import _AppCtxGlobals + from .ctx import AppContext + from .ctx import RequestContext + from .sessions import SessionMixin + from .wrappers import Request + + +_no_app_msg = """\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +the current application. To solve this, set up an application context +with app.app_context(). See the documentation for more information.\ +""" +_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") +app_ctx: AppContext = LocalProxy( # type: ignore[assignment] + _cv_app, unbound_message=_no_app_msg +) +current_app: Flask = LocalProxy( # type: ignore[assignment] + _cv_app, "app", unbound_message=_no_app_msg +) +g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] + _cv_app, "g", unbound_message=_no_app_msg +) + +_no_req_msg = """\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +""" +_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") +request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] + _cv_request, unbound_message=_no_req_msg +) +request: Request = LocalProxy( # type: ignore[assignment] + _cv_request, "request", unbound_message=_no_req_msg +) +session: SessionMixin = LocalProxy( # type: ignore[assignment] + _cv_request, "session", unbound_message=_no_req_msg +) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/helpers.py b/Meliora/gmapenv/Lib/site-packages/flask/helpers.py new file mode 100644 index 00000000..13a5aa21 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/helpers.py @@ -0,0 +1,623 @@ +from __future__ import annotations + +import importlib.util +import os +import sys +import typing as t +from datetime import datetime +from functools import lru_cache +from functools import update_wrapper + +import werkzeug.utils +from werkzeug.exceptions import abort as _wz_abort +from werkzeug.utils import redirect as _wz_redirect + +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .globals import request_ctx +from .globals import session +from .signals import message_flashed + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.wrappers import Response as BaseResponse + from .wrappers import Response + + +def get_debug_flag() -> bool: + """Get whether debug mode should be enabled for the app, indicated by the + :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. + """ + val = os.environ.get("FLASK_DEBUG") + return bool(val and val.lower() not in {"0", "false", "no"}) + + +def get_load_dotenv(default: bool = True) -> bool: + """Get whether the user has disabled loading default dotenv files by + setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load + the files. + + :param default: What to return if the env var isn't set. + """ + val = os.environ.get("FLASK_SKIP_DOTENV") + + if not val: + return default + + return val.lower() in ("0", "false", "no") + + +def stream_with_context( + generator_or_function: ( + t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]] + ) +) -> t.Iterator[t.AnyStr]: + """Request contexts disappear when the response is started on the server. + This is done for efficiency reasons and to make it less likely to encounter + memory leaks with badly written WSGI middlewares. The downside is that if + you are using streamed responses, the generator cannot access request bound + information any more. + + This function however can help you keep the context around for longer:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + @stream_with_context + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(generate()) + + Alternatively it can also be used around a specific generator:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(stream_with_context(generate())) + + .. versionadded:: 0.9 + """ + try: + gen = iter(generator_or_function) # type: ignore + except TypeError: + + def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: + gen = generator_or_function(*args, **kwargs) # type: ignore + return stream_with_context(gen) + + return update_wrapper(decorator, generator_or_function) # type: ignore + + def generator() -> t.Generator: + ctx = _cv_request.get(None) + if ctx is None: + raise RuntimeError( + "'stream_with_context' can only be used when a request" + " context is active, such as in a view function." + ) + with ctx: + # Dummy sentinel. Has to be inside the context block or we're + # not actually keeping the context around. + yield None + + # The try/finally is here so that if someone passes a WSGI level + # iterator in we're still running the cleanup logic. Generators + # don't need that because they are closed on their destruction + # automatically. + try: + yield from gen + finally: + if hasattr(gen, "close"): + gen.close() + + # The trick is to start the generator. Then the code execution runs until + # the first dummy None is yielded at which point the context was already + # pushed. This item is discarded. Then when the iteration continues the + # real generator is executed. + wrapped_g = generator() + next(wrapped_g) + return wrapped_g + + +def make_response(*args: t.Any) -> Response: + """Sometimes it is necessary to set additional headers in a view. Because + views do not have to return response objects but can return a value that + is converted into a response object by Flask itself, it becomes tricky to + add headers to it. This function can be called instead of using a return + and you will get a response object which you can use to attach headers. + + If view looked like this and you want to add a new header:: + + def index(): + return render_template('index.html', foo=42) + + You can now do something like this:: + + def index(): + response = make_response(render_template('index.html', foo=42)) + response.headers['X-Parachutes'] = 'parachutes are cool' + return response + + This function accepts the very same arguments you can return from a + view function. This for example creates a response with a 404 error + code:: + + response = make_response(render_template('not_found.html'), 404) + + The other use case of this function is to force the return value of a + view function into a response which is helpful with view + decorators:: + + response = make_response(view_function()) + response.headers['X-Parachutes'] = 'parachutes are cool' + + Internally this function does the following things: + + - if no arguments are passed, it creates a new response argument + - if one argument is passed, :meth:`flask.Flask.make_response` + is invoked with it. + - if more than one argument is passed, the arguments are passed + to the :meth:`flask.Flask.make_response` function as tuple. + + .. versionadded:: 0.6 + """ + if not args: + return current_app.response_class() + if len(args) == 1: + args = args[0] + return current_app.make_response(args) # type: ignore + + +def url_for( + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, +) -> str: + """Generate a URL to the given endpoint with the given values. + + This requires an active request or application context, and calls + :meth:`current_app.url_for() `. See that method + for full documentation. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it is + external. + :param _external: If given, prefer the URL to be internal (False) or + require it to be external (True). External URLs include the + scheme and domain. When not in an active request, URLs are + external by default. + :param values: Values to use for the variable parts of the URL rule. + Unknown keys are appended as query string arguments, like + ``?a=b&c=d``. + + .. versionchanged:: 2.2 + Calls ``current_app.url_for``, allowing an app to override the + behavior. + + .. versionchanged:: 0.10 + The ``_scheme`` parameter was added. + + .. versionchanged:: 0.9 + The ``_anchor`` and ``_method`` parameters were added. + + .. versionchanged:: 0.9 + Calls ``app.handle_url_build_error`` on build errors. + """ + return current_app.url_for( + endpoint, + _anchor=_anchor, + _method=_method, + _scheme=_scheme, + _external=_external, + **values, + ) + + +def redirect( + location: str, code: int = 302, Response: type[BaseResponse] | None = None +) -> BaseResponse: + """Create a redirect response object. + + If :data:`~flask.current_app` is available, it will use its + :meth:`~flask.Flask.redirect` method, otherwise it will use + :func:`werkzeug.utils.redirect`. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + :param Response: The response class to use. Not used when + ``current_app`` is active, which uses ``app.response_class``. + + .. versionadded:: 2.2 + Calls ``current_app.redirect`` if available instead of always + using Werkzeug's default ``redirect``. + """ + if current_app: + return current_app.redirect(location, code=code) + + return _wz_redirect(location, code=code, Response=Response) + + +def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given + status code. + + If :data:`~flask.current_app` is available, it will call its + :attr:`~flask.Flask.aborter` object, otherwise it will use + :func:`werkzeug.exceptions.abort`. + + :param code: The status code for the exception, which must be + registered in ``app.aborter``. + :param args: Passed to the exception. + :param kwargs: Passed to the exception. + + .. versionadded:: 2.2 + Calls ``current_app.aborter`` if available instead of always + using Werkzeug's default ``abort``. + """ + if current_app: + current_app.aborter(code, *args, **kwargs) + + _wz_abort(code, *args, **kwargs) + + +def get_template_attribute(template_name: str, attribute: str) -> t.Any: + """Loads a macro (or variable) a template exports. This can be used to + invoke a macro from within Python code. If you for example have a + template named :file:`_cider.html` with the following contents: + + .. sourcecode:: html+jinja + + {% macro hello(name) %}Hello {{ name }}!{% endmacro %} + + You can access this from Python code like this:: + + hello = get_template_attribute('_cider.html', 'hello') + return hello('World') + + .. versionadded:: 0.2 + + :param template_name: the name of the template + :param attribute: the name of the variable of macro to access + """ + return getattr(current_app.jinja_env.get_template(template_name).module, attribute) + + +def flash(message: str, category: str = "message") -> None: + """Flashes a message to the next request. In order to remove the + flashed message from the session and to display it to the user, + the template has to call :func:`get_flashed_messages`. + + .. versionchanged:: 0.3 + `category` parameter added. + + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string can be used as category. + """ + # Original implementation: + # + # session.setdefault('_flashes', []).append((category, message)) + # + # This assumed that changes made to mutable structures in the session are + # always in sync with the session object, which is not true for session + # implementations that use external storage for keeping their keys/values. + flashes = session.get("_flashes", []) + flashes.append((category, message)) + session["_flashes"] = flashes + app = current_app._get_current_object() # type: ignore + message_flashed.send( + app, + _async_wrapper=app.ensure_sync, + message=message, + category=category, + ) + + +def get_flashed_messages( + with_categories: bool = False, category_filter: t.Iterable[str] = () +) -> list[str] | list[tuple[str, str]]: + """Pulls all flashed messages from the session and returns them. + Further calls in the same request to the function will return + the same messages. By default just the messages are returned, + but when `with_categories` is set to ``True``, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Filter the flashed messages to one or more categories by providing those + categories in `category_filter`. This allows rendering categories in + separate html blocks. The `with_categories` and `category_filter` + arguments are distinct: + + * `with_categories` controls whether categories are returned with message + text (``True`` gives a tuple, where ``False`` gives just the message text). + * `category_filter` filters the messages down to only those matching the + provided categories. + + See :doc:`/patterns/flashing` for examples. + + .. versionchanged:: 0.3 + `with_categories` parameter added. + + .. versionchanged:: 0.9 + `category_filter` parameter added. + + :param with_categories: set to ``True`` to also receive categories. + :param category_filter: filter of categories to limit return values. Only + categories in the list will be returned. + """ + flashes = request_ctx.flashes + if flashes is None: + flashes = session.pop("_flashes") if "_flashes" in session else [] + request_ctx.flashes = flashes + if category_filter: + flashes = list(filter(lambda f: f[0] in category_filter, flashes)) + if not with_categories: + return [x[1] for x in flashes] + return flashes + + +def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: + if kwargs.get("max_age") is None: + kwargs["max_age"] = current_app.get_send_file_max_age + + kwargs.update( + environ=request.environ, + use_x_sendfile=current_app.config["USE_X_SENDFILE"], + response_class=current_app.response_class, + _root_path=current_app.root_path, # type: ignore + ) + return kwargs + + +def send_file( + path_or_file: os.PathLike | str | t.BinaryIO, + mimetype: str | None = None, + as_attachment: bool = False, + download_name: str | None = None, + conditional: bool = True, + etag: bool | str = True, + last_modified: datetime | int | float | None = None, + max_age: None | (int | t.Callable[[str | None], int | None]) = None, +) -> Response: + """Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file and + get extra information from the path. Passing a file-like object + requires that the file is opened in binary mode, and is mostly + useful when building a file in memory with :class:`io.BytesIO`. + + Never pass file paths provided by a user. The path is assumed to be + trusted, so a user could craft a path to access a file you didn't + intend. Use :func:`send_from_directory` to safely serve + user-requested paths from within a directory. + + If the WSGI server sets a ``file_wrapper`` in ``environ``, it is + used, otherwise Werkzeug's built-in wrapper is used. Alternatively, + if the HTTP server supports ``X-Sendfile``, configuring Flask with + ``USE_X_SENDFILE = True`` will tell the server to send the given + path, which is much more efficient than reading it in Python. + + :param path_or_file: The path to the file to send, relative to the + current working directory if a relative path is given. + Alternatively, a file-like object opened in binary mode. Make + sure the file pointer is seeked to the start of the data. + :param mimetype: The MIME type to send for the file. If not + provided, it will try to detect it from the file name. + :param as_attachment: Indicate to a browser that it should offer to + save the file instead of displaying it. + :param download_name: The default name browsers will use when saving + the file. Defaults to the passed file name. + :param conditional: Enable conditional and range responses based on + request headers. Requires passing a file path and ``environ``. + :param etag: Calculate an ETag for the file, which requires passing + a file path. Can also be a string to use instead. + :param last_modified: The last modified time to send for the file, + in seconds. If not provided, it will try to detect it from the + file path. + :param max_age: How long the client should cache the file, in + seconds. If set, ``Cache-Control`` will be ``public``, otherwise + it will be ``no-cache`` to prefer conditional caching. + + .. versionchanged:: 2.0 + ``download_name`` replaces the ``attachment_filename`` + parameter. If ``as_attachment=False``, it is passed with + ``Content-Disposition: inline`` instead. + + .. versionchanged:: 2.0 + ``max_age`` replaces the ``cache_timeout`` parameter. + ``conditional`` is enabled and ``max_age`` is not set by + default. + + .. versionchanged:: 2.0 + ``etag`` replaces the ``add_etags`` parameter. It can be a + string to use instead of generating one. + + .. versionchanged:: 2.0 + Passing a file-like object that inherits from + :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather + than sending an empty file. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionchanged:: 1.1 + ``filename`` may be a :class:`~os.PathLike` object. + + .. versionchanged:: 1.1 + Passing a :class:`~io.BytesIO` object supports range requests. + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + .. versionchanged:: 1.0 + UTF-8 filenames as specified in :rfc:`2231` are supported. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file + objects. If you want to use automatic MIME and etag support, + pass a filename via ``filename_or_fp`` or + ``attachment_filename``. + + .. versionchanged:: 0.12 + ``attachment_filename`` is preferred over ``filename`` for MIME + detection. + + .. versionchanged:: 0.9 + ``cache_timeout`` defaults to + :meth:`Flask.get_send_file_max_age`. + + .. versionchanged:: 0.7 + MIME guessing and etag support for file-like objects was + removed because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. + + .. versionchanged:: 0.5 + The ``add_etags``, ``cache_timeout`` and ``conditional`` + parameters were added. The default behavior is to add etags. + + .. versionadded:: 0.2 + """ + return werkzeug.utils.send_file( # type: ignore[return-value] + **_prepare_send_file_kwargs( + path_or_file=path_or_file, + environ=request.environ, + mimetype=mimetype, + as_attachment=as_attachment, + download_name=download_name, + conditional=conditional, + etag=etag, + last_modified=last_modified, + max_age=max_age, + ) + ) + + +def send_from_directory( + directory: os.PathLike | str, + path: os.PathLike | str, + **kwargs: t.Any, +) -> Response: + """Send a file from within a directory using :func:`send_file`. + + .. code-block:: python + + @app.route("/uploads/") + def download_file(name): + return send_from_directory( + app.config['UPLOAD_FOLDER'], name, as_attachment=True + ) + + This is a secure way to serve files from a folder, such as static + files or uploads. Uses :func:`~werkzeug.security.safe_join` to + ensure the path coming from the client is not maliciously crafted to + point outside the specified directory. + + If the final path does not point to an existing regular file, + raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. + + :param directory: The directory that ``path`` must be located under, + relative to the current application's root path. + :param path: The path to the file to send, relative to + ``directory``. + :param kwargs: Arguments to pass to :func:`send_file`. + + .. versionchanged:: 2.0 + ``path`` replaces the ``filename`` parameter. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionadded:: 0.5 + """ + return werkzeug.utils.send_from_directory( # type: ignore[return-value] + directory, path, **_prepare_send_file_kwargs(**kwargs) + ) + + +def get_root_path(import_name: str) -> str: + """Find the root path of a package, or the path that contains a + module. If it cannot be found, returns the current working + directory. + + Not to be confused with the value returned by :func:`find_package`. + + :meta private: + """ + # Module already imported and has a file attribute. Use that first. + mod = sys.modules.get(import_name) + + if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None: + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + try: + spec = importlib.util.find_spec(import_name) + + if spec is None: + raise ValueError + except (ImportError, ValueError): + loader = None + else: + loader = spec.loader + + # Loader does not exist or we're referring to an unloaded main + # module or a main module without path (interactive sessions), go + # with the current working directory. + if loader is None: + return os.getcwd() + + if hasattr(loader, "get_filename"): + filepath = loader.get_filename(import_name) + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, "__file__", None) + + # If we don't have a file path it might be because it is a + # namespace package. In this case pick the root path from the + # first module that is contained in the package. + if filepath is None: + raise RuntimeError( + "No root path can be found for the provided module" + f" {import_name!r}. This can happen because the module" + " came from an import hook that does not provide file" + " name information or because it's a namespace package." + " In this case the root path needs to be explicitly" + " provided." + ) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) + + +@lru_cache(maxsize=None) +def _split_blueprint_path(name: str) -> list[str]: + out: list[str] = [name] + + if "." in name: + out.extend(_split_blueprint_path(name.rpartition(".")[0])) + + return out diff --git a/Meliora/gmapenv/Lib/site-packages/flask/json/__init__.py b/Meliora/gmapenv/Lib/site-packages/flask/json/__init__.py new file mode 100644 index 00000000..f15296fe --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/json/__init__.py @@ -0,0 +1,170 @@ +from __future__ import annotations + +import json as _json +import typing as t + +from ..globals import current_app +from .provider import _default + +if t.TYPE_CHECKING: # pragma: no cover + from ..wrappers import Response + + +def dumps(obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dumps() ` + method, otherwise it will use :func:`json.dumps`. + + :param obj: The data to serialize. + :param kwargs: Arguments passed to the ``dumps`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dumps``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.dumps(obj, **kwargs) + + kwargs.setdefault("default", _default) + return _json.dumps(obj, **kwargs) + + +def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dump() ` + method, otherwise it will use :func:`json.dump`. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: Arguments passed to the ``dump`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dump``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + Writing to a binary file, and the ``encoding`` argument, will be + removed in Flask 2.1. + """ + if current_app: + current_app.json.dump(obj, fp, **kwargs) + else: + kwargs.setdefault("default", _default) + _json.dump(obj, fp, **kwargs) + + +def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.loads() ` + method, otherwise it will use :func:`json.loads`. + + :param s: Text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``loads`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.loads``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The data must be a + string or UTF-8 bytes. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.loads(s, **kwargs) + + return _json.loads(s, **kwargs) + + +def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.load() ` + method, otherwise it will use :func:`json.load`. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``load`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.load``, allowing an app to override + the behavior. + + .. versionchanged:: 2.2 + The ``app`` parameter will be removed in Flask 2.3. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The file must be text + mode, or binary mode with UTF-8 bytes. + """ + if current_app: + return current_app.json.load(fp, **kwargs) + + return _json.load(fp, **kwargs) + + +def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. A dict or list returned from a view will be converted to a + JSON response automatically without needing to call this. + + This requires an active request or application context, and calls + :meth:`app.json.response() `. + + In debug mode, the output is formatted with indentation to make it + easier to read. This may also be controlled by the provider. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + + .. versionchanged:: 2.2 + Calls ``current_app.json.response``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 0.11 + Added support for serializing top-level arrays. This was a + security risk in ancient browsers. See :ref:`security-json`. + + .. versionadded:: 0.2 + """ + return current_app.json.response(*args, **kwargs) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14ef399aec046b8cb02d77087872c19e73efd7b9 GIT binary patch literal 5971 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/json/provider.py b/Meliora/gmapenv/Lib/site-packages/flask/json/provider.py new file mode 100644 index 00000000..3c22bc8f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/json/provider.py @@ -0,0 +1,216 @@ +from __future__ import annotations + +import dataclasses +import decimal +import json +import typing as t +import uuid +import weakref +from datetime import date + +from werkzeug.http import http_date + +if t.TYPE_CHECKING: # pragma: no cover + from ..sansio.app import App + from ..wrappers import Response + + +class JSONProvider: + """A standard set of JSON operations for an application. Subclasses + of this can be used to customize JSON behavior or use different + JSON libraries. + + To implement a provider for a specific library, subclass this base + class and implement at least :meth:`dumps` and :meth:`loads`. All + other methods have default implementations. + + To use a different provider, either subclass ``Flask`` and set + :attr:`~flask.Flask.json_provider_class` to a provider class, or set + :attr:`app.json ` to an instance of the class. + + :param app: An application instance. This will be stored as a + :class:`weakref.proxy` on the :attr:`_app` attribute. + + .. versionadded:: 2.2 + """ + + def __init__(self, app: App) -> None: + self._app = weakref.proxy(app) + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + :param obj: The data to serialize. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: May be passed to the underlying JSON library. + """ + fp.write(self.dumps(obj, **kwargs)) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + :param s: Text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + return self.loads(fp.read(), **kwargs) + + def _prepare_response_obj( + self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] + ) -> t.Any: + if args and kwargs: + raise TypeError("app.json.response() takes either args or kwargs, not both") + + if not args and not kwargs: + return None + + if len(args) == 1: + return args[0] + + return args or kwargs + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. + + The :func:`~flask.json.jsonify` function calls this method for + the current application. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + return self._app.response_class(self.dumps(obj), mimetype="application/json") + + +def _default(o: t.Any) -> t.Any: + if isinstance(o, date): + return http_date(o) + + if isinstance(o, (decimal.Decimal, uuid.UUID)): + return str(o) + + if dataclasses and dataclasses.is_dataclass(o): + return dataclasses.asdict(o) + + if hasattr(o, "__html__"): + return str(o.__html__()) + + raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") + + +class DefaultJSONProvider(JSONProvider): + """Provide JSON operations using Python's built-in :mod:`json` + library. Serializes the following additional data types: + + - :class:`datetime.datetime` and :class:`datetime.date` are + serialized to :rfc:`822` strings. This is the same as the HTTP + date format. + - :class:`uuid.UUID` is serialized to a string. + - :class:`dataclasses.dataclass` is passed to + :func:`dataclasses.asdict`. + - :class:`~markupsafe.Markup` (or any object with a ``__html__`` + method) will call the ``__html__`` method to get a string. + """ + + default: t.Callable[[t.Any], t.Any] = staticmethod( + _default + ) # type: ignore[assignment] + """Apply this function to any object that :meth:`json.dumps` does + not know how to serialize. It should return a valid JSON type or + raise a ``TypeError``. + """ + + ensure_ascii = True + """Replace non-ASCII characters with escape sequences. This may be + more compatible with some clients, but can be disabled for better + performance and size. + """ + + sort_keys = True + """Sort the keys in any serialized dicts. This may be useful for + some caching situations, but can be disabled for better performance. + When enabled, keys must all be strings, they are not converted + before sorting. + """ + + compact: bool | None = None + """If ``True``, or ``None`` out of debug mode, the :meth:`response` + output will not add indentation, newlines, or spaces. If ``False``, + or ``None`` in debug mode, it will use a non-compact representation. + """ + + mimetype = "application/json" + """The mimetype set in :meth:`response`.""" + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON to a string. + + Keyword arguments are passed to :func:`json.dumps`. Sets some + parameter defaults from the :attr:`default`, + :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. + + :param obj: The data to serialize. + :param kwargs: Passed to :func:`json.dumps`. + """ + kwargs.setdefault("default", self.default) + kwargs.setdefault("ensure_ascii", self.ensure_ascii) + kwargs.setdefault("sort_keys", self.sort_keys) + return json.dumps(obj, **kwargs) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON from a string or bytes. + + :param s: Text or UTF-8 bytes. + :param kwargs: Passed to :func:`json.loads`. + """ + return json.loads(s, **kwargs) + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with it. The response mimetype + will be "application/json" and can be changed with + :attr:`mimetype`. + + If :attr:`compact` is ``False`` or debug mode is enabled, the + output will be formatted to be easier to read. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + dump_args: dict[str, t.Any] = {} + + if (self.compact is None and self._app.debug) or self.compact is False: + dump_args.setdefault("indent", 2) + else: + dump_args.setdefault("separators", (",", ":")) + + return self._app.response_class( + f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype + ) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/json/tag.py b/Meliora/gmapenv/Lib/site-packages/flask/json/tag.py new file mode 100644 index 00000000..91cc4412 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/json/tag.py @@ -0,0 +1,314 @@ +""" +Tagged JSON +~~~~~~~~~~~ + +A compact representation for lossless serialization of non-standard JSON +types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this +to serialize the session data, but it may be useful in other places. It +can be extended to support other types. + +.. autoclass:: TaggedJSONSerializer + :members: + +.. autoclass:: JSONTag + :members: + +Let's see an example that adds support for +:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so +to handle this we will dump the items as a list of ``[key, value]`` +pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to +identify the type. The session serializer processes dicts first, so +insert the new tag at the front of the order since ``OrderedDict`` must +be processed before ``dict``. + +.. code-block:: python + + from flask.json.tag import JSONTag + + class TagOrderedDict(JSONTag): + __slots__ = ('serializer',) + key = ' od' + + def check(self, value): + return isinstance(value, OrderedDict) + + def to_json(self, value): + return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] + + def to_python(self, value): + return OrderedDict(value) + + app.session_interface.serializer.register(TagOrderedDict, index=0) +""" +from __future__ import annotations + +import typing as t +from base64 import b64decode +from base64 import b64encode +from datetime import datetime +from uuid import UUID + +from markupsafe import Markup +from werkzeug.http import http_date +from werkzeug.http import parse_date + +from ..json import dumps +from ..json import loads + + +class JSONTag: + """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" + + __slots__ = ("serializer",) + + #: The tag to mark the serialized object with. If ``None``, this tag is + #: only used as an intermediate step during tagging. + key: str | None = None + + def __init__(self, serializer: TaggedJSONSerializer) -> None: + """Create a tagger for the given serializer.""" + self.serializer = serializer + + def check(self, value: t.Any) -> bool: + """Check if the given value should be tagged by this tag.""" + raise NotImplementedError + + def to_json(self, value: t.Any) -> t.Any: + """Convert the Python object to an object that is a valid JSON type. + The tag will be added later.""" + raise NotImplementedError + + def to_python(self, value: t.Any) -> t.Any: + """Convert the JSON representation back to the correct type. The tag + will already be removed.""" + raise NotImplementedError + + def tag(self, value: t.Any) -> t.Any: + """Convert the value to a valid JSON type and add the tag structure + around it.""" + return {self.key: self.to_json(value)} + + +class TagDict(JSONTag): + """Tag for 1-item dicts whose only key matches a registered tag. + + Internally, the dict key is suffixed with `__`, and the suffix is removed + when deserializing. + """ + + __slots__ = () + key = " di" + + def check(self, value: t.Any) -> bool: + return ( + isinstance(value, dict) + and len(value) == 1 + and next(iter(value)) in self.serializer.tags + ) + + def to_json(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {f"{key}__": self.serializer.tag(value[key])} + + def to_python(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {key[:-2]: value[key]} + + +class PassDict(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, dict) + + def to_json(self, value: t.Any) -> t.Any: + # JSON objects may only have string keys, so don't bother tagging the + # key here. + return {k: self.serializer.tag(v) for k, v in value.items()} + + tag = to_json + + +class TagTuple(JSONTag): + __slots__ = () + key = " t" + + def check(self, value: t.Any) -> bool: + return isinstance(value, tuple) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + def to_python(self, value: t.Any) -> t.Any: + return tuple(value) + + +class PassList(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, list) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + tag = to_json + + +class TagBytes(JSONTag): + __slots__ = () + key = " b" + + def check(self, value: t.Any) -> bool: + return isinstance(value, bytes) + + def to_json(self, value: t.Any) -> t.Any: + return b64encode(value).decode("ascii") + + def to_python(self, value: t.Any) -> t.Any: + return b64decode(value) + + +class TagMarkup(JSONTag): + """Serialize anything matching the :class:`~markupsafe.Markup` API by + having a ``__html__`` method to the result of that method. Always + deserializes to an instance of :class:`~markupsafe.Markup`.""" + + __slots__ = () + key = " m" + + def check(self, value: t.Any) -> bool: + return callable(getattr(value, "__html__", None)) + + def to_json(self, value: t.Any) -> t.Any: + return str(value.__html__()) + + def to_python(self, value: t.Any) -> t.Any: + return Markup(value) + + +class TagUUID(JSONTag): + __slots__ = () + key = " u" + + def check(self, value: t.Any) -> bool: + return isinstance(value, UUID) + + def to_json(self, value: t.Any) -> t.Any: + return value.hex + + def to_python(self, value: t.Any) -> t.Any: + return UUID(value) + + +class TagDateTime(JSONTag): + __slots__ = () + key = " d" + + def check(self, value: t.Any) -> bool: + return isinstance(value, datetime) + + def to_json(self, value: t.Any) -> t.Any: + return http_date(value) + + def to_python(self, value: t.Any) -> t.Any: + return parse_date(value) + + +class TaggedJSONSerializer: + """Serializer that uses a tag system to compactly represent objects that + are not JSON types. Passed as the intermediate serializer to + :class:`itsdangerous.Serializer`. + + The following extra types are supported: + + * :class:`dict` + * :class:`tuple` + * :class:`bytes` + * :class:`~markupsafe.Markup` + * :class:`~uuid.UUID` + * :class:`~datetime.datetime` + """ + + __slots__ = ("tags", "order") + + #: Tag classes to bind when creating the serializer. Other tags can be + #: added later using :meth:`~register`. + default_tags = [ + TagDict, + PassDict, + TagTuple, + PassList, + TagBytes, + TagMarkup, + TagUUID, + TagDateTime, + ] + + def __init__(self) -> None: + self.tags: dict[str, JSONTag] = {} + self.order: list[JSONTag] = [] + + for cls in self.default_tags: + self.register(cls) + + def register( + self, + tag_class: type[JSONTag], + force: bool = False, + index: int | None = None, + ) -> None: + """Register a new tag with this serializer. + + :param tag_class: tag class to register. Will be instantiated with this + serializer instance. + :param force: overwrite an existing tag. If false (default), a + :exc:`KeyError` is raised. + :param index: index to insert the new tag in the tag order. Useful when + the new tag is a special case of an existing tag. If ``None`` + (default), the tag is appended to the end of the order. + + :raise KeyError: if the tag key is already registered and ``force`` is + not true. + """ + tag = tag_class(self) + key = tag.key + + if key is not None: + if not force and key in self.tags: + raise KeyError(f"Tag '{key}' is already registered.") + + self.tags[key] = tag + + if index is None: + self.order.append(tag) + else: + self.order.insert(index, tag) + + def tag(self, value: t.Any) -> dict[str, t.Any]: + """Convert a value to a tagged representation if necessary.""" + for tag in self.order: + if tag.check(value): + return tag.tag(value) + + return value + + def untag(self, value: dict[str, t.Any]) -> t.Any: + """Convert a tagged representation back to the original type.""" + if len(value) != 1: + return value + + key = next(iter(value)) + + if key not in self.tags: + return value + + return self.tags[key].to_python(value[key]) + + def dumps(self, value: t.Any) -> str: + """Tag the value and dump it to a compact JSON string.""" + return dumps(self.tag(value), separators=(",", ":")) + + def loads(self, value: str) -> t.Any: + """Load data from a JSON string and deserialized any tagged objects.""" + return loads(value, object_hook=self.untag) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/logging.py b/Meliora/gmapenv/Lib/site-packages/flask/logging.py new file mode 100644 index 00000000..b452f71f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/logging.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +import logging +import sys +import typing as t + +from werkzeug.local import LocalProxy + +from .globals import request + +if t.TYPE_CHECKING: # pragma: no cover + from .sansio.app import App + + +@LocalProxy +def wsgi_errors_stream() -> t.TextIO: + """Find the most appropriate error stream for the application. If a request + is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. + + If you configure your own :class:`logging.StreamHandler`, you may want to + use this for the stream. If you are using file or dict configuration and + can't import this directly, you can refer to it as + ``ext://flask.logging.wsgi_errors_stream``. + """ + return request.environ["wsgi.errors"] if request else sys.stderr + + +def has_level_handler(logger: logging.Logger) -> bool: + """Check if there is a handler in the logging chain that will handle the + given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. + """ + level = logger.getEffectiveLevel() + current = logger + + while current: + if any(handler.level <= level for handler in current.handlers): + return True + + if not current.propagate: + break + + current = current.parent # type: ignore + + return False + + +#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format +#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. +default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore +default_handler.setFormatter( + logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") +) + + +def create_logger(app: App) -> logging.Logger: + """Get the Flask app's logger and configure it if needed. + + The logger name will be the same as + :attr:`app.import_name `. + + When :attr:`~flask.Flask.debug` is enabled, set the logger level to + :data:`logging.DEBUG` if it is not set. + + If there is no handler for the logger's effective level, add a + :class:`~logging.StreamHandler` for + :func:`~flask.logging.wsgi_errors_stream` with a basic format. + """ + logger = logging.getLogger(app.name) + + if app.debug and not logger.level: + logger.setLevel(logging.DEBUG) + + if not has_level_handler(logger): + logger.addHandler(default_handler) + + return logger diff --git a/Meliora/gmapenv/Lib/site-packages/flask/py.typed b/Meliora/gmapenv/Lib/site-packages/flask/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/flask/sansio/README.md b/Meliora/gmapenv/Lib/site-packages/flask/sansio/README.md new file mode 100644 index 00000000..623ac198 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/sansio/README.md @@ -0,0 +1,6 @@ +# Sansio + +This folder contains code that can be used by alternative Flask +implementations, for example Quart. The code therefore cannot do any +IO, nor be part of a likely IO path. Finally this code cannot use the +Flask globals. diff --git a/Meliora/gmapenv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a270e3bbe834d307fe4164756954116330311b6c GIT binary patch literal 28167 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 F{|AHeU()~p literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask/sansio/app.py b/Meliora/gmapenv/Lib/site-packages/flask/sansio/app.py new file mode 100644 index 00000000..0f7d2cbf --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/sansio/app.py @@ -0,0 +1,964 @@ +from __future__ import annotations + +import logging +import os +import sys +import typing as t +from datetime import timedelta +from itertools import chain + +from werkzeug.exceptions import Aborter +from werkzeug.exceptions import BadRequest +from werkzeug.exceptions import BadRequestKeyError +from werkzeug.routing import BuildError +from werkzeug.routing import Map +from werkzeug.routing import Rule +from werkzeug.sansio.response import Response +from werkzeug.utils import cached_property +from werkzeug.utils import redirect as _wz_redirect + +from .. import typing as ft +from ..config import Config +from ..config import ConfigAttribute +from ..ctx import _AppCtxGlobals +from ..helpers import _split_blueprint_path +from ..helpers import get_debug_flag +from ..json.provider import DefaultJSONProvider +from ..json.provider import JSONProvider +from ..logging import create_logger +from ..templating import DispatchingJinjaLoader +from ..templating import Environment +from .scaffold import _endpoint_from_view_func +from .scaffold import find_package +from .scaffold import Scaffold +from .scaffold import setupmethod + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.wrappers import Response as BaseResponse + from .blueprints import Blueprint + from ..testing import FlaskClient + from ..testing import FlaskCliRunner + +T_shell_context_processor = t.TypeVar( + "T_shell_context_processor", bound=ft.ShellContextProcessorCallable +) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) + + +def _make_timedelta(value: timedelta | int | None) -> timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class App(Scaffold): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + #: The class of the object assigned to :attr:`aborter`, created by + #: :meth:`create_aborter`. That object is called by + #: :func:`flask.abort` to raise HTTP errors, and can be + #: called directly as well. + #: + #: Defaults to :class:`werkzeug.exceptions.Aborter`. + #: + #: .. versionadded:: 2.2 + aborter_class = Aborter + + #: The class that is used for the Jinja environment. + #: + #: .. versionadded:: 0.11 + jinja_environment = Environment + + #: The class that is used for the :data:`~flask.g` instance. + #: + #: Example use cases for a custom class: + #: + #: 1. Store arbitrary attributes on flask.g. + #: 2. Add a property for lazy per-request database connectors. + #: 3. Return None instead of AttributeError on unexpected attributes. + #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. + #: + #: In Flask 0.9 this property was called `request_globals_class` but it + #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the + #: flask.g object is now application context scoped. + #: + #: .. versionadded:: 0.10 + app_ctx_globals_class = _AppCtxGlobals + + #: The class that is used for the ``config`` attribute of this app. + #: Defaults to :class:`~flask.Config`. + #: + #: Example use cases for a custom class: + #: + #: 1. Default values for certain config options. + #: 2. Access to config values through attributes in addition to keys. + #: + #: .. versionadded:: 0.11 + config_class = Config + + #: The testing flag. Set this to ``True`` to enable the test mode of + #: Flask extensions (and in the future probably also Flask itself). + #: For example this might activate test helpers that have an + #: additional runtime cost which should not be enabled by default. + #: + #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the + #: default it's implicitly enabled. + #: + #: This attribute can also be configured from the config with the + #: ``TESTING`` configuration key. Defaults to ``False``. + testing = ConfigAttribute("TESTING") + + #: If a secret key is set, cryptographic components can use this to + #: sign cookies and other things. Set this to a complex random value + #: when you want to use the secure cookie for instance. + #: + #: This attribute can also be configured from the config with the + #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. + secret_key = ConfigAttribute("SECRET_KEY") + + #: A :class:`~datetime.timedelta` which is used to set the expiration + #: date of a permanent session. The default is 31 days which makes a + #: permanent session survive for roughly one month. + #: + #: This attribute can also be configured from the config with the + #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to + #: ``timedelta(days=31)`` + permanent_session_lifetime = ConfigAttribute( + "PERMANENT_SESSION_LIFETIME", get_converter=_make_timedelta + ) + + json_provider_class: type[JSONProvider] = DefaultJSONProvider + """A subclass of :class:`~flask.json.provider.JSONProvider`. An + instance is created and assigned to :attr:`app.json` when creating + the app. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses + Python's built-in :mod:`json` library. A different provider can use + a different JSON library. + + .. versionadded:: 2.2 + """ + + #: Options that are passed to the Jinja environment in + #: :meth:`create_jinja_environment`. Changing these options after + #: the environment is created (accessing :attr:`jinja_env`) will + #: have no effect. + #: + #: .. versionchanged:: 1.1.0 + #: This is a ``dict`` instead of an ``ImmutableDict`` to allow + #: easier configuration. + #: + jinja_options: dict = {} + + #: The rule object to use for URL rules created. This is used by + #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. + #: + #: .. versionadded:: 0.7 + url_rule_class = Rule + + #: The map object to use for storing the URL rules and routing + #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. + #: + #: .. versionadded:: 1.1.0 + url_map_class = Map + + #: The :meth:`test_client` method creates an instance of this test + #: client class. Defaults to :class:`~flask.testing.FlaskClient`. + #: + #: .. versionadded:: 0.7 + test_client_class: type[FlaskClient] | None = None + + #: The :class:`~click.testing.CliRunner` subclass, by default + #: :class:`~flask.testing.FlaskCliRunner` that is used by + #: :meth:`test_cli_runner`. Its ``__init__`` method should take a + #: Flask app object as the first argument. + #: + #: .. versionadded:: 1.0 + test_cli_runner_class: type[FlaskCliRunner] | None = None + + default_config: dict + response_class: type[Response] + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if instance_path is None: + instance_path = self.auto_find_instance_path() + elif not os.path.isabs(instance_path): + raise ValueError( + "If an instance path is provided it must be absolute." + " A relative path was given instead." + ) + + #: Holds the path to the instance folder. + #: + #: .. versionadded:: 0.8 + self.instance_path = instance_path + + #: The configuration dictionary as :class:`Config`. This behaves + #: exactly like a regular dictionary but supports additional methods + #: to load a config from files. + self.config = self.make_config(instance_relative_config) + + #: An instance of :attr:`aborter_class` created by + #: :meth:`make_aborter`. This is called by :func:`flask.abort` + #: to raise HTTP errors, and can be called directly as well. + #: + #: .. versionadded:: 2.2 + #: Moved from ``flask.abort``, which calls this object. + self.aborter = self.make_aborter() + + self.json: JSONProvider = self.json_provider_class(self) + """Provides access to JSON methods. Functions in ``flask.json`` + will call methods on this provider when the application context + is active. Used for handling JSON requests and responses. + + An instance of :attr:`json_provider_class`. Can be customized by + changing that attribute on a subclass, or by assigning to this + attribute afterwards. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, + uses Python's built-in :mod:`json` library. A different provider + can use a different JSON library. + + .. versionadded:: 2.2 + """ + + #: A list of functions that are called by + #: :meth:`handle_url_build_error` when :meth:`.url_for` raises a + #: :exc:`~werkzeug.routing.BuildError`. Each function is called + #: with ``error``, ``endpoint`` and ``values``. If a function + #: returns ``None`` or raises a ``BuildError``, it is skipped. + #: Otherwise, its return value is returned by ``url_for``. + #: + #: .. versionadded:: 0.9 + self.url_build_error_handlers: list[ + t.Callable[[Exception, str, dict[str, t.Any]], str] + ] = [] + + #: A list of functions that are called when the application context + #: is destroyed. Since the application context is also torn down + #: if the request ends this is the place to store code that disconnects + #: from databases. + #: + #: .. versionadded:: 0.9 + self.teardown_appcontext_funcs: list[ft.TeardownCallable] = [] + + #: A list of shell context processor functions that should be run + #: when a shell context is created. + #: + #: .. versionadded:: 0.11 + self.shell_context_processors: list[ft.ShellContextProcessorCallable] = [] + + #: Maps registered blueprint names to blueprint objects. The + #: dict retains the order the blueprints were registered in. + #: Blueprints can be registered multiple times, this dict does + #: not track how often they were attached. + #: + #: .. versionadded:: 0.7 + self.blueprints: dict[str, Blueprint] = {} + + #: a place where extensions can store application specific state. For + #: example this is where an extension could store database engines and + #: similar things. + #: + #: The key must match the name of the extension module. For example in + #: case of a "Flask-Foo" extension in `flask_foo`, the key would be + #: ``'foo'``. + #: + #: .. versionadded:: 0.7 + self.extensions: dict = {} + + #: The :class:`~werkzeug.routing.Map` for this instance. You can use + #: this to change the routing converters after the class was created + #: but before any routes are connected. Example:: + #: + #: from werkzeug.routing import BaseConverter + #: + #: class ListConverter(BaseConverter): + #: def to_python(self, value): + #: return value.split(',') + #: def to_url(self, values): + #: return ','.join(super(ListConverter, self).to_url(value) + #: for value in values) + #: + #: app = Flask(__name__) + #: app.url_map.converters['list'] = ListConverter + self.url_map = self.url_map_class(host_matching=host_matching) + + self.subdomain_matching = subdomain_matching + + # tracks internally if the application already handled at least one + # request. + self._got_first_request = False + + # Set the name of the Click group in case someone wants to add + # the app's commands to another CLI tool. + self.cli.name = self.name + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_first_request: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called" + " on the application. It has already handled its first" + " request, any changes will not be applied" + " consistently.\n" + "Make sure all imports, decorators, functions, etc." + " needed to set up the application are done before" + " running it." + ) + + @cached_property + def name(self) -> str: # type: ignore + """The name of the application. This is usually the import name + with the difference that it's guessed from the run file if the + import name is main. This name is used as a display name when + Flask needs the name of the application. It can be set and overridden + to change the value. + + .. versionadded:: 0.8 + """ + if self.import_name == "__main__": + fn = getattr(sys.modules["__main__"], "__file__", None) + if fn is None: + return "__main__" + return os.path.splitext(os.path.basename(fn))[0] + return self.import_name + + @cached_property + def logger(self) -> logging.Logger: + """A standard Python :class:`~logging.Logger` for the app, with + the same name as :attr:`name`. + + In debug mode, the logger's :attr:`~logging.Logger.level` will + be set to :data:`~logging.DEBUG`. + + If there are no handlers configured, a default handler will be + added. See :doc:`/logging` for more information. + + .. versionchanged:: 1.1.0 + The logger takes the same name as :attr:`name` rather than + hard-coding ``"flask.app"``. + + .. versionchanged:: 1.0.0 + Behavior was simplified. The logger is always named + ``"flask.app"``. The level is only set during configuration, + it doesn't check ``app.debug`` each time. Only one format is + used, not different ones depending on ``app.debug``. No + handlers are removed, and a handler is only added if no + handlers are already configured. + + .. versionadded:: 0.3 + """ + return create_logger(self) + + @cached_property + def jinja_env(self) -> Environment: + """The Jinja environment used to load templates. + + The environment is created the first time this property is + accessed. Changing :attr:`jinja_options` after that will have no + effect. + """ + return self.create_jinja_environment() + + def create_jinja_environment(self) -> Environment: + raise NotImplementedError() + + def make_config(self, instance_relative: bool = False) -> Config: + """Used to create the config attribute by the Flask constructor. + The `instance_relative` parameter is passed in from the constructor + of Flask (there named `instance_relative_config`) and indicates if + the config should be relative to the instance path or the root path + of the application. + + .. versionadded:: 0.8 + """ + root_path = self.root_path + if instance_relative: + root_path = self.instance_path + defaults = dict(self.default_config) + defaults["DEBUG"] = get_debug_flag() + return self.config_class(root_path, defaults) + + def make_aborter(self) -> Aborter: + """Create the object to assign to :attr:`aborter`. That object + is called by :func:`flask.abort` to raise HTTP errors, and can + be called directly as well. + + By default, this creates an instance of :attr:`aborter_class`, + which defaults to :class:`werkzeug.exceptions.Aborter`. + + .. versionadded:: 2.2 + """ + return self.aborter_class() + + def auto_find_instance_path(self) -> str: + """Tries to locate the instance path if it was not provided to the + constructor of the application class. It will basically calculate + the path to a folder named ``instance`` next to your main file or + the package. + + .. versionadded:: 0.8 + """ + prefix, package_path = find_package(self.import_name) + if prefix is None: + return os.path.join(package_path, "instance") + return os.path.join(prefix, "var", f"{self.name}-instance") + + def create_global_jinja_loader(self) -> DispatchingJinjaLoader: + """Creates the loader for the Jinja2 environment. Can be used to + override just the loader and keeping the rest unchanged. It's + discouraged to override this function. Instead one should override + the :meth:`jinja_loader` function instead. + + The global loader dispatches between the loaders of the application + and the individual blueprints. + + .. versionadded:: 0.7 + """ + return DispatchingJinjaLoader(self) + + def select_jinja_autoescape(self, filename: str) -> bool: + """Returns ``True`` if autoescaping should be active for the given + template name. If no template name is given, returns `True`. + + .. versionchanged:: 2.2 + Autoescaping is now enabled by default for ``.svg`` files. + + .. versionadded:: 0.5 + """ + if filename is None: + return True + return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) + + @property + def debug(self) -> bool: + """Whether debug mode is enabled. When using ``flask run`` to start the + development server, an interactive debugger will be shown for unhandled + exceptions, and the server will be reloaded when code changes. This maps to the + :data:`DEBUG` config key. It may not behave as expected if set late. + + **Do not enable debug mode when deploying in production.** + + Default: ``False`` + """ + return self.config["DEBUG"] + + @debug.setter + def debug(self, value: bool) -> None: + self.config["DEBUG"] = value + + if self.config["TEMPLATES_AUTO_RELOAD"] is None: + self.jinja_env.auto_reload = value + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on the application. Keyword + arguments passed to this method will override the defaults set on the + blueprint. + + Calls the blueprint's :meth:`~flask.Blueprint.register` method after + recording the blueprint in the application's :attr:`blueprints`. + + :param blueprint: The blueprint to register. + :param url_prefix: Blueprint routes will be prefixed with this. + :param subdomain: Blueprint routes will match on this subdomain. + :param url_defaults: Blueprint routes will use these default values for + view arguments. + :param options: Additional keyword arguments are passed to + :class:`~flask.blueprints.BlueprintSetupState`. They can be + accessed in :meth:`~flask.Blueprint.record` callbacks. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 0.7 + """ + blueprint.register(self, options) + + def iter_blueprints(self) -> t.ValuesView[Blueprint]: + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return self.blueprints.values() + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + options["endpoint"] = endpoint + methods = options.pop("methods", None) + + # if the methods are not given and the view_func object knows its + # methods we can use that instead. If neither exists, we go with + # a tuple of only ``GET`` as default. + if methods is None: + methods = getattr(view_func, "methods", None) or ("GET",) + if isinstance(methods, str): + raise TypeError( + "Allowed methods must be a list of strings, for" + ' example: @app.route(..., methods=["POST"])' + ) + methods = {item.upper() for item in methods} + + # Methods that should always be added + required_methods = set(getattr(view_func, "required_methods", ())) + + # starting with Flask 0.8 the view_func object can disable and + # force-enable the automatic options handling. + if provide_automatic_options is None: + provide_automatic_options = getattr( + view_func, "provide_automatic_options", None + ) + + if provide_automatic_options is None: + if "OPTIONS" not in methods: + provide_automatic_options = True + required_methods.add("OPTIONS") + else: + provide_automatic_options = False + + # Add the required methods now. + methods |= required_methods + + rule = self.url_rule_class(rule, methods=methods, **options) + rule.provide_automatic_options = provide_automatic_options # type: ignore + + self.url_map.add(rule) + if view_func is not None: + old_func = self.view_functions.get(endpoint) + if old_func is not None and old_func != view_func: + raise AssertionError( + "View function mapping is overwriting an existing" + f" endpoint function: {endpoint}" + ) + self.view_functions[endpoint] = view_func + + @setupmethod + def template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """A decorator that is used to register custom template filter. + You can specify a name for the filter, otherwise the function + name will be used. Example:: + + @app.template_filter() + def reverse(s): + return s[::-1] + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a custom template filter. Works exactly like the + :meth:`template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + self.jinja_env.filters[name or f.__name__] = f + + @setupmethod + def template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """A decorator that is used to register custom template test. + You can specify a name for the test, otherwise the function + name will be used. Example:: + + @app.template_test() + def is_prime(n): + if n == 2: + return True + for i in range(2, int(math.ceil(math.sqrt(n))) + 1): + if n % i == 0: + return False + return True + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a custom template test. Works exactly like the + :meth:`template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + self.jinja_env.tests[name or f.__name__] = f + + @setupmethod + def template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """A decorator that is used to register a custom template global function. + You can specify a name for the global function, otherwise the function + name will be used. Example:: + + @app.template_global() + def double(n): + return 2 * n + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a custom template global function. Works exactly like the + :meth:`template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + self.jinja_env.globals[name or f.__name__] = f + + @setupmethod + def teardown_appcontext(self, f: T_teardown) -> T_teardown: + """Registers a function to be called when the application + context is popped. The application context is typically popped + after the request context for each request, at the end of CLI + commands, or after a manually pushed context ends. + + .. code-block:: python + + with app.app_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the app context is + made inactive. Since a request context typically also manages an + application context it would also be called when you pop a + request context. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + .. versionadded:: 0.9 + """ + self.teardown_appcontext_funcs.append(f) + return f + + @setupmethod + def shell_context_processor( + self, f: T_shell_context_processor + ) -> T_shell_context_processor: + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + def _find_error_handler( + self, e: Exception, blueprints: list[str] + ) -> ft.ErrorHandlerCallable | None: + """Return a registered error handler for an exception in this order: + blueprint handler for a specific code, app handler for a specific code, + blueprint handler for an exception class, app handler for an exception + class, or ``None`` if a suitable handler is not found. + """ + exc_class, code = self._get_exc_class_and_code(type(e)) + names = (*blueprints, None) + + for c in (code, None) if code is not None else (None,): + for name in names: + handler_map = self.error_handler_spec[name][c] + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + return None + + def trap_http_exception(self, e: Exception) -> bool: + """Checks if an HTTP exception should be trapped or not. By default + this will return ``False`` for all exceptions except for a bad request + key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It + also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. + + This is called for all HTTP exceptions raised by a view function. + If it returns ``True`` for any exception the error handler for this + exception is not called and it shows up as regular exception in the + traceback. This is helpful for debugging implicitly raised HTTP + exceptions. + + .. versionchanged:: 1.0 + Bad request errors are not trapped by default in debug mode. + + .. versionadded:: 0.8 + """ + if self.config["TRAP_HTTP_EXCEPTIONS"]: + return True + + trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] + + # if unset, trap key errors in debug mode + if ( + trap_bad_request is None + and self.debug + and isinstance(e, BadRequestKeyError) + ): + return True + + if trap_bad_request: + return isinstance(e, BadRequest) + + return False + + def should_ignore_error(self, error: BaseException | None) -> bool: + """This is called to figure out if an error should be ignored + or not as far as the teardown system is concerned. If this + function returns ``True`` then the teardown handlers will not be + passed the error. + + .. versionadded:: 0.10 + """ + return False + + def redirect(self, location: str, code: int = 302) -> BaseResponse: + """Create a redirect response object. + + This is called by :func:`flask.redirect`, and can be called + directly as well. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + + .. versionadded:: 2.2 + Moved from ``flask.redirect``, which calls this method. + """ + return _wz_redirect( + location, code=code, Response=self.response_class # type: ignore[arg-type] + ) + + def inject_url_defaults(self, endpoint: str, values: dict) -> None: + """Injects the URL defaults for the given endpoint directly into + the values dictionary passed. This is used internally and + automatically called on URL building. + + .. versionadded:: 0.7 + """ + names: t.Iterable[str | None] = (None,) + + # url_for may be called outside a request context, parse the + # passed endpoint instead of using request.blueprints. + if "." in endpoint: + names = chain( + names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) + ) + + for name in names: + if name in self.url_default_functions: + for func in self.url_default_functions[name]: + func(endpoint, values) + + def handle_url_build_error( + self, error: BuildError, endpoint: str, values: dict[str, t.Any] + ) -> str: + """Called by :meth:`.url_for` if a + :exc:`~werkzeug.routing.BuildError` was raised. If this returns + a value, it will be returned by ``url_for``, otherwise the error + will be re-raised. + + Each function in :attr:`url_build_error_handlers` is called with + ``error``, ``endpoint`` and ``values``. If a function returns + ``None`` or raises a ``BuildError``, it is skipped. Otherwise, + its return value is returned by ``url_for``. + + :param error: The active ``BuildError`` being handled. + :param endpoint: The endpoint being built. + :param values: The keyword arguments passed to ``url_for``. + """ + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + except BuildError as e: + # make error available outside except block + error = e + else: + if rv is not None: + return rv + + # Re-raise if called with an active exception, otherwise raise + # the passed in exception. + if error is sys.exc_info()[1]: + raise + + raise error diff --git a/Meliora/gmapenv/Lib/site-packages/flask/sansio/blueprints.py b/Meliora/gmapenv/Lib/site-packages/flask/sansio/blueprints.py new file mode 100644 index 00000000..38c92f45 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/sansio/blueprints.py @@ -0,0 +1,626 @@ +from __future__ import annotations + +import os +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from .. import typing as ft +from .scaffold import _endpoint_from_view_func +from .scaffold import _sentinel +from .scaffold import Scaffold +from .scaffold import setupmethod + +if t.TYPE_CHECKING: # pragma: no cover + from .app import App + +DeferredSetupFunction = t.Callable[["BlueprintSetupState"], t.Callable] +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) + + +class BlueprintSetupState: + """Temporary holder object for registering a blueprint with the + application. An instance of this class is created by the + :meth:`~flask.Blueprint.make_setup_state` method and later passed + to all register callback functions. + """ + + def __init__( + self, + blueprint: Blueprint, + app: App, + options: t.Any, + first_registration: bool, + ) -> None: + #: a reference to the current application + self.app = app + + #: a reference to the blueprint that created this setup state. + self.blueprint = blueprint + + #: a dictionary with all options that were passed to the + #: :meth:`~flask.Flask.register_blueprint` method. + self.options = options + + #: as blueprints can be registered multiple times with the + #: application and not everything wants to be registered + #: multiple times on it, this attribute can be used to figure + #: out if the blueprint was registered in the past already. + self.first_registration = first_registration + + subdomain = self.options.get("subdomain") + if subdomain is None: + subdomain = self.blueprint.subdomain + + #: The subdomain that the blueprint should be active for, ``None`` + #: otherwise. + self.subdomain = subdomain + + url_prefix = self.options.get("url_prefix") + if url_prefix is None: + url_prefix = self.blueprint.url_prefix + #: The prefix that should be used for all URLs defined on the + #: blueprint. + self.url_prefix = url_prefix + + self.name = self.options.get("name", blueprint.name) + self.name_prefix = self.options.get("name_prefix", "") + + #: A dictionary with URL defaults that is added to each and every + #: URL that was defined with the blueprint. + self.url_defaults = dict(self.blueprint.url_values_defaults) + self.url_defaults.update(self.options.get("url_defaults", ())) + + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: t.Callable | None = None, + **options: t.Any, + ) -> None: + """A helper method to register a rule (and optionally a view function) + to the application. The endpoint is automatically prefixed with the + blueprint's name. + """ + if self.url_prefix is not None: + if rule: + rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) + else: + rule = self.url_prefix + options.setdefault("subdomain", self.subdomain) + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + defaults = self.url_defaults + if "defaults" in options: + defaults = dict(defaults, **options.pop("defaults")) + + self.app.add_url_rule( + rule, + f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), + view_func, + defaults=defaults, + **options, + ) + + +class Blueprint(Scaffold): + """Represents a blueprint, a collection of routes and other + app-related functions that can be registered on a real application + later. + + A blueprint is an object that allows defining application functions + without requiring an application object ahead of time. It uses the + same decorators as :class:`~flask.Flask`, but defers the need for an + application by recording them for later registration. + + Decorating a function with a blueprint creates a deferred function + that is called with :class:`~flask.blueprints.BlueprintSetupState` + when the blueprint is registered on an application. + + See :doc:`/blueprints` for more information. + + :param name: The name of the blueprint. Will be prepended to each + endpoint name. + :param import_name: The name of the blueprint package, usually + ``__name__``. This helps locate the ``root_path`` for the + blueprint. + :param static_folder: A folder with static files that should be + served by the blueprint's static route. The path is relative to + the blueprint's root path. Blueprint static files are disabled + by default. + :param static_url_path: The url to serve static files from. + Defaults to ``static_folder``. If the blueprint does not have + a ``url_prefix``, the app's static route will take precedence, + and the blueprint's static files won't be accessible. + :param template_folder: A folder with templates that should be added + to the app's template search path. The path is relative to the + blueprint's root path. Blueprint templates are disabled by + default. Blueprint templates have a lower precedence than those + in the app's templates folder. + :param url_prefix: A path to prepend to all of the blueprint's URLs, + to make them distinct from the rest of the app's routes. + :param subdomain: A subdomain that blueprint routes will match on by + default. + :param url_defaults: A dict of default values that blueprint routes + will receive by default. + :param root_path: By default, the blueprint will automatically set + this based on ``import_name``. In certain situations this + automatic detection can fail, so the path can be specified + manually instead. + + .. versionchanged:: 1.1.0 + Blueprints have a ``cli`` group to register nested CLI commands. + The ``cli_group`` parameter controls the name of the group under + the ``flask`` command. + + .. versionadded:: 0.7 + """ + + _got_registered_once = False + + def __init__( + self, + name: str, + import_name: str, + static_folder: str | os.PathLike | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike | None = None, + url_prefix: str | None = None, + subdomain: str | None = None, + url_defaults: dict | None = None, + root_path: str | None = None, + cli_group: str | None = _sentinel, # type: ignore + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if not name: + raise ValueError("'name' may not be empty.") + + if "." in name: + raise ValueError("'name' may not contain a dot '.' character.") + + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.deferred_functions: list[DeferredSetupFunction] = [] + + if url_defaults is None: + url_defaults = {} + + self.url_values_defaults = url_defaults + self.cli_group = cli_group + self._blueprints: list[tuple[Blueprint, dict]] = [] + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_registered_once: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called on the blueprint" + f" '{self.name}'. It has already been registered at least once, any" + " changes will not be applied consistently.\n" + "Make sure all imports, decorators, functions, etc. needed to set up" + " the blueprint are done before registering it." + ) + + @setupmethod + def record(self, func: t.Callable) -> None: + """Registers a function that is called when the blueprint is + registered on the application. This function is called with the + state as argument as returned by the :meth:`make_setup_state` + method. + """ + self.deferred_functions.append(func) + + @setupmethod + def record_once(self, func: t.Callable) -> None: + """Works like :meth:`record` but wraps the function in another + function that will ensure the function is only called once. If the + blueprint is registered a second time on the application, the + function passed is not called. + """ + + def wrapper(state: BlueprintSetupState) -> None: + if state.first_registration: + func(state) + + self.record(update_wrapper(wrapper, func)) + + def make_setup_state( + self, app: App, options: dict, first_registration: bool = False + ) -> BlueprintSetupState: + """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` + object that is later passed to the register callback functions. + Subclasses can override this to return a subclass of the setup state. + """ + return BlueprintSetupState(self, app, options, first_registration) + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on this blueprint. Keyword + arguments passed to this method will override the defaults set + on the blueprint. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 2.0 + """ + if blueprint is self: + raise ValueError("Cannot register a blueprint on itself") + self._blueprints.append((blueprint, options)) + + def register(self, app: App, options: dict) -> None: + """Called by :meth:`Flask.register_blueprint` to register all + views and callbacks registered on the blueprint with the + application. Creates a :class:`.BlueprintSetupState` and calls + each :meth:`record` callback with it. + + :param app: The application this blueprint is being registered + with. + :param options: Keyword arguments forwarded from + :meth:`~Flask.register_blueprint`. + + .. versionchanged:: 2.3 + Nested blueprints now correctly apply subdomains. + + .. versionchanged:: 2.1 + Registering the same blueprint with the same name multiple + times is an error. + + .. versionchanged:: 2.0.1 + Nested blueprints are registered with their dotted name. + This allows different blueprints with the same name to be + nested at different locations. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + """ + name_prefix = options.get("name_prefix", "") + self_name = options.get("name", self.name) + name = f"{name_prefix}.{self_name}".lstrip(".") + + if name in app.blueprints: + bp_desc = "this" if app.blueprints[name] is self else "a different" + existing_at = f" '{name}'" if self_name != name else "" + + raise ValueError( + f"The name '{self_name}' is already registered for" + f" {bp_desc} blueprint{existing_at}. Use 'name=' to" + f" provide a unique name." + ) + + first_bp_registration = not any(bp is self for bp in app.blueprints.values()) + first_name_registration = name not in app.blueprints + + app.blueprints[name] = self + self._got_registered_once = True + state = self.make_setup_state(app, options, first_bp_registration) + + if self.has_static_folder: + state.add_url_rule( + f"{self.static_url_path}/", + view_func=self.send_static_file, # type: ignore[attr-defined] + endpoint="static", + ) + + # Merge blueprint data into parent. + if first_bp_registration or first_name_registration: + self._merge_blueprint_funcs(app, name) + + for deferred in self.deferred_functions: + deferred(state) + + cli_resolved_group = options.get("cli_group", self.cli_group) + + if self.cli.commands: + if cli_resolved_group is None: + app.cli.commands.update(self.cli.commands) + elif cli_resolved_group is _sentinel: + self.cli.name = name + app.cli.add_command(self.cli) + else: + self.cli.name = cli_resolved_group + app.cli.add_command(self.cli) + + for blueprint, bp_options in self._blueprints: + bp_options = bp_options.copy() + bp_url_prefix = bp_options.get("url_prefix") + bp_subdomain = bp_options.get("subdomain") + + if bp_subdomain is None: + bp_subdomain = blueprint.subdomain + + if state.subdomain is not None and bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + "." + state.subdomain + elif bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + elif state.subdomain is not None: + bp_options["subdomain"] = state.subdomain + + if bp_url_prefix is None: + bp_url_prefix = blueprint.url_prefix + + if state.url_prefix is not None and bp_url_prefix is not None: + bp_options["url_prefix"] = ( + state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") + ) + elif bp_url_prefix is not None: + bp_options["url_prefix"] = bp_url_prefix + elif state.url_prefix is not None: + bp_options["url_prefix"] = state.url_prefix + + bp_options["name_prefix"] = name + blueprint.register(app, bp_options) + + def _merge_blueprint_funcs(self, app: App, name: str) -> None: + def extend(bp_dict, parent_dict): + for key, values in bp_dict.items(): + key = name if key is None else f"{name}.{key}" + parent_dict[key].extend(values) + + for key, value in self.error_handler_spec.items(): + key = name if key is None else f"{name}.{key}" + value = defaultdict( + dict, + { + code: {exc_class: func for exc_class, func in code_values.items()} + for code, code_values in value.items() + }, + ) + app.error_handler_spec[key] = value + + for endpoint, func in self.view_functions.items(): + app.view_functions[endpoint] = func + + extend(self.before_request_funcs, app.before_request_funcs) + extend(self.after_request_funcs, app.after_request_funcs) + extend( + self.teardown_request_funcs, + app.teardown_request_funcs, + ) + extend(self.url_default_functions, app.url_default_functions) + extend(self.url_value_preprocessors, app.url_value_preprocessors) + extend(self.template_context_processors, app.template_context_processors) + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for + full documentation. + + The URL rule is prefixed with the blueprint's URL prefix. The endpoint name, + used with :func:`url_for`, is prefixed with the blueprint's name. + """ + if endpoint and "." in endpoint: + raise ValueError("'endpoint' may not contain a dot '.' character.") + + if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: + raise ValueError("'view_func' name may not contain a dot '.' character.") + + self.record( + lambda s: s.add_url_rule( + rule, + endpoint, + view_func, + provide_automatic_options=provide_automatic_options, + **options, + ) + ) + + @setupmethod + def app_template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """Register a template filter, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_app_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a template filter, available in any template rendered by the + application. Works like the :meth:`app_template_filter` decorator. Equivalent to + :meth:`.Flask.add_template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.filters[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """Register a template test, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_app_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a template test, available in any template rendered by the + application. Works like the :meth:`app_template_test` decorator. Equivalent to + :meth:`.Flask.add_template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.tests[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """Register a template global, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_app_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a template global, available in any template rendered by the + application. Works like the :meth:`app_template_global` decorator. Equivalent to + :meth:`.Flask.add_template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.globals[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def before_app_request(self, f: T_before_request) -> T_before_request: + """Like :meth:`before_request`, but before every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.before_request`. + """ + self.record_once( + lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def after_app_request(self, f: T_after_request) -> T_after_request: + """Like :meth:`after_request`, but after every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.after_request`. + """ + self.record_once( + lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def teardown_app_request(self, f: T_teardown) -> T_teardown: + """Like :meth:`teardown_request`, but after every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`. + """ + self.record_once( + lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_context_processor( + self, f: T_template_context_processor + ) -> T_template_context_processor: + """Like :meth:`context_processor`, but for templates rendered by every view, not + only by the blueprint. Equivalent to :meth:`.Flask.context_processor`. + """ + self.record_once( + lambda s: s.app.template_context_processors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_errorhandler( + self, code: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Like :meth:`errorhandler`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.errorhandler`. + """ + + def decorator(f: T_error_handler) -> T_error_handler: + self.record_once(lambda s: s.app.errorhandler(code)(f)) + return f + + return decorator + + @setupmethod + def app_url_value_preprocessor( + self, f: T_url_value_preprocessor + ) -> T_url_value_preprocessor: + """Like :meth:`url_value_preprocessor`, but for every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`. + """ + self.record_once( + lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Like :meth:`url_defaults`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.url_defaults`. + """ + self.record_once( + lambda s: s.app.url_default_functions.setdefault(None, []).append(f) + ) + return f diff --git a/Meliora/gmapenv/Lib/site-packages/flask/sansio/scaffold.py b/Meliora/gmapenv/Lib/site-packages/flask/sansio/scaffold.py new file mode 100644 index 00000000..a43f6fd7 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/sansio/scaffold.py @@ -0,0 +1,802 @@ +from __future__ import annotations + +import importlib.util +import os +import pathlib +import sys +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from jinja2 import FileSystemLoader +from werkzeug.exceptions import default_exceptions +from werkzeug.exceptions import HTTPException +from werkzeug.utils import cached_property + +from .. import typing as ft +from ..cli import AppGroup +from ..helpers import get_root_path +from ..templating import _default_template_ctx_processor + +# a singleton sentinel value for parameter defaults +_sentinel = object() + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) +T_route = t.TypeVar("T_route", bound=ft.RouteCallable) + + +def setupmethod(f: F) -> F: + f_name = f.__name__ + + def wrapper_func(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + self._check_setup_finished(f_name) + return f(self, *args, **kwargs) + + return t.cast(F, update_wrapper(wrapper_func, f)) + + +class Scaffold: + """Common behavior shared between :class:`~flask.Flask` and + :class:`~flask.blueprints.Blueprint`. + + :param import_name: The import name of the module where this object + is defined. Usually :attr:`__name__` should be used. + :param static_folder: Path to a folder of static files to serve. + If this is set, a static route will be added. + :param static_url_path: URL prefix for the static route. + :param template_folder: Path to a folder containing template files. + for rendering. If this is set, a Jinja loader will be added. + :param root_path: The path that static, template, and resource files + are relative to. Typically not set, it is discovered based on + the ``import_name``. + + .. versionadded:: 2.0 + """ + + name: str + _static_folder: str | None = None + _static_url_path: str | None = None + + def __init__( + self, + import_name: str, + static_folder: str | os.PathLike | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike | None = None, + root_path: str | None = None, + ): + #: The name of the package or module that this object belongs + #: to. Do not change this once it is set by the constructor. + self.import_name = import_name + + self.static_folder = static_folder # type: ignore + self.static_url_path = static_url_path + + #: The path to the templates folder, relative to + #: :attr:`root_path`, to add to the template loader. ``None`` if + #: templates should not be added. + self.template_folder = template_folder + + if root_path is None: + root_path = get_root_path(self.import_name) + + #: Absolute path to the package on the filesystem. Used to look + #: up resources contained in the package. + self.root_path = root_path + + #: The Click command group for registering CLI commands for this + #: object. The commands are available from the ``flask`` command + #: once the application has been discovered and blueprints have + #: been registered. + self.cli = AppGroup() + + #: A dictionary mapping endpoint names to view functions. + #: + #: To register a view function, use the :meth:`route` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.view_functions: dict[str, t.Callable] = {} + + #: A data structure of registered error handlers, in the format + #: ``{scope: {code: {class: handler}}}``. The ``scope`` key is + #: the name of a blueprint the handlers are active for, or + #: ``None`` for all requests. The ``code`` key is the HTTP + #: status code for ``HTTPException``, or ``None`` for + #: other exceptions. The innermost dictionary maps exception + #: classes to handler functions. + #: + #: To register an error handler, use the :meth:`errorhandler` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.error_handler_spec: dict[ + ft.AppOrBlueprintKey, + dict[int | None, dict[type[Exception], ft.ErrorHandlerCallable]], + ] = defaultdict(lambda: defaultdict(dict)) + + #: A data structure of functions to call at the beginning of + #: each request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`before_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.before_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.BeforeRequestCallable] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`after_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.after_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.AfterRequestCallable] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request even if an exception is raised, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`teardown_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.teardown_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.TeardownCallable] + ] = defaultdict(list) + + #: A data structure of functions to call to pass extra context + #: values when rendering templates, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`context_processor` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.template_context_processors: dict[ + ft.AppOrBlueprintKey, list[ft.TemplateContextProcessorCallable] + ] = defaultdict(list, {None: [_default_template_ctx_processor]}) + + #: A data structure of functions to call to modify the keyword + #: arguments passed to the view function, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the + #: :meth:`url_value_preprocessor` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_value_preprocessors: dict[ + ft.AppOrBlueprintKey, + list[ft.URLValuePreprocessorCallable], + ] = defaultdict(list) + + #: A data structure of functions to call to modify the keyword + #: arguments when generating URLs, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`url_defaults` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_default_functions: dict[ + ft.AppOrBlueprintKey, list[ft.URLDefaultCallable] + ] = defaultdict(list) + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.name!r}>" + + def _check_setup_finished(self, f_name: str) -> None: + raise NotImplementedError + + @property + def static_folder(self) -> str | None: + """The absolute path to the configured static folder. ``None`` + if no static folder is set. + """ + if self._static_folder is not None: + return os.path.join(self.root_path, self._static_folder) + else: + return None + + @static_folder.setter + def static_folder(self, value: str | os.PathLike | None) -> None: + if value is not None: + value = os.fspath(value).rstrip(r"\/") + + self._static_folder = value + + @property + def has_static_folder(self) -> bool: + """``True`` if :attr:`static_folder` is set. + + .. versionadded:: 0.5 + """ + return self.static_folder is not None + + @property + def static_url_path(self) -> str | None: + """The URL prefix that the static route will be accessible from. + + If it was not configured during init, it is derived from + :attr:`static_folder`. + """ + if self._static_url_path is not None: + return self._static_url_path + + if self.static_folder is not None: + basename = os.path.basename(self.static_folder) + return f"/{basename}".rstrip("/") + + return None + + @static_url_path.setter + def static_url_path(self, value: str | None) -> None: + if value is not None: + value = value.rstrip("/") + + self._static_url_path = value + + @cached_property + def jinja_loader(self) -> FileSystemLoader | None: + """The Jinja loader for this object's templates. By default this + is a class :class:`jinja2.loaders.FileSystemLoader` to + :attr:`template_folder` if it is set. + + .. versionadded:: 0.5 + """ + if self.template_folder is not None: + return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) + else: + return None + + def _method_route( + self, + method: str, + rule: str, + options: dict, + ) -> t.Callable[[T_route], T_route]: + if "methods" in options: + raise TypeError("Use the 'route' decorator to use the 'methods' argument.") + + return self.route(rule, methods=[method], **options) + + @setupmethod + def get(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["GET"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("GET", rule, options) + + @setupmethod + def post(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["POST"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("POST", rule, options) + + @setupmethod + def put(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PUT"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PUT", rule, options) + + @setupmethod + def delete(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["DELETE"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("DELETE", rule, options) + + @setupmethod + def patch(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PATCH"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PATCH", rule, options) + + @setupmethod + def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Decorate a view function to register it with the given URL + rule and options. Calls :meth:`add_url_rule`, which has more + details about the implementation. + + .. code-block:: python + + @app.route("/") + def index(): + return "Hello, World!" + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and + ``OPTIONS`` are added automatically. + + :param rule: The URL rule string. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + + def decorator(f: T_route) -> T_route: + endpoint = options.pop("endpoint", None) + self.add_url_rule(rule, endpoint, f, **options) + return f + + return decorator + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a rule for routing incoming requests and building + URLs. The :meth:`route` decorator is a shortcut to call this + with the ``view_func`` argument. These are equivalent: + + .. code-block:: python + + @app.route("/") + def index(): + ... + + .. code-block:: python + + def index(): + ... + + app.add_url_rule("/", view_func=index) + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. An error + will be raised if a function has already been registered for the + endpoint. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` is + always added automatically, and ``OPTIONS`` is added + automatically by default. + + ``view_func`` does not necessarily need to be passed, but if the + rule should participate in routing an endpoint name must be + associated with a view function at some point with the + :meth:`endpoint` decorator. + + .. code-block:: python + + app.add_url_rule("/", endpoint="index") + + @app.endpoint("index") + def index(): + ... + + If ``view_func`` has a ``required_methods`` attribute, those + methods are added to the passed and automatic methods. If it + has a ``provide_automatic_methods`` attribute, it is used as the + default if the parameter is not passed. + + :param rule: The URL rule string. + :param endpoint: The endpoint name to associate with the rule + and view function. Used when routing and building URLs. + Defaults to ``view_func.__name__``. + :param view_func: The view function to associate with the + endpoint name. + :param provide_automatic_options: Add the ``OPTIONS`` method and + respond to ``OPTIONS`` requests automatically. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + raise NotImplementedError + + @setupmethod + def endpoint(self, endpoint: str) -> t.Callable[[F], F]: + """Decorate a view function to register it for the given + endpoint. Used if a rule is added without a ``view_func`` with + :meth:`add_url_rule`. + + .. code-block:: python + + app.add_url_rule("/ex", endpoint="example") + + @app.endpoint("example") + def example(): + ... + + :param endpoint: The endpoint name to associate with the view + function. + """ + + def decorator(f: F) -> F: + self.view_functions[endpoint] = f + return f + + return decorator + + @setupmethod + def before_request(self, f: T_before_request) -> T_before_request: + """Register a function to run before each request. + + For example, this can be used to open a database connection, or + to load the logged in user from the session. + + .. code-block:: python + + @app.before_request + def load_user(): + if "user_id" in session: + g.user = db.session.get(session["user_id"]) + + The function will be called without any arguments. If it returns + a non-``None`` value, the value is handled as if it was the + return value from the view, and further request handling is + stopped. + + This is available on both app and blueprint objects. When used on an app, this + executes before every request. When used on a blueprint, this executes before + every request that the blueprint handles. To register with a blueprint and + execute before every request, use :meth:`.Blueprint.before_app_request`. + """ + self.before_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def after_request(self, f: T_after_request) -> T_after_request: + """Register a function to run after each request to this object. + + The function is called with the response object, and must return + a response object. This allows the functions to modify or + replace the response before it is sent. + + If a function raises an exception, any remaining + ``after_request`` functions will not be called. Therefore, this + should not be used for actions that must execute, such as to + close resources. Use :meth:`teardown_request` for that. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.after_app_request`. + """ + self.after_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_request(self, f: T_teardown) -> T_teardown: + """Register a function to be called when the request context is + popped. Typically this happens at the end of each request, but + contexts may be pushed manually as well during testing. + + .. code-block:: python + + with app.test_request_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the request context is + made inactive. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.teardown_app_request`. + """ + self.teardown_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def context_processor( + self, + f: T_template_context_processor, + ) -> T_template_context_processor: + """Registers a template context processor function. These functions run before + rendering a template. The keys of the returned dict are added as variables + available in the template. + + This is available on both app and blueprint objects. When used on an app, this + is called for every rendered template. When used on a blueprint, this is called + for templates rendered from the blueprint's views. To register with a blueprint + and affect every template, use :meth:`.Blueprint.app_context_processor`. + """ + self.template_context_processors[None].append(f) + return f + + @setupmethod + def url_value_preprocessor( + self, + f: T_url_value_preprocessor, + ) -> T_url_value_preprocessor: + """Register a URL value preprocessor function for all view + functions in the application. These functions will be called before the + :meth:`before_request` functions. + + The function can modify the values captured from the matched url before + they are passed to the view. For example, this can be used to pop a + common language code value and place it in ``g`` rather than pass it to + every view. + + The function is passed the endpoint name and values dict. The return + value is ignored. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_value_preprocessor`. + """ + self.url_value_preprocessors[None].append(f) + return f + + @setupmethod + def url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Callback function for URL defaults for all view functions of the + application. It's called with the endpoint and values and should + update the values passed in place. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_defaults`. + """ + self.url_default_functions[None].append(f) + return f + + @setupmethod + def errorhandler( + self, code_or_exception: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Register a function to handle errors by code or exception class. + + A decorator that is used to register a function given an + error code. Example:: + + @app.errorhandler(404) + def page_not_found(error): + return 'This page does not exist', 404 + + You can also register handlers for arbitrary exceptions:: + + @app.errorhandler(DatabaseError) + def special_exception_handler(error): + return 'Database connection failed', 500 + + This is available on both app and blueprint objects. When used on an app, this + can handle errors from every request. When used on a blueprint, this can handle + errors from requests that the blueprint handles. To register with a blueprint + and affect every request, use :meth:`.Blueprint.app_errorhandler`. + + .. versionadded:: 0.7 + Use :meth:`register_error_handler` instead of modifying + :attr:`error_handler_spec` directly, for application wide error + handlers. + + .. versionadded:: 0.7 + One can now additionally also register custom exception types + that do not necessarily have to be a subclass of the + :class:`~werkzeug.exceptions.HTTPException` class. + + :param code_or_exception: the code as integer for the handler, or + an arbitrary exception + """ + + def decorator(f: T_error_handler) -> T_error_handler: + self.register_error_handler(code_or_exception, f) + return f + + return decorator + + @setupmethod + def register_error_handler( + self, + code_or_exception: type[Exception] | int, + f: ft.ErrorHandlerCallable, + ) -> None: + """Alternative error attach function to the :meth:`errorhandler` + decorator that is more straightforward to use for non decorator + usage. + + .. versionadded:: 0.7 + """ + exc_class, code = self._get_exc_class_and_code(code_or_exception) + self.error_handler_spec[None][code][exc_class] = f + + @staticmethod + def _get_exc_class_and_code( + exc_class_or_code: type[Exception] | int, + ) -> tuple[type[Exception], int | None]: + """Get the exception class being handled. For HTTP status codes + or ``HTTPException`` subclasses, return both the exception and + status code. + + :param exc_class_or_code: Any exception class, or an HTTP status + code as an integer. + """ + exc_class: type[Exception] + + if isinstance(exc_class_or_code, int): + try: + exc_class = default_exceptions[exc_class_or_code] + except KeyError: + raise ValueError( + f"'{exc_class_or_code}' is not a recognized HTTP" + " error code. Use a subclass of HTTPException with" + " that code instead." + ) from None + else: + exc_class = exc_class_or_code + + if isinstance(exc_class, Exception): + raise TypeError( + f"{exc_class!r} is an instance, not a class. Handlers" + " can only be registered for Exception classes or HTTP" + " error codes." + ) + + if not issubclass(exc_class, Exception): + raise ValueError( + f"'{exc_class.__name__}' is not a subclass of Exception." + " Handlers can only be registered for Exception classes" + " or HTTP error codes." + ) + + if issubclass(exc_class, HTTPException): + return exc_class, exc_class.code + else: + return exc_class, None + + +def _endpoint_from_view_func(view_func: t.Callable) -> str: + """Internal helper that returns the default endpoint for a given + function. This always is the function name. + """ + assert view_func is not None, "expected view func if endpoint is not provided." + return view_func.__name__ + + +def _path_is_relative_to(path: pathlib.PurePath, base: str) -> bool: + # Path.is_relative_to doesn't exist until Python 3.9 + try: + path.relative_to(base) + return True + except ValueError: + return False + + +def _find_package_path(import_name): + """Find the path that contains the package or module.""" + root_mod_name, _, _ = import_name.partition(".") + + try: + root_spec = importlib.util.find_spec(root_mod_name) + + if root_spec is None: + raise ValueError("not found") + except (ImportError, ValueError): + # ImportError: the machinery told us it does not exist + # ValueError: + # - the module name was invalid + # - the module name is __main__ + # - we raised `ValueError` due to `root_spec` being `None` + return os.getcwd() + + if root_spec.origin in {"namespace", None}: + # namespace package + package_spec = importlib.util.find_spec(import_name) + + if package_spec is not None and package_spec.submodule_search_locations: + # Pick the path in the namespace that contains the submodule. + package_path = pathlib.Path( + os.path.commonpath(package_spec.submodule_search_locations) + ) + search_location = next( + location + for location in root_spec.submodule_search_locations + if _path_is_relative_to(package_path, location) + ) + else: + # Pick the first path. + search_location = root_spec.submodule_search_locations[0] + + return os.path.dirname(search_location) + elif root_spec.submodule_search_locations: + # package with __init__.py + return os.path.dirname(os.path.dirname(root_spec.origin)) + else: + # module + return os.path.dirname(root_spec.origin) + + +def find_package(import_name: str): + """Find the prefix that a package is installed under, and the path + that it would be imported from. + + The prefix is the directory containing the standard directory + hierarchy (lib, bin, etc.). If the package is not installed to the + system (:attr:`sys.prefix`) or a virtualenv (``site-packages``), + ``None`` is returned. + + The path is the entry in :attr:`sys.path` that contains the package + for import. If the package is not installed, it's assumed that the + package was imported from the current working directory. + """ + package_path = _find_package_path(import_name) + py_prefix = os.path.abspath(sys.prefix) + + # installed to the system + if _path_is_relative_to(pathlib.PurePath(package_path), py_prefix): + return py_prefix, package_path + + site_parent, site_folder = os.path.split(package_path) + + # installed to a virtualenv + if site_folder.lower() == "site-packages": + parent, folder = os.path.split(site_parent) + + # Windows (prefix/lib/site-packages) + if folder.lower() == "lib": + return parent, package_path + + # Unix (prefix/lib/pythonX.Y/site-packages) + if os.path.basename(parent).lower() == "lib": + return os.path.dirname(parent), package_path + + # something else (prefix/site-packages) + return site_parent, package_path + + # not installed + return None, package_path diff --git a/Meliora/gmapenv/Lib/site-packages/flask/sessions.py b/Meliora/gmapenv/Lib/site-packages/flask/sessions.py new file mode 100644 index 00000000..e5650d68 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/sessions.py @@ -0,0 +1,367 @@ +from __future__ import annotations + +import hashlib +import typing as t +from collections.abc import MutableMapping +from datetime import datetime +from datetime import timezone + +from itsdangerous import BadSignature +from itsdangerous import URLSafeTimedSerializer +from werkzeug.datastructures import CallbackDict + +from .json.tag import TaggedJSONSerializer + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .wrappers import Request, Response + + +class SessionMixin(MutableMapping): + """Expands a basic dictionary with session attributes.""" + + @property + def permanent(self) -> bool: + """This reflects the ``'_permanent'`` key in the dict.""" + return self.get("_permanent", False) + + @permanent.setter + def permanent(self, value: bool) -> None: + self["_permanent"] = bool(value) + + #: Some implementations can detect whether a session is newly + #: created, but that is not guaranteed. Use with caution. The mixin + # default is hard-coded ``False``. + new = False + + #: Some implementations can detect changes to the session and set + #: this when that happens. The mixin default is hard coded to + #: ``True``. + modified = True + + #: Some implementations can detect when session data is read or + #: written and set this when that happens. The mixin default is hard + #: coded to ``True``. + accessed = True + + +class SecureCookieSession(CallbackDict, SessionMixin): + """Base class for sessions based on signed cookies. + + This session backend will set the :attr:`modified` and + :attr:`accessed` attributes. It cannot reliably track whether a + session is new (vs. empty), so :attr:`new` remains hard coded to + ``False``. + """ + + #: When data is changed, this is set to ``True``. Only the session + #: dictionary itself is tracked; if the session contains mutable + #: data (for example a nested dict) then this must be set to + #: ``True`` manually when modifying that data. The session cookie + #: will only be written to the response if this is ``True``. + modified = False + + #: When data is read or written, this is set to ``True``. Used by + # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` + #: header, which allows caching proxies to cache different pages for + #: different users. + accessed = False + + def __init__(self, initial: t.Any = None) -> None: + def on_update(self) -> None: + self.modified = True + self.accessed = True + + super().__init__(initial, on_update) + + def __getitem__(self, key: str) -> t.Any: + self.accessed = True + return super().__getitem__(key) + + def get(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().get(key, default) + + def setdefault(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().setdefault(key, default) + + +class NullSession(SecureCookieSession): + """Class used to generate nicer error messages if sessions are not + available. Will still allow read-only access to the empty session + but fail on setting. + """ + + def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + raise RuntimeError( + "The session is unavailable because no secret " + "key was set. Set the secret_key on the " + "application to something unique and secret." + ) + + __setitem__ = __delitem__ = clear = pop = popitem = update = setdefault = _fail # type: ignore # noqa: B950 + del _fail + + +class SessionInterface: + """The basic interface you have to implement in order to replace the + default session interface which uses werkzeug's securecookie + implementation. The only methods you have to implement are + :meth:`open_session` and :meth:`save_session`, the others have + useful defaults which you don't need to change. + + The session object returned by the :meth:`open_session` method has to + provide a dictionary like interface plus the properties and methods + from the :class:`SessionMixin`. We recommend just subclassing a dict + and adding that mixin:: + + class Session(dict, SessionMixin): + pass + + If :meth:`open_session` returns ``None`` Flask will call into + :meth:`make_null_session` to create a session that acts as replacement + if the session support cannot work because some requirement is not + fulfilled. The default :class:`NullSession` class that is created + will complain that the secret key was not set. + + To replace the session interface on an application all you have to do + is to assign :attr:`flask.Flask.session_interface`:: + + app = Flask(__name__) + app.session_interface = MySessionInterface() + + Multiple requests with the same session may be sent and handled + concurrently. When implementing a new session interface, consider + whether reads or writes to the backing store must be synchronized. + There is no guarantee on the order in which the session for each + request is opened or saved, it will occur in the order that requests + begin and end processing. + + .. versionadded:: 0.8 + """ + + #: :meth:`make_null_session` will look here for the class that should + #: be created when a null session is requested. Likewise the + #: :meth:`is_null_session` method will perform a typecheck against + #: this type. + null_session_class = NullSession + + #: A flag that indicates if the session interface is pickle based. + #: This can be used by Flask extensions to make a decision in regards + #: to how to deal with the session object. + #: + #: .. versionadded:: 0.10 + pickle_based = False + + def make_null_session(self, app: Flask) -> NullSession: + """Creates a null session which acts as a replacement object if the + real session support could not be loaded due to a configuration + error. This mainly aids the user experience because the job of the + null session is to still support lookup without complaining but + modifications are answered with a helpful error message of what + failed. + + This creates an instance of :attr:`null_session_class` by default. + """ + return self.null_session_class() + + def is_null_session(self, obj: object) -> bool: + """Checks if a given object is a null session. Null sessions are + not asked to be saved. + + This checks if the object is an instance of :attr:`null_session_class` + by default. + """ + return isinstance(obj, self.null_session_class) + + def get_cookie_name(self, app: Flask) -> str: + """The name of the session cookie. Uses``app.config["SESSION_COOKIE_NAME"]``.""" + return app.config["SESSION_COOKIE_NAME"] + + def get_cookie_domain(self, app: Flask) -> str | None: + """The value of the ``Domain`` parameter on the session cookie. If not set, + browsers will only send the cookie to the exact domain it was set from. + Otherwise, they will send it to any subdomain of the given value as well. + + Uses the :data:`SESSION_COOKIE_DOMAIN` config. + + .. versionchanged:: 2.3 + Not set by default, does not fall back to ``SERVER_NAME``. + """ + rv = app.config["SESSION_COOKIE_DOMAIN"] + return rv if rv else None + + def get_cookie_path(self, app: Flask) -> str: + """Returns the path for which the cookie should be valid. The + default implementation uses the value from the ``SESSION_COOKIE_PATH`` + config var if it's set, and falls back to ``APPLICATION_ROOT`` or + uses ``/`` if it's ``None``. + """ + return app.config["SESSION_COOKIE_PATH"] or app.config["APPLICATION_ROOT"] + + def get_cookie_httponly(self, app: Flask) -> bool: + """Returns True if the session cookie should be httponly. This + currently just returns the value of the ``SESSION_COOKIE_HTTPONLY`` + config var. + """ + return app.config["SESSION_COOKIE_HTTPONLY"] + + def get_cookie_secure(self, app: Flask) -> bool: + """Returns True if the cookie should be secure. This currently + just returns the value of the ``SESSION_COOKIE_SECURE`` setting. + """ + return app.config["SESSION_COOKIE_SECURE"] + + def get_cookie_samesite(self, app: Flask) -> str: + """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the + ``SameSite`` attribute. This currently just returns the value of + the :data:`SESSION_COOKIE_SAMESITE` setting. + """ + return app.config["SESSION_COOKIE_SAMESITE"] + + def get_expiration_time(self, app: Flask, session: SessionMixin) -> datetime | None: + """A helper method that returns an expiration date for the session + or ``None`` if the session is linked to the browser session. The + default implementation returns now + the permanent session + lifetime configured on the application. + """ + if session.permanent: + return datetime.now(timezone.utc) + app.permanent_session_lifetime + return None + + def should_set_cookie(self, app: Flask, session: SessionMixin) -> bool: + """Used by session backends to determine if a ``Set-Cookie`` header + should be set for this session cookie for this response. If the session + has been modified, the cookie is set. If the session is permanent and + the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is + always set. + + This check is usually skipped if the session was deleted. + + .. versionadded:: 0.11 + """ + + return session.modified or ( + session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"] + ) + + def open_session(self, app: Flask, request: Request) -> SessionMixin | None: + """This is called at the beginning of each request, after + pushing the request context, before matching the URL. + + This must return an object which implements a dictionary-like + interface as well as the :class:`SessionMixin` interface. + + This will return ``None`` to indicate that loading failed in + some way that is not immediately an error. The request + context will fall back to using :meth:`make_null_session` + in this case. + """ + raise NotImplementedError() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + """This is called at the end of each request, after generating + a response, before removing the request context. It is skipped + if :meth:`is_null_session` returns ``True``. + """ + raise NotImplementedError() + + +session_json_serializer = TaggedJSONSerializer() + + +class SecureCookieSessionInterface(SessionInterface): + """The default session interface that stores sessions in signed cookies + through the :mod:`itsdangerous` module. + """ + + #: the salt that should be applied on top of the secret key for the + #: signing of cookie based sessions. + salt = "cookie-session" + #: the hash function to use for the signature. The default is sha1 + digest_method = staticmethod(hashlib.sha1) + #: the name of the itsdangerous supported key derivation. The default + #: is hmac. + key_derivation = "hmac" + #: A python serializer for the payload. The default is a compact + #: JSON derived serializer with support for some extra Python types + #: such as datetime objects or tuples. + serializer = session_json_serializer + session_class = SecureCookieSession + + def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None: + if not app.secret_key: + return None + signer_kwargs = dict( + key_derivation=self.key_derivation, digest_method=self.digest_method + ) + return URLSafeTimedSerializer( + app.secret_key, + salt=self.salt, + serializer=self.serializer, + signer_kwargs=signer_kwargs, + ) + + def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None: + s = self.get_signing_serializer(app) + if s is None: + return None + val = request.cookies.get(self.get_cookie_name(app)) + if not val: + return self.session_class() + max_age = int(app.permanent_session_lifetime.total_seconds()) + try: + data = s.loads(val, max_age=max_age) + return self.session_class(data) + except BadSignature: + return self.session_class() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + name = self.get_cookie_name(app) + domain = self.get_cookie_domain(app) + path = self.get_cookie_path(app) + secure = self.get_cookie_secure(app) + samesite = self.get_cookie_samesite(app) + httponly = self.get_cookie_httponly(app) + + # Add a "Vary: Cookie" header if the session was accessed at all. + if session.accessed: + response.vary.add("Cookie") + + # If the session is modified to be empty, remove the cookie. + # If the session is empty, return without setting the cookie. + if not session: + if session.modified: + response.delete_cookie( + name, + domain=domain, + path=path, + secure=secure, + samesite=samesite, + httponly=httponly, + ) + response.vary.add("Cookie") + + return + + if not self.should_set_cookie(app, session): + return + + expires = self.get_expiration_time(app, session) + val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignore + response.set_cookie( + name, + val, # type: ignore + expires=expires, + httponly=httponly, + domain=domain, + path=path, + secure=secure, + samesite=samesite, + ) + response.vary.add("Cookie") diff --git a/Meliora/gmapenv/Lib/site-packages/flask/signals.py b/Meliora/gmapenv/Lib/site-packages/flask/signals.py new file mode 100644 index 00000000..444fda99 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/signals.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from blinker import Namespace + +# This namespace is only for signals provided by Flask itself. +_signals = Namespace() + +template_rendered = _signals.signal("template-rendered") +before_render_template = _signals.signal("before-render-template") +request_started = _signals.signal("request-started") +request_finished = _signals.signal("request-finished") +request_tearing_down = _signals.signal("request-tearing-down") +got_request_exception = _signals.signal("got-request-exception") +appcontext_tearing_down = _signals.signal("appcontext-tearing-down") +appcontext_pushed = _signals.signal("appcontext-pushed") +appcontext_popped = _signals.signal("appcontext-popped") +message_flashed = _signals.signal("message-flashed") diff --git a/Meliora/gmapenv/Lib/site-packages/flask/templating.py b/Meliora/gmapenv/Lib/site-packages/flask/templating.py new file mode 100644 index 00000000..8dff8bac --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/templating.py @@ -0,0 +1,221 @@ +from __future__ import annotations + +import typing as t + +from jinja2 import BaseLoader +from jinja2 import Environment as BaseEnvironment +from jinja2 import Template +from jinja2 import TemplateNotFound + +from .globals import _cv_app +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .helpers import stream_with_context +from .signals import before_render_template +from .signals import template_rendered + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .sansio.app import App + from .sansio.scaffold import Scaffold + + +def _default_template_ctx_processor() -> dict[str, t.Any]: + """Default template context processor. Injects `request`, + `session` and `g`. + """ + appctx = _cv_app.get(None) + reqctx = _cv_request.get(None) + rv: dict[str, t.Any] = {} + if appctx is not None: + rv["g"] = appctx.g + if reqctx is not None: + rv["request"] = reqctx.request + rv["session"] = reqctx.session + return rv + + +class Environment(BaseEnvironment): + """Works like a regular Jinja2 environment but has some additional + knowledge of how Flask's blueprint works so that it can prepend the + name of the blueprint to referenced templates if necessary. + """ + + def __init__(self, app: App, **options: t.Any) -> None: + if "loader" not in options: + options["loader"] = app.create_global_jinja_loader() + BaseEnvironment.__init__(self, **options) + self.app = app + + +class DispatchingJinjaLoader(BaseLoader): + """A loader that looks for templates in the application and all + the blueprint folders. + """ + + def __init__(self, app: App) -> None: + self.app = app + + def get_source( # type: ignore + self, environment: Environment, template: str + ) -> tuple[str, str | None, t.Callable | None]: + if self.app.config["EXPLAIN_TEMPLATE_LOADING"]: + return self._get_source_explained(environment, template) + return self._get_source_fast(environment, template) + + def _get_source_explained( + self, environment: Environment, template: str + ) -> tuple[str, str | None, t.Callable | None]: + attempts = [] + rv: tuple[str, str | None, t.Callable[[], bool] | None] | None + trv: None | (tuple[str, str | None, t.Callable[[], bool] | None]) = None + + for srcobj, loader in self._iter_loaders(template): + try: + rv = loader.get_source(environment, template) + if trv is None: + trv = rv + except TemplateNotFound: + rv = None + attempts.append((loader, srcobj, rv)) + + from .debughelpers import explain_template_loading_attempts + + explain_template_loading_attempts(self.app, template, attempts) + + if trv is not None: + return trv + raise TemplateNotFound(template) + + def _get_source_fast( + self, environment: Environment, template: str + ) -> tuple[str, str | None, t.Callable | None]: + for _srcobj, loader in self._iter_loaders(template): + try: + return loader.get_source(environment, template) + except TemplateNotFound: + continue + raise TemplateNotFound(template) + + def _iter_loaders( + self, template: str + ) -> t.Generator[tuple[Scaffold, BaseLoader], None, None]: + loader = self.app.jinja_loader + if loader is not None: + yield self.app, loader + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + yield blueprint, loader + + def list_templates(self) -> list[str]: + result = set() + loader = self.app.jinja_loader + if loader is not None: + result.update(loader.list_templates()) + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + for template in loader.list_templates(): + result.add(template) + + return list(result) + + +def _render(app: Flask, template: Template, context: dict[str, t.Any]) -> str: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + rv = template.render(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + return rv + + +def render_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> str: + """Render a template by name with the given context. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _render(app, template, context) + + +def render_template_string(source: str, **context: t.Any) -> str: + """Render a template from the given source string with the given + context. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _render(app, template, context) + + +def _stream( + app: Flask, template: Template, context: dict[str, t.Any] +) -> t.Iterator[str]: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + def generate() -> t.Iterator[str]: + yield from template.generate(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + rv = generate() + + # If a request context is active, keep it while generating. + if request: + rv = stream_with_context(rv) + + return rv + + +def stream_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> t.Iterator[str]: + """Render a template by name with the given context as a stream. + This returns an iterator of strings, which can be used as a + streaming response from a view. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _stream(app, template, context) + + +def stream_template_string(source: str, **context: t.Any) -> t.Iterator[str]: + """Render a template from the given source string with the given + context as a stream. This returns an iterator of strings, which can + be used as a streaming response from a view. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _stream(app, template, context) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/testing.py b/Meliora/gmapenv/Lib/site-packages/flask/testing.py new file mode 100644 index 00000000..69aa7851 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/testing.py @@ -0,0 +1,295 @@ +from __future__ import annotations + +import importlib.metadata +import typing as t +from contextlib import contextmanager +from contextlib import ExitStack +from copy import copy +from types import TracebackType +from urllib.parse import urlsplit + +import werkzeug.test +from click.testing import CliRunner +from werkzeug.test import Client +from werkzeug.wrappers import Request as BaseRequest + +from .cli import ScriptInfo +from .sessions import SessionMixin + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.test import TestResponse + + from .app import Flask + + +class EnvironBuilder(werkzeug.test.EnvironBuilder): + """An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the + application. + + :param app: The Flask application to configure the environment from. + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + + def __init__( + self, + app: Flask, + path: str = "/", + base_url: str | None = None, + subdomain: str | None = None, + url_scheme: str | None = None, + *args: t.Any, + **kwargs: t.Any, + ) -> None: + assert not (base_url or subdomain or url_scheme) or ( + base_url is not None + ) != bool( + subdomain or url_scheme + ), 'Cannot pass "subdomain" or "url_scheme" with "base_url".' + + if base_url is None: + http_host = app.config.get("SERVER_NAME") or "localhost" + app_root = app.config["APPLICATION_ROOT"] + + if subdomain: + http_host = f"{subdomain}.{http_host}" + + if url_scheme is None: + url_scheme = app.config["PREFERRED_URL_SCHEME"] + + url = urlsplit(path) + base_url = ( + f"{url.scheme or url_scheme}://{url.netloc or http_host}" + f"/{app_root.lstrip('/')}" + ) + path = url.path + + if url.query: + sep = b"?" if isinstance(url.query, bytes) else "?" + path += sep + url.query + + self.app = app + super().__init__(path, base_url, *args, **kwargs) + + def json_dumps(self, obj: t.Any, **kwargs: t.Any) -> str: # type: ignore + """Serialize ``obj`` to a JSON-formatted string. + + The serialization will be configured according to the config associated + with this EnvironBuilder's ``app``. + """ + return self.app.json.dumps(obj, **kwargs) + + +_werkzeug_version = "" + + +def _get_werkzeug_version() -> str: + global _werkzeug_version + + if not _werkzeug_version: + _werkzeug_version = importlib.metadata.version("werkzeug") + + return _werkzeug_version + + +class FlaskClient(Client): + """Works like a regular Werkzeug test client but has knowledge about + Flask's contexts to defer the cleanup of the request context until + the end of a ``with`` block. For general information about how to + use this class refer to :class:`werkzeug.test.Client`. + + .. versionchanged:: 0.12 + `app.test_client()` includes preset default environment, which can be + set after instantiation of the `app.test_client()` object in + `client.environ_base`. + + Basic usage is outlined in the :doc:`/testing` chapter. + """ + + application: Flask + + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + super().__init__(*args, **kwargs) + self.preserve_context = False + self._new_contexts: list[t.ContextManager[t.Any]] = [] + self._context_stack = ExitStack() + self.environ_base = { + "REMOTE_ADDR": "127.0.0.1", + "HTTP_USER_AGENT": f"Werkzeug/{_get_werkzeug_version()}", + } + + @contextmanager + def session_transaction( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Generator[SessionMixin, None, None]: + """When used in combination with a ``with`` statement this opens a + session transaction. This can be used to modify the session that + the test client uses. Once the ``with`` block is left the session is + stored back. + + :: + + with client.session_transaction() as session: + session['value'] = 42 + + Internally this is implemented by going through a temporary test + request context and since session handling could depend on + request variables this function accepts the same arguments as + :meth:`~flask.Flask.test_request_context` which are directly + passed through. + """ + if self._cookies is None: + raise TypeError( + "Cookies are disabled. Create a client with 'use_cookies=True'." + ) + + app = self.application + ctx = app.test_request_context(*args, **kwargs) + self._add_cookies_to_wsgi(ctx.request.environ) + + with ctx: + sess = app.session_interface.open_session(app, ctx.request) + + if sess is None: + raise RuntimeError("Session backend did not open a session.") + + yield sess + resp = app.response_class() + + if app.session_interface.is_null_session(sess): + return + + with ctx: + app.session_interface.save_session(app, sess, resp) + + self._update_cookies_from_response( + ctx.request.host.partition(":")[0], + ctx.request.path, + resp.headers.getlist("Set-Cookie"), + ) + + def _copy_environ(self, other): + out = {**self.environ_base, **other} + + if self.preserve_context: + out["werkzeug.debug.preserve_context"] = self._new_contexts.append + + return out + + def _request_from_builder_args(self, args, kwargs): + kwargs["environ_base"] = self._copy_environ(kwargs.get("environ_base", {})) + builder = EnvironBuilder(self.application, *args, **kwargs) + + try: + return builder.get_request() + finally: + builder.close() + + def open( + self, + *args: t.Any, + buffered: bool = False, + follow_redirects: bool = False, + **kwargs: t.Any, + ) -> TestResponse: + if args and isinstance( + args[0], (werkzeug.test.EnvironBuilder, dict, BaseRequest) + ): + if isinstance(args[0], werkzeug.test.EnvironBuilder): + builder = copy(args[0]) + builder.environ_base = self._copy_environ(builder.environ_base or {}) + request = builder.get_request() + elif isinstance(args[0], dict): + request = EnvironBuilder.from_environ( + args[0], app=self.application, environ_base=self._copy_environ({}) + ).get_request() + else: + # isinstance(args[0], BaseRequest) + request = copy(args[0]) + request.environ = self._copy_environ(request.environ) + else: + # request is None + request = self._request_from_builder_args(args, kwargs) + + # Pop any previously preserved contexts. This prevents contexts + # from being preserved across redirects or multiple requests + # within a single block. + self._context_stack.close() + + response = super().open( + request, + buffered=buffered, + follow_redirects=follow_redirects, + ) + response.json_module = self.application.json # type: ignore[assignment] + + # Re-push contexts that were preserved during the request. + while self._new_contexts: + cm = self._new_contexts.pop() + self._context_stack.enter_context(cm) + + return response + + def __enter__(self) -> FlaskClient: + if self.preserve_context: + raise RuntimeError("Cannot nest client invocations") + self.preserve_context = True + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.preserve_context = False + self._context_stack.close() + + +class FlaskCliRunner(CliRunner): + """A :class:`~click.testing.CliRunner` for testing a Flask app's + CLI commands. Typically created using + :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. + """ + + def __init__(self, app: Flask, **kwargs: t.Any) -> None: + self.app = app + super().__init__(**kwargs) + + def invoke( # type: ignore + self, cli: t.Any = None, args: t.Any = None, **kwargs: t.Any + ) -> t.Any: + """Invokes a CLI command in an isolated environment. See + :meth:`CliRunner.invoke ` for + full method documentation. See :ref:`testing-cli` for examples. + + If the ``obj`` argument is not given, passes an instance of + :class:`~flask.cli.ScriptInfo` that knows how to load the Flask + app being tested. + + :param cli: Command object to invoke. Default is the app's + :attr:`~flask.app.Flask.cli` group. + :param args: List of strings to invoke the command with. + + :return: a :class:`~click.testing.Result` object. + """ + if cli is None: + cli = self.app.cli # type: ignore + + if "obj" not in kwargs: + kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) + + return super().invoke(cli, args, **kwargs) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/typing.py b/Meliora/gmapenv/Lib/site-packages/flask/typing.py new file mode 100644 index 00000000..a8c9ba04 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/typing.py @@ -0,0 +1,88 @@ +from __future__ import annotations + +import typing as t + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIApplication # noqa: F401 + from werkzeug.datastructures import Headers # noqa: F401 + from werkzeug.sansio.response import Response # noqa: F401 + +# The possible types that are directly convertible or are a Response object. +ResponseValue = t.Union[ + "Response", + str, + bytes, + t.List[t.Any], + # Only dict is actually accepted, but Mapping allows for TypedDict. + t.Mapping[str, t.Any], + t.Iterator[str], + t.Iterator[bytes], +] + +# the possible types for an individual HTTP header +# This should be a Union, but mypy doesn't pass unless it's a TypeVar. +HeaderValue = t.Union[str, t.List[str], t.Tuple[str, ...]] + +# the possible types for HTTP headers +HeadersValue = t.Union[ + "Headers", + t.Mapping[str, HeaderValue], + t.Sequence[t.Tuple[str, HeaderValue]], +] + +# The possible types returned by a route function. +ResponseReturnValue = t.Union[ + ResponseValue, + t.Tuple[ResponseValue, HeadersValue], + t.Tuple[ResponseValue, int], + t.Tuple[ResponseValue, int, HeadersValue], + "WSGIApplication", +] + +# Allow any subclass of werkzeug.Response, such as the one from Flask, +# as a callback argument. Using werkzeug.Response directly makes a +# callback annotated with flask.Response fail type checking. +ResponseClass = t.TypeVar("ResponseClass", bound="Response") + +AppOrBlueprintKey = t.Optional[str] # The App key is None, whereas blueprints are named +AfterRequestCallable = t.Union[ + t.Callable[[ResponseClass], ResponseClass], + t.Callable[[ResponseClass], t.Awaitable[ResponseClass]], +] +BeforeFirstRequestCallable = t.Union[ + t.Callable[[], None], t.Callable[[], t.Awaitable[None]] +] +BeforeRequestCallable = t.Union[ + t.Callable[[], t.Optional[ResponseReturnValue]], + t.Callable[[], t.Awaitable[t.Optional[ResponseReturnValue]]], +] +ShellContextProcessorCallable = t.Callable[[], t.Dict[str, t.Any]] +TeardownCallable = t.Union[ + t.Callable[[t.Optional[BaseException]], None], + t.Callable[[t.Optional[BaseException]], t.Awaitable[None]], +] +TemplateContextProcessorCallable = t.Union[ + t.Callable[[], t.Dict[str, t.Any]], + t.Callable[[], t.Awaitable[t.Dict[str, t.Any]]], +] +TemplateFilterCallable = t.Callable[..., t.Any] +TemplateGlobalCallable = t.Callable[..., t.Any] +TemplateTestCallable = t.Callable[..., bool] +URLDefaultCallable = t.Callable[[str, dict], None] +URLValuePreprocessorCallable = t.Callable[[t.Optional[str], t.Optional[dict]], None] + +# This should take Exception, but that either breaks typing the argument +# with a specific exception, or decorating multiple times with different +# exceptions (and using a union type on the argument). +# https://github.com/pallets/flask/issues/4095 +# https://github.com/pallets/flask/issues/4295 +# https://github.com/pallets/flask/issues/4297 +ErrorHandlerCallable = t.Union[ + t.Callable[[t.Any], ResponseReturnValue], + t.Callable[[t.Any], t.Awaitable[ResponseReturnValue]], +] + +RouteCallable = t.Union[ + t.Callable[..., ResponseReturnValue], + t.Callable[..., t.Awaitable[ResponseReturnValue]], +] diff --git a/Meliora/gmapenv/Lib/site-packages/flask/views.py b/Meliora/gmapenv/Lib/site-packages/flask/views.py new file mode 100644 index 00000000..c7a2b621 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/views.py @@ -0,0 +1,190 @@ +from __future__ import annotations + +import typing as t + +from . import typing as ft +from .globals import current_app +from .globals import request + + +http_method_funcs = frozenset( + ["get", "post", "head", "options", "delete", "put", "trace", "patch"] +) + + +class View: + """Subclass this class and override :meth:`dispatch_request` to + create a generic class-based view. Call :meth:`as_view` to create a + view function that creates an instance of the class with the given + arguments and calls its ``dispatch_request`` method with any URL + variables. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class Hello(View): + init_every_request = False + + def dispatch_request(self, name): + return f"Hello, {name}!" + + app.add_url_rule( + "/hello/", view_func=Hello.as_view("hello") + ) + + Set :attr:`methods` on the class to change what methods the view + accepts. + + Set :attr:`decorators` on the class to apply a list of decorators to + the generated view function. Decorators applied to the class itself + will not be applied to the generated view function! + + Set :attr:`init_every_request` to ``False`` for efficiency, unless + you need to store request-global data on ``self``. + """ + + #: The methods this view is registered for. Uses the same default + #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and + #: ``add_url_rule`` by default. + methods: t.ClassVar[t.Collection[str] | None] = None + + #: Control whether the ``OPTIONS`` method is handled automatically. + #: Uses the same default (``True``) as ``route`` and + #: ``add_url_rule`` by default. + provide_automatic_options: t.ClassVar[bool | None] = None + + #: A list of decorators to apply, in order, to the generated view + #: function. Remember that ``@decorator`` syntax is applied bottom + #: to top, so the first decorator in the list would be the bottom + #: decorator. + #: + #: .. versionadded:: 0.8 + decorators: t.ClassVar[list[t.Callable]] = [] + + #: Create a new instance of this view class for every request by + #: default. If a view subclass sets this to ``False``, the same + #: instance is used for every request. + #: + #: A single instance is more efficient, especially if complex setup + #: is done during init. However, storing data on ``self`` is no + #: longer safe across requests, and :data:`~flask.g` should be used + #: instead. + #: + #: .. versionadded:: 2.2 + init_every_request: t.ClassVar[bool] = True + + def dispatch_request(self) -> ft.ResponseReturnValue: + """The actual view function behavior. Subclasses must override + this and return a valid response. Any variables from the URL + rule are passed as keyword arguments. + """ + raise NotImplementedError() + + @classmethod + def as_view( + cls, name: str, *class_args: t.Any, **class_kwargs: t.Any + ) -> ft.RouteCallable: + """Convert the class into a view function that can be registered + for a route. + + By default, the generated view will create a new instance of the + view class for every request and call its + :meth:`dispatch_request` method. If the view class sets + :attr:`init_every_request` to ``False``, the same instance will + be used for every request. + + Except for ``name``, all other arguments passed to this method + are forwarded to the view class ``__init__`` method. + + .. versionchanged:: 2.2 + Added the ``init_every_request`` class attribute. + """ + if cls.init_every_request: + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + self = view.view_class( # type: ignore[attr-defined] + *class_args, **class_kwargs + ) + return current_app.ensure_sync(self.dispatch_request)(**kwargs) + + else: + self = cls(*class_args, **class_kwargs) + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + return current_app.ensure_sync(self.dispatch_request)(**kwargs) + + if cls.decorators: + view.__name__ = name + view.__module__ = cls.__module__ + for decorator in cls.decorators: + view = decorator(view) + + # We attach the view class to the view function for two reasons: + # first of all it allows us to easily figure out what class-based + # view this thing came from, secondly it's also used for instantiating + # the view class so you can actually replace it with something else + # for testing purposes and debugging. + view.view_class = cls # type: ignore + view.__name__ = name + view.__doc__ = cls.__doc__ + view.__module__ = cls.__module__ + view.methods = cls.methods # type: ignore + view.provide_automatic_options = cls.provide_automatic_options # type: ignore + return view + + +class MethodView(View): + """Dispatches request methods to the corresponding instance methods. + For example, if you implement a ``get`` method, it will be used to + handle ``GET`` requests. + + This can be useful for defining a REST API. + + :attr:`methods` is automatically set based on the methods defined on + the class. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class CounterAPI(MethodView): + def get(self): + return str(session.get("counter", 0)) + + def post(self): + session["counter"] = session.get("counter", 0) + 1 + return redirect(url_for("counter")) + + app.add_url_rule( + "/counter", view_func=CounterAPI.as_view("counter") + ) + """ + + def __init_subclass__(cls, **kwargs: t.Any) -> None: + super().__init_subclass__(**kwargs) + + if "methods" not in cls.__dict__: + methods = set() + + for base in cls.__bases__: + if getattr(base, "methods", None): + methods.update(base.methods) # type: ignore[attr-defined] + + for key in http_method_funcs: + if hasattr(cls, key): + methods.add(key.upper()) + + if methods: + cls.methods = methods + + def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue: + meth = getattr(self, request.method.lower(), None) + + # If the request method is HEAD and we don't have a handler for it + # retry with GET. + if meth is None and request.method == "HEAD": + meth = getattr(self, "get", None) + + assert meth is not None, f"Unimplemented method {request.method!r}" + return current_app.ensure_sync(meth)(**kwargs) diff --git a/Meliora/gmapenv/Lib/site-packages/flask/wrappers.py b/Meliora/gmapenv/Lib/site-packages/flask/wrappers.py new file mode 100644 index 00000000..ef7aa38c --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask/wrappers.py @@ -0,0 +1,173 @@ +from __future__ import annotations + +import typing as t + +from werkzeug.exceptions import BadRequest +from werkzeug.wrappers import Request as RequestBase +from werkzeug.wrappers import Response as ResponseBase + +from . import json +from .globals import current_app +from .helpers import _split_blueprint_path + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.routing import Rule + + +class Request(RequestBase): + """The request object used by default in Flask. Remembers the + matched endpoint and view arguments. + + It is what ends up as :class:`~flask.request`. If you want to replace + the request object used you can subclass this and set + :attr:`~flask.Flask.request_class` to your subclass. + + The request object is a :class:`~werkzeug.wrappers.Request` subclass and + provides all of the attributes Werkzeug defines plus a few Flask + specific ones. + """ + + json_module: t.Any = json + + #: The internal URL rule that matched the request. This can be + #: useful to inspect which methods are allowed for the URL from + #: a before/after handler (``request.url_rule.methods``) etc. + #: Though if the request's method was invalid for the URL rule, + #: the valid list is available in ``routing_exception.valid_methods`` + #: instead (an attribute of the Werkzeug exception + #: :exc:`~werkzeug.exceptions.MethodNotAllowed`) + #: because the request was never internally bound. + #: + #: .. versionadded:: 0.6 + url_rule: Rule | None = None + + #: A dict of view arguments that matched the request. If an exception + #: happened when matching, this will be ``None``. + view_args: dict[str, t.Any] | None = None + + #: If matching the URL failed, this is the exception that will be + #: raised / was raised as part of the request handling. This is + #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or + #: something similar. + routing_exception: Exception | None = None + + @property + def max_content_length(self) -> int | None: # type: ignore + """Read-only view of the ``MAX_CONTENT_LENGTH`` config key.""" + if current_app: + return current_app.config["MAX_CONTENT_LENGTH"] + else: + return None + + @property + def endpoint(self) -> str | None: + """The endpoint that matched the request URL. + + This will be ``None`` if matching failed or has not been + performed yet. + + This in combination with :attr:`view_args` can be used to + reconstruct the same URL or a modified URL. + """ + if self.url_rule is not None: + return self.url_rule.endpoint + + return None + + @property + def blueprint(self) -> str | None: + """The registered name of the current blueprint. + + This will be ``None`` if the endpoint is not part of a + blueprint, or if URL matching failed or has not been performed + yet. + + This does not necessarily match the name the blueprint was + created with. It may have been nested, or registered with a + different name. + """ + endpoint = self.endpoint + + if endpoint is not None and "." in endpoint: + return endpoint.rpartition(".")[0] + + return None + + @property + def blueprints(self) -> list[str]: + """The registered names of the current blueprint upwards through + parent blueprints. + + This will be an empty list if there is no current blueprint, or + if URL matching failed. + + .. versionadded:: 2.0.1 + """ + name = self.blueprint + + if name is None: + return [] + + return _split_blueprint_path(name) + + def _load_form_data(self) -> None: + super()._load_form_data() + + # In debug mode we're replacing the files multidict with an ad-hoc + # subclass that raises a different error for key errors. + if ( + current_app + and current_app.debug + and self.mimetype != "multipart/form-data" + and not self.files + ): + from .debughelpers import attach_enctype_error_multidict + + attach_enctype_error_multidict(self) + + def on_json_loading_failed(self, e: ValueError | None) -> t.Any: + try: + return super().on_json_loading_failed(e) + except BadRequest as e: + if current_app and current_app.debug: + raise + + raise BadRequest() from e + + +class Response(ResponseBase): + """The response object that is used by default in Flask. Works like the + response object from Werkzeug but is set to have an HTML mimetype by + default. Quite often you don't have to create this object yourself because + :meth:`~flask.Flask.make_response` will take care of that for you. + + If you want to replace the response object used you can subclass this and + set :attr:`~flask.Flask.response_class` to your subclass. + + .. versionchanged:: 1.0 + JSON support is added to the response, like the request. This is useful + when testing to get the test client response data as JSON. + + .. versionchanged:: 1.0 + + Added :attr:`max_cookie_size`. + """ + + default_mimetype: str | None = "text/html" + + json_module = json + + autocorrect_location_header = False + + @property + def max_cookie_size(self) -> int: # type: ignore + """Read-only view of the :data:`MAX_COOKIE_SIZE` config key. + + See :attr:`~werkzeug.wrappers.Response.max_cookie_size` in + Werkzeug's docs. + """ + if current_app: + return current_app.config["MAX_COOKIE_SIZE"] + + # return Werkzeug's default when not in an app context + return super().max_cookie_size diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA new file mode 100644 index 00000000..92f239cd --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA @@ -0,0 +1,109 @@ +Metadata-Version: 2.1 +Name: Flask-SQLAlchemy +Version: 3.1.1 +Summary: Add SQLAlchemy support to your Flask application. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Requires-Dist: flask>=2.2.5 +Requires-Dist: sqlalchemy>=2.0.16 +Project-URL: Changes, https://flask-sqlalchemy.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://flask-sqlalchemy.palletsprojects.com +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Issue Tracker, https://github.com/pallets-eco/flask-sqlalchemy/issues/ +Project-URL: Source Code, https://github.com/pallets-eco/flask-sqlalchemy/ + +Flask-SQLAlchemy +================ + +Flask-SQLAlchemy is an extension for `Flask`_ that adds support for +`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy +with Flask by providing useful defaults and extra helpers that make it +easier to accomplish common tasks. + +.. _Flask: https://palletsprojects.com/p/flask/ +.. _SQLAlchemy: https://www.sqlalchemy.org + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask-SQLAlchemy + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + from flask import Flask + from flask_sqlalchemy import SQLAlchemy + from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column + + app = Flask(__name__) + app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite" + + class Base(DeclarativeBase): + pass + + db = SQLAlchemy(app, model_class=Base) + + class User(db.Model): + id: Mapped[int] = mapped_column(db.Integer, primary_key=True) + username: Mapped[str] = mapped_column(db.String, unique=True, nullable=False) + + with app.app_context(): + db.create_all() + + db.session.add(User(username="example")) + db.session.commit() + + users = db.session.execute(db.select(User)).scalars() + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask-SQLAlchemy, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets-eco/flask-sqlalchemy/blob/main/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask-SQLAlchemy and +other popular packages. In order to grow the community of contributors +and users, and allow the maintainers to devote more time to the +projects, `please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask-sqlalchemy.palletsprojects.com/ +- Changes: https://flask-sqlalchemy.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask-SQLAlchemy/ +- Source Code: https://github.com/pallets-eco/flask-sqlalchemy/ +- Issue Tracker: https://github.com/pallets-eco/flask-sqlalchemy/issues/ +- Website: https://palletsprojects.com/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD new file mode 100644 index 00000000..32c47ebc --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD @@ -0,0 +1,27 @@ +flask_sqlalchemy-3.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +flask_sqlalchemy-3.1.1.dist-info/METADATA,sha256=lBxR1akBt7n9XBjIVTL2OV52OhCfFrb-Mqtoe0DCbR8,3432 +flask_sqlalchemy-3.1.1.dist-info/RECORD,, +flask_sqlalchemy-3.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask_sqlalchemy-3.1.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +flask_sqlalchemy/__init__.py,sha256=he_w4qQQVS2Z1ms5GCTptDTXNOXBXw0n8zSuWCp8n6Y,653 +flask_sqlalchemy/__pycache__/__init__.cpython-39.pyc,, +flask_sqlalchemy/__pycache__/cli.cpython-39.pyc,, +flask_sqlalchemy/__pycache__/extension.cpython-39.pyc,, +flask_sqlalchemy/__pycache__/model.cpython-39.pyc,, +flask_sqlalchemy/__pycache__/pagination.cpython-39.pyc,, +flask_sqlalchemy/__pycache__/query.cpython-39.pyc,, +flask_sqlalchemy/__pycache__/record_queries.cpython-39.pyc,, +flask_sqlalchemy/__pycache__/session.cpython-39.pyc,, +flask_sqlalchemy/__pycache__/table.cpython-39.pyc,, +flask_sqlalchemy/__pycache__/track_modifications.cpython-39.pyc,, +flask_sqlalchemy/cli.py,sha256=pg3QDxP36GW2qnwe_CpPtkRhPchyVSGM6zlBNWuNCFE,484 +flask_sqlalchemy/extension.py,sha256=71tP_kNtb5VgZdafy_OH1sWdZOA6PaT7cJqX7tKgZ-k,38261 +flask_sqlalchemy/model.py,sha256=_mSisC2Eni0TgTyFWeN_O4LIexTeP_sVTdxh03yMK50,11461 +flask_sqlalchemy/pagination.py,sha256=JFpllrqkRkwacb8DAmQWaz9wsvQa0dypfSkhUDSC2ws,11119 +flask_sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask_sqlalchemy/query.py,sha256=Uls9qbmnpb9Vba43EDfsRP17eHJ0X4VG7SE22tH5R3g,3748 +flask_sqlalchemy/record_queries.py,sha256=ouS1ayj16h76LJprx13iYdoFZbm6m8OncrOgAVbG1Sk,3520 +flask_sqlalchemy/session.py,sha256=pBbtN8iDc8yuGVt0k18BvZHh2uEI7QPzZXO7eXrRi1g,3426 +flask_sqlalchemy/table.py,sha256=wAPOy8qwyAxpMwOIUJY4iMOultzz2W0D6xvBkQ7U2CE,859 +flask_sqlalchemy/track_modifications.py,sha256=yieyozj7IiVzwnAGZ-ZrgqrzjrUfG0kPrXBfW_hStSU,2755 diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL new file mode 100644 index 00000000..3b5e64b5 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__init__.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__init__.py new file mode 100644 index 00000000..c2fa0591 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__init__.py @@ -0,0 +1,26 @@ +from __future__ import annotations + +import typing as t + +from .extension import SQLAlchemy + +__all__ = [ + "SQLAlchemy", +] + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Flask-SQLAlchemy 3.2. Use feature detection or" + " 'importlib.metadata.version(\"flask-sqlalchemy\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("flask-sqlalchemy") + + raise AttributeError(name) diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff6c084be18abd89711d7df1aa9550ef8d5901ef GIT binary patch literal 880 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 WpA{b*hw~TK9qYZ~*kpck4 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/pagination.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/pagination.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..123b014b0100e3399ce5ca076c95c9987f5c70c7 GIT binary patch literal 10443 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 Z8ON1$ZO4x~ug(`1f290Kd3)*1e*uLDY{UQn literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/query.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/query.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..caa4c947a7ecc1e904f2408423f51e405313dbdd GIT binary patch literal 4051 zcmcgv%WoUU8Q%vRr9zF#(DAv05M z38^C$PYDENOG#6xEb>t7jEIGUmI6=b5HnRdag6~ zfw0Eq*SF&bk_}0P*VS*?8=OiLvTPnFzy$)KV#^EzY!& zT(Eq?DsIUXVMtPiSNbCz4X0f3lvyc<>>dm;RdLGIj6IMu(wwzprJ@!36?F{R5sM0K zpw?7s%}*t5(`Wew%QI`*ilZr3mggKl`zJv7)K%p8eXsN(ry_;+8)ZYwWTG}Pu&bq~ z&YwE!6^y_6+pXcrUo?z)~!+_B6mGcGJpRn+z#e!R7fuc?0@;~2=g-NXRPl1LXZe7)d(5i<9 zwryIzE9?4dhgQhyYL^-^Yt`(bS9UFJt>52brZPdRU7297GQld*n&Qa_1RU#z@1b+q zsZ{^Da~Bpd?tKqGf8xy!U57rVA>26}lbrIePUamt!n!8k0zALlBIHg#&^vjouYB_} zsSyHehi35NF#H4)@idXulCIb40Qh4#B=^8Wg91v~o=O$iUN_~Bg2ial z2Av=;OxcVOAj*6V=2;{g(PU{?sq1`6V@PQu8ZntXor>r-z7J_)$c# z=-Nlez_I7<+?)IJ#=I%qFI#YBkADE-BV@Z7;~66GL`#J4Ot2(QV?)uA5}u7YY>YgF zC|w20s89;ohLJpWLsq0?sTL+eFh?9qHG`Oz=wKzd^FA zAFJ5ghu`*wfo7U>_ zWVv7?+ltOXn4ok3(%>&wcWCEs|#7Xf9+Q5q61V|iVDq{Eh`fF$O1f;#4k8c`HYPvSmF^pi5v#x8YVtKl?;8c z2ttkJ+QA~$e4N0Hq%VpNDbEVv0$f4MGNL*PrFT^&lW#49^NUMeqB%+uI0dRXX;2_p zU7?1%$d$N}XUX?H?H;^746RNUUP034FoB#*;wVO>`kowy;i^~Q*t+Pq;baY?{Z`qu z+JAX;reKWdZOe(5hVbXIOdAo3Ue@Fvuvt_6;k@O!E1z#Jx9`}uo-4w>i&sATZI|sJ zpcjfDC_6!r=AuZb-wlF?uwA{f5dce;^J z4P|cnZ`wlG=H^kSmKZNMHZiIVY`1s6i0!id`$_>HP=3^SXLq_@+v~dcQ0xC6wApO+ literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34f70394daba7694f5abd1a84e7c5a5cfc03b62a GIT binary patch literal 3830 zcmb_fOK%&=5uP3npQ0pMl4W}lB%LghEQ5r*!5$J2#$pXw@NVL0VaW~xu``0ZGP`R z8%s6$Jnklcc+1j)l4h*pkj`0sNRxY{$tniMxnhF#oNJQF4gQS9C(>}!mz-Ggq|22I z6D6eJFNr%JfV~=8c{xV*)0v1|ORaH_1}8xVQu9E`3dghHG3aI+lDIqQ@umn&&}=u3 zo;`i^bnmnM-~7%$+~51+@Uj2w#s1;v`$ug)&|JnrCz7I3v8?uku)iV-PdXu{&ISZ! zd@~rzcAJ05+ie+(*>oxQU`R5PIe5@X#^BkPvDHClD9Z$wkYCDhOz`4CES4WBsmGDg zM3@;VGZbM4%I1$kSTzVIcGp=DjU^Xy1VJwUaEEA+?d4%2R*yOdHZm;` zis+j3JnsWr!(hVUe!L_3C;@l@G;R_e22nVUfPtUd>(gyB)Ds@*dngy5&LG)n@H2n_ zR}T9@+>@f&Q90%NtN4FO6Cf|kYK-yV|0T6K-0+GE5RMc)SO?6B051_c2GxK0<5{e?w zbVNY~;DSat1r(_*sD?0NX03GF*DoWOgxqkhw7RSE2w-Ur>U`^{HH>ZZuD91bexYHH zNxCf$)&yJrCI>&loVJK99bDzBubk=*yT_9y&5F3Ste3sVdfAdq_hCv4QZtnO2q=AowM797+ZASe?a) zAYOPv7DOBT(58tj+BLi5IBZ&k-n`gtF?s{+{$sK$<%7v{LgcNnzL&WYdE@^DgzVg_d;u&~RMiJ0qJ%7-;+mY}B=_8%#MESEs@ErQg+hEq(3A)JVH`eQ3 zTGD|p&ycOt0@Xq?PSmXg3u z?2M`VJ;>y{CU@dp<%N6AMDBre=}z6hpoIV0z08@yRq@)n^roKrmW6cYffAEggFUk+c z@o9{#@<~0fDA=nz)R2c}zDh=@?`E2&1ZBA?GJU!>7>*JYb_Bb$j38nLRLi7AB<>N4 z*t9w;q`OpOrsb~Ri;_+dX+{5yW-&%n8JZU8FM^QxcaZqqL1fc%TIvFAv5XS}PId~u z>ma421(ZiXsrA4Wv427W5+3TMrTJTxnVcpWEyf}-h;>#j&&u!7`HF6P6D~gj?YDUK zM`$v*lvu&7u?j1>9;>>$fY5iC>tf~>n9ID`&;7UeA4R+C_b5Jf$EZaSpA-Q+U0c*S zQY+$|7R+RX>N8~~^{BYC7im?Nr9$fJpjBJW8<{ufZKvJ`j~2o=^1L;VEhjR&QQ}U^ yivu&Qk<(h(TM<_-ZM`Ln#SgQX`UxRNe-};F&B7n`)$Ets_<_f2_iOpB;(q~45h(Kj literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/session.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/session.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ebc1fadd5494f642571f63cc53832aa98c73288 GIT binary patch literal 3398 zcmai1-EJGl6`t8$E-C)$$97T&X*%ddR07V{tuG1)g%Mkk9k&kAL^1+zRVe zEmVoxEeSoTf9rPx*eU3iCUi2nFfxJRdpgm`n5~;#XR^aT+oY^`5-#H3f ztvZ3{&Od)4`Yl4f!Nv09z~VzfsQLp;IN>xQW9n0ib1SiY+q@mWV&3k!>euG9m2ur~ zn7N%a$1T4_iLgg)`5AY3C0QM>`D>IsB;4iIGs3H)FXwi$<8HnGSWFrK$_-YB-q$kv{sCmh}4Wr;qO?(SaBr zNBGI|Q!N)%J%EWIKIO!>I0cm~ZljRr_V3An8UdTW!&gBt6wT%h-aM}uT8p>OT0YDj z;=3T&T2b8D1I)i7b1nY-NaF(TT7#4BL*)ws>;PxzvLk*-Cu|6=wvCtt8b@)c2K8Vwy zxwJ1}#-2}wj0N}VW^XTJ(NyVd9M1&n^?2U{iBPp(?-ok=5MW>&@>8vWamV9MRdOdAxnEZ#5NXD>oIRD~;r zp2{?`mg2;QIc7lvv*5=t(d3kj=zzo|xBg21NGZu_P67+oB!GN?FreLzQ&iM+B4kku zf;f$J5EOR6`+hqZXIvyfsfhvs93_&0tijE41%|I_u@VHO@q(|(zk1tS`%e_8zke{< z|0sKrCRxbU{=;!NQS9R|dKT&fh=eE`PxgnfDbmCJ$8mpO#aetYLHbar{Q<<@vtSW< zKb`x)n;gp~aD4}U%7uZ@4eHX_+T3*Bh4kH7)7XvW3=KE)ROpp~>Ft#9nX|>#c9y0h zLhoLj-&_#C^L(dLxS$1E&IKbtv={bRlG*#(&8e=QT5?aW>uL56y5s=|4pj%g{Um=y#ymCn7 z-|`BlHz8Vd3*xCgz$mgndh6WI9gHi8BRl*DpvbOBz?P6?7f5g={d+w$PXGV_d6W&l zGwUxi264m0AQBpgEU;`s#Pz!}#ak&#o}uolYj1)J6|f550Dzg#<)mT860#O7!!KkS2+53BFqO+X9^p?+IW(h?Bd&4jCQ2VWU-ED1C9-J7L+XgMv_Hg5}3%4 zkXxjv4TTOc(mFNSMoF*AT&Cw+c#;a=Ew7QQcyJwu4IF+11OC)cU?A6O)Uj$-jasx# z*Jz!#tshuTSi>%@&)+p`0Y#S**xhcoQ$=J&+y`W>2Z*ZE1n12lcs>o2Ii(r|Jd1+B zfSeJaXwA_z5=jCCBc2(Iv_?<_LR3;AG=e~lx2lA~-@heNW^V(Qf&IW_J7s`ff}Hj~ z0qg?5|5j-^--TlNKT!EQb3FTQ*ht;16cm86(rY|W#m5tEF5u_?J0bqe?T!s_zQ@f8oR_K+;V(?%#Nl_OofqcaB6f z#j0i!r{gR+YZI@v0fm4X>RlK}6@$A874{wKTGy!wcUu3C;cw(2636hk!h9D zBpOhOA>^Xt=FI?8Q8p1CHbpU)$j!eNVAe(DO+nTl0R$~+c$wQpBbc||LCnYSr80qQ z$q!)OxsDk+m_ly_87h%dxPVQNCk54hebJT}@A&P-h6kV}e+VCxj##DurujAu5)JFO zOo!tQldK;m$_QVy_MZM`CxBqs{`I5o!(s)2IK?*7G=e6VjnR#eZ`7*x%Mw@a;{Ov0 U5gI&ZJlF)^xwL6-Y;U~#U*OrKr2qf` literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/table.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/table.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93357219cca5c76331e48fd47ed421285a9793c1 GIT binary patch literal 1293 zcmZuwOKTKC5bmDonasXS;)@(aa`3VT*MkQ^L=*#2&=p+0jEhZYyR+G39-HpjgkAO^ zB#@iGASdy%f2ps6;9n3AR`p~bLK=Fys=uE4>M0tHDuMO**Aw;GC*&t8tBZm1f)HwU zK#)Yzgrqd46lE{*V&9!C4%`{0YaXE_jp7O=yF~huofFAaa9BO_0y=g=KQS2qE4UR{9gG}-x zHMYJf^kmBjZjKXfdIu^Mt&Th16e^um0p6Z&xARO*f}-^@8(W4-Gq5ZZsj^JyzR{Rt z8y=maVneNpkbOk^4`RC7< zS5Ld2jMAoiFzoK+r&*EUgFM^r<>|27hf9^6bl(p4x@J(QheO2s z%5?V=VU93VkzkDDM+Ii2H5}WB^FcN!ILBr(&h==rUS_N{$0ju+TJKaLc0?hXfpghL zDO^anSn(T;^q?6R>)QBr4R9AD*lM8ca1YDyA9~I<`9MUQ6)2a8Jejo!f^?%TBZst0~ zQ8zssn9)#a7m(hBzh=}{IPXD;4CiI(7ZE=Iyo}gyu3@pT`8c;#&eL3u5|rzlACE+G zh0wxA`H9llCyv85u8j9olFSKQl()cm86}ns8_!@3BFX~q@4X76Td?m28qsDQIrm4< z;lQae&o(T^!$H>9TcE_%Wp`Q6i1^M@Z-LkCtnNi#L~r{40LJ_lI{*Lx literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42688603a593ea86985c51922a9dcdfcc679c293 GIT binary patch literal 2232 zcma)7TW=Fb6yBM=+OZvz1QMX2s8TO(o3v6ZRYC}nCO{&Bp(Its)M&NY87J%P#mtO> zAm=H4tz~smH@pLUgES29 zrqfxIG?B&Z-X-3n9`)0iY?jP|rg>zMIW~8EnFc3_Trpe)xOrNoQ?&LD(>iVZ>W~FG zO`D*(^vy1Evt3yy^gwt)Krw`g^XlU zhlR#29TrMSql zL`p{A%MxLH4r(NW%g_S?DD33Ea;CZaSIes+n z!CKWBdkT!SdT0n)lbB*^zje@9<4kIf^%+OnC$_d5$(7E8dZHmQ|Cgxz!? z_O<~6HwOqPsgLw!xTF?!CF6jU4xThhi5F?Q6UF;2PX!P%dkNSoFHMAGxta<&iwjP} zqAyeh)*p(3)`RR>aEUCf^pH=>vz_QS9w}QRCFF>QC}>s z!v!L_SLBOuxqfFClq`SQ*-UmiB9UwflDQx4GSTU#k=PH#i!@5(J(eAOEjgG%$X?P- z;<8GX`v=Mo%Lo?X)53HVnt`_gFTV^r?gM$_%H@^(pkEf=vW<9^t!H4+J9%A6XIdr6V z><^t2bm$J^O76+(&^bbf-q0DAzn>ay zKV4aU7(RNuwsC)Bb!B_waeGU7Ne(DO3I}}}Nv1p~cqUn^#`WmnHW1}OvviYPW#{Y_ zOp1id1LBwGsKO#rJ~-*KSdyA_nl5}7?LepyZftgIwF+Q;l(GWp;bg~vl$#VD)($&d2_D(E-9ZSC#4ABsp^DQph z>(p-ZdGH2J<&T4`Oh7psLWtpbCKWq9K#gCAAMiyW%F$)0yq8frU_y~Jm+0Md{ zYYSBIK|jfN6_TWSHjDTTu#x7OV!0fquGx4^TN@Kr_;(?;CSLhhLtHc6Op6*!N!=)x zMY5Ymso;7BsrvS_C-*|=|J8>Z?FVJM=>bK8aCA<2CBv6M&A-sZj698rsS<;o32p)a s1HW!S72JlN9;ED!MpS$Zq=o|=pxXF_daGd%S1VPo8O+Qy8_nsz0Vw?=SpWb4 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/cli.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/cli.py new file mode 100644 index 00000000..d7d7e4be --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/cli.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +import typing as t + +from flask import current_app + + +def add_models_to_shell() -> dict[str, t.Any]: + """Registered with :meth:`~flask.Flask.shell_context_processor` if + ``add_models_to_shell`` is enabled. Adds the ``db`` instance and all model classes + to ``flask shell``. + """ + db = current_app.extensions["sqlalchemy"] + out = {m.class_.__name__: m.class_ for m in db.Model._sa_registry.mappers} + out["db"] = db + return out diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/extension.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/extension.py new file mode 100644 index 00000000..43e1b9a4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/extension.py @@ -0,0 +1,1008 @@ +from __future__ import annotations + +import os +import types +import typing as t +import warnings +from weakref import WeakKeyDictionary + +import sqlalchemy as sa +import sqlalchemy.event as sa_event +import sqlalchemy.exc as sa_exc +import sqlalchemy.orm as sa_orm +from flask import abort +from flask import current_app +from flask import Flask +from flask import has_app_context + +from .model import _QueryProperty +from .model import BindMixin +from .model import DefaultMeta +from .model import DefaultMetaNoName +from .model import Model +from .model import NameMixin +from .pagination import Pagination +from .pagination import SelectPagination +from .query import Query +from .session import _app_ctx_id +from .session import Session +from .table import _Table + +_O = t.TypeVar("_O", bound=object) # Based on sqlalchemy.orm._typing.py + + +# Type accepted for model_class argument +_FSA_MCT = t.TypeVar( + "_FSA_MCT", + bound=t.Union[ + t.Type[Model], + sa_orm.DeclarativeMeta, + t.Type[sa_orm.DeclarativeBase], + t.Type[sa_orm.DeclarativeBaseNoMeta], + ], +) + + +# Type returned by make_declarative_base +class _FSAModel(Model): + metadata: sa.MetaData + + +def _get_2x_declarative_bases( + model_class: _FSA_MCT, +) -> list[t.Type[t.Union[sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta]]]: + return [ + b + for b in model_class.__bases__ + if issubclass(b, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) + ] + + +class SQLAlchemy: + """Integrates SQLAlchemy with Flask. This handles setting up one or more engines, + associating tables and models with specific engines, and cleaning up connections and + sessions after each request. + + Only the engine configuration is specific to each application, other things like + the model, table, metadata, and session are shared for all applications using that + extension instance. Call :meth:`init_app` to configure the extension on an + application. + + After creating the extension, create model classes by subclassing :attr:`Model`, and + table classes with :attr:`Table`. These can be accessed before :meth:`init_app` is + called, making it possible to define the models separately from the application. + + Accessing :attr:`session` and :attr:`engine` requires an active Flask application + context. This includes methods like :meth:`create_all` which use the engine. + + This class also provides access to names in SQLAlchemy's ``sqlalchemy`` and + ``sqlalchemy.orm`` modules. For example, you can use ``db.Column`` and + ``db.relationship`` instead of importing ``sqlalchemy.Column`` and + ``sqlalchemy.orm.relationship``. This can be convenient when defining models. + + :param app: Call :meth:`init_app` on this Flask application now. + :param metadata: Use this as the default :class:`sqlalchemy.schema.MetaData`. Useful + for setting a naming convention. + :param session_options: Arguments used by :attr:`session` to create each session + instance. A ``scopefunc`` key will be passed to the scoped session, not the + session instance. See :class:`sqlalchemy.orm.sessionmaker` for a list of + arguments. + :param query_class: Use this as the default query class for models and dynamic + relationships. The query interface is considered legacy in SQLAlchemy. + :param model_class: Use this as the model base class when creating the declarative + model class :attr:`Model`. Can also be a fully created declarative model class + for further customization. + :param engine_options: Default arguments used when creating every engine. These are + lower precedence than application config. See :func:`sqlalchemy.create_engine` + for a list of arguments. + :param add_models_to_shell: Add the ``db`` instance and all model classes to + ``flask shell``. + + .. versionchanged:: 3.1.0 + The ``metadata`` parameter can still be used with SQLAlchemy 1.x classes, + but is ignored when using SQLAlchemy 2.x style of declarative classes. + Instead, specify metadata on your Base class. + + .. versionchanged:: 3.1.0 + Added the ``disable_autonaming`` parameter. + + .. versionchanged:: 3.1.0 + Changed ``model_class`` parameter to accepta SQLAlchemy 2.x + declarative base subclass. + + .. versionchanged:: 3.0 + An active Flask application context is always required to access ``session`` and + ``engine``. + + .. versionchanged:: 3.0 + Separate ``metadata`` are used for each bind key. + + .. versionchanged:: 3.0 + The ``engine_options`` parameter is applied as defaults before per-engine + configuration. + + .. versionchanged:: 3.0 + The session class can be customized in ``session_options``. + + .. versionchanged:: 3.0 + Added the ``add_models_to_shell`` parameter. + + .. versionchanged:: 3.0 + Engines are created when calling ``init_app`` rather than the first time they + are accessed. + + .. versionchanged:: 3.0 + All parameters except ``app`` are keyword-only. + + .. versionchanged:: 3.0 + The extension instance is stored directly as ``app.extensions["sqlalchemy"]``. + + .. versionchanged:: 3.0 + Setup methods are renamed with a leading underscore. They are considered + internal interfaces which may change at any time. + + .. versionchanged:: 3.0 + Removed the ``use_native_unicode`` parameter and config. + + .. versionchanged:: 2.4 + Added the ``engine_options`` parameter. + + .. versionchanged:: 2.1 + Added the ``metadata``, ``query_class``, and ``model_class`` parameters. + + .. versionchanged:: 2.1 + Use the same query class across ``session``, ``Model.query`` and + ``Query``. + + .. versionchanged:: 0.16 + ``scopefunc`` is accepted in ``session_options``. + + .. versionchanged:: 0.10 + Added the ``session_options`` parameter. + """ + + def __init__( + self, + app: Flask | None = None, + *, + metadata: sa.MetaData | None = None, + session_options: dict[str, t.Any] | None = None, + query_class: type[Query] = Query, + model_class: _FSA_MCT = Model, # type: ignore[assignment] + engine_options: dict[str, t.Any] | None = None, + add_models_to_shell: bool = True, + disable_autonaming: bool = False, + ): + if session_options is None: + session_options = {} + + self.Query = query_class + """The default query class used by ``Model.query`` and ``lazy="dynamic"`` + relationships. + + .. warning:: + The query interface is considered legacy in SQLAlchemy. + + Customize this by passing the ``query_class`` parameter to the extension. + """ + + self.session = self._make_scoped_session(session_options) + """A :class:`sqlalchemy.orm.scoping.scoped_session` that creates instances of + :class:`.Session` scoped to the current Flask application context. The session + will be removed, returning the engine connection to the pool, when the + application context exits. + + Customize this by passing ``session_options`` to the extension. + + This requires that a Flask application context is active. + + .. versionchanged:: 3.0 + The session is scoped to the current app context. + """ + + self.metadatas: dict[str | None, sa.MetaData] = {} + """Map of bind keys to :class:`sqlalchemy.schema.MetaData` instances. The + ``None`` key refers to the default metadata, and is available as + :attr:`metadata`. + + Customize the default metadata by passing the ``metadata`` parameter to the + extension. This can be used to set a naming convention. When metadata for + another bind key is created, it copies the default's naming convention. + + .. versionadded:: 3.0 + """ + + if metadata is not None: + if len(_get_2x_declarative_bases(model_class)) > 0: + warnings.warn( + "When using SQLAlchemy 2.x style of declarative classes," + " the `metadata` should be an attribute of the base class." + "The metadata passed into SQLAlchemy() is ignored.", + DeprecationWarning, + stacklevel=2, + ) + else: + metadata.info["bind_key"] = None + self.metadatas[None] = metadata + + self.Table = self._make_table_class() + """A :class:`sqlalchemy.schema.Table` class that chooses a metadata + automatically. + + Unlike the base ``Table``, the ``metadata`` argument is not required. If it is + not given, it is selected based on the ``bind_key`` argument. + + :param bind_key: Used to select a different metadata. + :param args: Arguments passed to the base class. These are typically the table's + name, columns, and constraints. + :param kwargs: Arguments passed to the base class. + + .. versionchanged:: 3.0 + This is a subclass of SQLAlchemy's ``Table`` rather than a function. + """ + + self.Model = self._make_declarative_base( + model_class, disable_autonaming=disable_autonaming + ) + """A SQLAlchemy declarative model class. Subclass this to define database + models. + + If a model does not set ``__tablename__``, it will be generated by converting + the class name from ``CamelCase`` to ``snake_case``. It will not be generated + if the model looks like it uses single-table inheritance. + + If a model or parent class sets ``__bind_key__``, it will use that metadata and + database engine. Otherwise, it will use the default :attr:`metadata` and + :attr:`engine`. This is ignored if the model sets ``metadata`` or ``__table__``. + + For code using the SQLAlchemy 1.x API, customize this model by subclassing + :class:`.Model` and passing the ``model_class`` parameter to the extension. + A fully created declarative model class can be + passed as well, to use a custom metaclass. + + For code using the SQLAlchemy 2.x API, customize this model by subclassing + :class:`sqlalchemy.orm.DeclarativeBase` or + :class:`sqlalchemy.orm.DeclarativeBaseNoMeta` + and passing the ``model_class`` parameter to the extension. + """ + + if engine_options is None: + engine_options = {} + + self._engine_options = engine_options + self._app_engines: WeakKeyDictionary[Flask, dict[str | None, sa.engine.Engine]] + self._app_engines = WeakKeyDictionary() + self._add_models_to_shell = add_models_to_shell + + if app is not None: + self.init_app(app) + + def __repr__(self) -> str: + if not has_app_context(): + return f"<{type(self).__name__}>" + + message = f"{type(self).__name__} {self.engine.url}" + + if len(self.engines) > 1: + message = f"{message} +{len(self.engines) - 1}" + + return f"<{message}>" + + def init_app(self, app: Flask) -> None: + """Initialize a Flask application for use with this extension instance. This + must be called before accessing the database engine or session with the app. + + This sets default configuration values, then configures the extension on the + application and creates the engines for each bind key. Therefore, this must be + called after the application has been configured. Changes to application config + after this call will not be reflected. + + The following keys from ``app.config`` are used: + + - :data:`.SQLALCHEMY_DATABASE_URI` + - :data:`.SQLALCHEMY_ENGINE_OPTIONS` + - :data:`.SQLALCHEMY_ECHO` + - :data:`.SQLALCHEMY_BINDS` + - :data:`.SQLALCHEMY_RECORD_QUERIES` + - :data:`.SQLALCHEMY_TRACK_MODIFICATIONS` + + :param app: The Flask application to initialize. + """ + if "sqlalchemy" in app.extensions: + raise RuntimeError( + "A 'SQLAlchemy' instance has already been registered on this Flask app." + " Import and use that instance instead." + ) + + app.extensions["sqlalchemy"] = self + app.teardown_appcontext(self._teardown_session) + + if self._add_models_to_shell: + from .cli import add_models_to_shell + + app.shell_context_processor(add_models_to_shell) + + basic_uri: str | sa.engine.URL | None = app.config.setdefault( + "SQLALCHEMY_DATABASE_URI", None + ) + basic_engine_options = self._engine_options.copy() + basic_engine_options.update( + app.config.setdefault("SQLALCHEMY_ENGINE_OPTIONS", {}) + ) + echo: bool = app.config.setdefault("SQLALCHEMY_ECHO", False) + config_binds: dict[ + str | None, str | sa.engine.URL | dict[str, t.Any] + ] = app.config.setdefault("SQLALCHEMY_BINDS", {}) + engine_options: dict[str | None, dict[str, t.Any]] = {} + + # Build the engine config for each bind key. + for key, value in config_binds.items(): + engine_options[key] = self._engine_options.copy() + + if isinstance(value, (str, sa.engine.URL)): + engine_options[key]["url"] = value + else: + engine_options[key].update(value) + + # Build the engine config for the default bind key. + if basic_uri is not None: + basic_engine_options["url"] = basic_uri + + if "url" in basic_engine_options: + engine_options.setdefault(None, {}).update(basic_engine_options) + + if not engine_options: + raise RuntimeError( + "Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set." + ) + + engines = self._app_engines.setdefault(app, {}) + + # Dispose existing engines in case init_app is called again. + if engines: + for engine in engines.values(): + engine.dispose() + + engines.clear() + + # Create the metadata and engine for each bind key. + for key, options in engine_options.items(): + self._make_metadata(key) + options.setdefault("echo", echo) + options.setdefault("echo_pool", echo) + self._apply_driver_defaults(options, app) + engines[key] = self._make_engine(key, options, app) + + if app.config.setdefault("SQLALCHEMY_RECORD_QUERIES", False): + from . import record_queries + + for engine in engines.values(): + record_queries._listen(engine) + + if app.config.setdefault("SQLALCHEMY_TRACK_MODIFICATIONS", False): + from . import track_modifications + + track_modifications._listen(self.session) + + def _make_scoped_session( + self, options: dict[str, t.Any] + ) -> sa_orm.scoped_session[Session]: + """Create a :class:`sqlalchemy.orm.scoping.scoped_session` around the factory + from :meth:`_make_session_factory`. The result is available as :attr:`session`. + + The scope function can be customized using the ``scopefunc`` key in the + ``session_options`` parameter to the extension. By default it uses the current + thread or greenlet id. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param options: The ``session_options`` parameter from ``__init__``. Keyword + arguments passed to the session factory. A ``scopefunc`` key is popped. + + .. versionchanged:: 3.0 + The session is scoped to the current app context. + + .. versionchanged:: 3.0 + Renamed from ``create_scoped_session``, this method is internal. + """ + scope = options.pop("scopefunc", _app_ctx_id) + factory = self._make_session_factory(options) + return sa_orm.scoped_session(factory, scope) + + def _make_session_factory( + self, options: dict[str, t.Any] + ) -> sa_orm.sessionmaker[Session]: + """Create the SQLAlchemy :class:`sqlalchemy.orm.sessionmaker` used by + :meth:`_make_scoped_session`. + + To customize, pass the ``session_options`` parameter to :class:`SQLAlchemy`. To + customize the session class, subclass :class:`.Session` and pass it as the + ``class_`` key. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param options: The ``session_options`` parameter from ``__init__``. Keyword + arguments passed to the session factory. + + .. versionchanged:: 3.0 + The session class can be customized. + + .. versionchanged:: 3.0 + Renamed from ``create_session``, this method is internal. + """ + options.setdefault("class_", Session) + options.setdefault("query_cls", self.Query) + return sa_orm.sessionmaker(db=self, **options) + + def _teardown_session(self, exc: BaseException | None) -> None: + """Remove the current session at the end of the request. + + :meta private: + + .. versionadded:: 3.0 + """ + self.session.remove() + + def _make_metadata(self, bind_key: str | None) -> sa.MetaData: + """Get or create a :class:`sqlalchemy.schema.MetaData` for the given bind key. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param bind_key: The name of the metadata being created. + + .. versionadded:: 3.0 + """ + if bind_key in self.metadatas: + return self.metadatas[bind_key] + + if bind_key is not None: + # Copy the naming convention from the default metadata. + naming_convention = self._make_metadata(None).naming_convention + else: + naming_convention = None + + # Set the bind key in info to be used by session.get_bind. + metadata = sa.MetaData( + naming_convention=naming_convention, info={"bind_key": bind_key} + ) + self.metadatas[bind_key] = metadata + return metadata + + def _make_table_class(self) -> type[_Table]: + """Create a SQLAlchemy :class:`sqlalchemy.schema.Table` class that chooses a + metadata automatically based on the ``bind_key``. The result is available as + :attr:`Table`. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + .. versionadded:: 3.0 + """ + + class Table(_Table): + def __new__( + cls, *args: t.Any, bind_key: str | None = None, **kwargs: t.Any + ) -> Table: + # If a metadata arg is passed, go directly to the base Table. Also do + # this for no args so the correct error is shown. + if not args or (len(args) >= 2 and isinstance(args[1], sa.MetaData)): + return super().__new__(cls, *args, **kwargs) + + metadata = self._make_metadata(bind_key) + return super().__new__(cls, *[args[0], metadata, *args[1:]], **kwargs) + + return Table + + def _make_declarative_base( + self, + model_class: _FSA_MCT, + disable_autonaming: bool = False, + ) -> t.Type[_FSAModel]: + """Create a SQLAlchemy declarative model class. The result is available as + :attr:`Model`. + + To customize, subclass :class:`.Model` and pass it as ``model_class`` to + :class:`SQLAlchemy`. To customize at the metaclass level, pass an already + created declarative model class as ``model_class``. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param model_class: A model base class, or an already created declarative model + class. + + :param disable_autonaming: Turns off automatic tablename generation in models. + + .. versionchanged:: 3.1.0 + Added support for passing SQLAlchemy 2.x base class as model class. + Added optional ``disable_autonaming`` parameter. + + .. versionchanged:: 3.0 + Renamed with a leading underscore, this method is internal. + + .. versionchanged:: 2.3 + ``model`` can be an already created declarative model class. + """ + model: t.Type[_FSAModel] + declarative_bases = _get_2x_declarative_bases(model_class) + if len(declarative_bases) > 1: + # raise error if more than one declarative base is found + raise ValueError( + "Only one declarative base can be passed to SQLAlchemy." + " Got: {}".format(model_class.__bases__) + ) + elif len(declarative_bases) == 1: + body = dict(model_class.__dict__) + body["__fsa__"] = self + mixin_classes = [BindMixin, NameMixin, Model] + if disable_autonaming: + mixin_classes.remove(NameMixin) + model = types.new_class( + "FlaskSQLAlchemyBase", + (*mixin_classes, *model_class.__bases__), + {"metaclass": type(declarative_bases[0])}, + lambda ns: ns.update(body), + ) + elif not isinstance(model_class, sa_orm.DeclarativeMeta): + metadata = self._make_metadata(None) + metaclass = DefaultMetaNoName if disable_autonaming else DefaultMeta + model = sa_orm.declarative_base( + metadata=metadata, cls=model_class, name="Model", metaclass=metaclass + ) + else: + model = model_class # type: ignore[assignment] + + if None not in self.metadatas: + # Use the model's metadata as the default metadata. + model.metadata.info["bind_key"] = None + self.metadatas[None] = model.metadata + else: + # Use the passed in default metadata as the model's metadata. + model.metadata = self.metadatas[None] + + model.query_class = self.Query + model.query = _QueryProperty() # type: ignore[assignment] + model.__fsa__ = self + return model + + def _apply_driver_defaults(self, options: dict[str, t.Any], app: Flask) -> None: + """Apply driver-specific configuration to an engine. + + SQLite in-memory databases use ``StaticPool`` and disable ``check_same_thread``. + File paths are relative to the app's :attr:`~flask.Flask.instance_path`, + which is created if it doesn't exist. + + MySQL sets ``charset="utf8mb4"``, and ``pool_timeout`` defaults to 2 hours. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param options: Arguments passed to the engine. + :param app: The application that the engine configuration belongs to. + + .. versionchanged:: 3.0 + SQLite paths are relative to ``app.instance_path``. It does not use + ``NullPool`` if ``pool_size`` is 0. Driver-level URIs are supported. + + .. versionchanged:: 3.0 + MySQL sets ``charset="utf8mb4". It does not set ``pool_size`` to 10. It + does not set ``pool_recycle`` if not using a queue pool. + + .. versionchanged:: 3.0 + Renamed from ``apply_driver_hacks``, this method is internal. It does not + return anything. + + .. versionchanged:: 2.5 + Returns ``(sa_url, options)``. + """ + url = sa.engine.make_url(options["url"]) + + if url.drivername in {"sqlite", "sqlite+pysqlite"}: + if url.database is None or url.database in {"", ":memory:"}: + options["poolclass"] = sa.pool.StaticPool + + if "connect_args" not in options: + options["connect_args"] = {} + + options["connect_args"]["check_same_thread"] = False + else: + # the url might look like sqlite:///file:path?uri=true + is_uri = url.query.get("uri", False) + + if is_uri: + db_str = url.database[5:] + else: + db_str = url.database + + if not os.path.isabs(db_str): + os.makedirs(app.instance_path, exist_ok=True) + db_str = os.path.join(app.instance_path, db_str) + + if is_uri: + db_str = f"file:{db_str}" + + options["url"] = url.set(database=db_str) + elif url.drivername.startswith("mysql"): + # set queue defaults only when using queue pool + if ( + "pool_class" not in options + or options["pool_class"] is sa.pool.QueuePool + ): + options.setdefault("pool_recycle", 7200) + + if "charset" not in url.query: + options["url"] = url.update_query_dict({"charset": "utf8mb4"}) + + def _make_engine( + self, bind_key: str | None, options: dict[str, t.Any], app: Flask + ) -> sa.engine.Engine: + """Create the :class:`sqlalchemy.engine.Engine` for the given bind key and app. + + To customize, use :data:`.SQLALCHEMY_ENGINE_OPTIONS` or + :data:`.SQLALCHEMY_BINDS` config. Pass ``engine_options`` to :class:`SQLAlchemy` + to set defaults for all engines. + + This method is used for internal setup. Its signature may change at any time. + + :meta private: + + :param bind_key: The name of the engine being created. + :param options: Arguments passed to the engine. + :param app: The application that the engine configuration belongs to. + + .. versionchanged:: 3.0 + Renamed from ``create_engine``, this method is internal. + """ + return sa.engine_from_config(options, prefix="") + + @property + def metadata(self) -> sa.MetaData: + """The default metadata used by :attr:`Model` and :attr:`Table` if no bind key + is set. + """ + return self.metadatas[None] + + @property + def engines(self) -> t.Mapping[str | None, sa.engine.Engine]: + """Map of bind keys to :class:`sqlalchemy.engine.Engine` instances for current + application. The ``None`` key refers to the default engine, and is available as + :attr:`engine`. + + To customize, set the :data:`.SQLALCHEMY_BINDS` config, and set defaults by + passing the ``engine_options`` parameter to the extension. + + This requires that a Flask application context is active. + + .. versionadded:: 3.0 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + + if app not in self._app_engines: + raise RuntimeError( + "The current Flask app is not registered with this 'SQLAlchemy'" + " instance. Did you forget to call 'init_app', or did you create" + " multiple 'SQLAlchemy' instances?" + ) + + return self._app_engines[app] + + @property + def engine(self) -> sa.engine.Engine: + """The default :class:`~sqlalchemy.engine.Engine` for the current application, + used by :attr:`session` if the :attr:`Model` or :attr:`Table` being queried does + not set a bind key. + + To customize, set the :data:`.SQLALCHEMY_ENGINE_OPTIONS` config, and set + defaults by passing the ``engine_options`` parameter to the extension. + + This requires that a Flask application context is active. + """ + return self.engines[None] + + def get_engine( + self, bind_key: str | None = None, **kwargs: t.Any + ) -> sa.engine.Engine: + """Get the engine for the given bind key for the current application. + This requires that a Flask application context is active. + + :param bind_key: The name of the engine. + + .. deprecated:: 3.0 + Will be removed in Flask-SQLAlchemy 3.2. Use ``engines[key]`` instead. + + .. versionchanged:: 3.0 + Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` + parameter. + """ + warnings.warn( + "'get_engine' is deprecated and will be removed in Flask-SQLAlchemy" + " 3.2. Use 'engine' or 'engines[key]' instead. If you're using" + " Flask-Migrate or Alembic, you'll need to update your 'env.py' file.", + DeprecationWarning, + stacklevel=2, + ) + + if "bind" in kwargs: + bind_key = kwargs.pop("bind") + + return self.engines[bind_key] + + def get_or_404( + self, + entity: type[_O], + ident: t.Any, + *, + description: str | None = None, + **kwargs: t.Any, + ) -> _O: + """Like :meth:`session.get() ` but aborts with a + ``404 Not Found`` error instead of returning ``None``. + + :param entity: The model class to query. + :param ident: The primary key to query. + :param description: A custom message to show on the error page. + :param kwargs: Extra arguments passed to ``session.get()``. + + .. versionchanged:: 3.1 + Pass extra keyword arguments to ``session.get()``. + + .. versionadded:: 3.0 + """ + value = self.session.get(entity, ident, **kwargs) + + if value is None: + abort(404, description=description) + + return value + + def first_or_404( + self, statement: sa.sql.Select[t.Any], *, description: str | None = None + ) -> t.Any: + """Like :meth:`Result.scalar() `, but aborts + with a ``404 Not Found`` error instead of returning ``None``. + + :param statement: The ``select`` statement to execute. + :param description: A custom message to show on the error page. + + .. versionadded:: 3.0 + """ + value = self.session.execute(statement).scalar() + + if value is None: + abort(404, description=description) + + return value + + def one_or_404( + self, statement: sa.sql.Select[t.Any], *, description: str | None = None + ) -> t.Any: + """Like :meth:`Result.scalar_one() `, + but aborts with a ``404 Not Found`` error instead of raising ``NoResultFound`` + or ``MultipleResultsFound``. + + :param statement: The ``select`` statement to execute. + :param description: A custom message to show on the error page. + + .. versionadded:: 3.0 + """ + try: + return self.session.execute(statement).scalar_one() + except (sa_exc.NoResultFound, sa_exc.MultipleResultsFound): + abort(404, description=description) + + def paginate( + self, + select: sa.sql.Select[t.Any], + *, + page: int | None = None, + per_page: int | None = None, + max_per_page: int | None = None, + error_out: bool = True, + count: bool = True, + ) -> Pagination: + """Apply an offset and limit to a select statment based on the current page and + number of items per page, returning a :class:`.Pagination` object. + + The statement should select a model class, like ``select(User)``. This applies + ``unique()`` and ``scalars()`` modifiers to the result, so compound selects will + not return the expected results. + + :param select: The ``select`` statement to paginate. + :param page: The current page, used to calculate the offset. Defaults to the + ``page`` query arg during a request, or 1 otherwise. + :param per_page: The maximum number of items on a page, used to calculate the + offset and limit. Defaults to the ``per_page`` query arg during a request, + or 20 otherwise. + :param max_per_page: The maximum allowed value for ``per_page``, to limit a + user-provided value. Use ``None`` for no limit. Defaults to 100. + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + :param count: Calculate the total number of values by issuing an extra count + query. For very complex queries this may be inaccurate or slow, so it can be + disabled and set manually if necessary. + + .. versionchanged:: 3.0 + The ``count`` query is more efficient. + + .. versionadded:: 3.0 + """ + return SelectPagination( + select=select, + session=self.session(), + page=page, + per_page=per_page, + max_per_page=max_per_page, + error_out=error_out, + count=count, + ) + + def _call_for_binds( + self, bind_key: str | None | list[str | None], op_name: str + ) -> None: + """Call a method on each metadata. + + :meta private: + + :param bind_key: A bind key or list of keys. Defaults to all binds. + :param op_name: The name of the method to call. + + .. versionchanged:: 3.0 + Renamed from ``_execute_for_all_tables``. + """ + if bind_key == "__all__": + keys: list[str | None] = list(self.metadatas) + elif bind_key is None or isinstance(bind_key, str): + keys = [bind_key] + else: + keys = bind_key + + for key in keys: + try: + engine = self.engines[key] + except KeyError: + message = f"Bind key '{key}' is not in 'SQLALCHEMY_BINDS' config." + + if key is None: + message = f"'SQLALCHEMY_DATABASE_URI' config is not set. {message}" + + raise sa_exc.UnboundExecutionError(message) from None + + metadata = self.metadatas[key] + getattr(metadata, op_name)(bind=engine) + + def create_all(self, bind_key: str | None | list[str | None] = "__all__") -> None: + """Create tables that do not exist in the database by calling + ``metadata.create_all()`` for all or some bind keys. This does not + update existing tables, use a migration library for that. + + This requires that a Flask application context is active. + + :param bind_key: A bind key or list of keys to create the tables for. Defaults + to all binds. + + .. versionchanged:: 3.0 + Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` + parameter. + + .. versionchanged:: 0.12 + Added the ``bind`` and ``app`` parameters. + """ + self._call_for_binds(bind_key, "create_all") + + def drop_all(self, bind_key: str | None | list[str | None] = "__all__") -> None: + """Drop tables by calling ``metadata.drop_all()`` for all or some bind keys. + + This requires that a Flask application context is active. + + :param bind_key: A bind key or list of keys to drop the tables from. Defaults to + all binds. + + .. versionchanged:: 3.0 + Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` + parameter. + + .. versionchanged:: 0.12 + Added the ``bind`` and ``app`` parameters. + """ + self._call_for_binds(bind_key, "drop_all") + + def reflect(self, bind_key: str | None | list[str | None] = "__all__") -> None: + """Load table definitions from the database by calling ``metadata.reflect()`` + for all or some bind keys. + + This requires that a Flask application context is active. + + :param bind_key: A bind key or list of keys to reflect the tables from. Defaults + to all binds. + + .. versionchanged:: 3.0 + Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` + parameter. + + .. versionchanged:: 0.12 + Added the ``bind`` and ``app`` parameters. + """ + self._call_for_binds(bind_key, "reflect") + + def _set_rel_query(self, kwargs: dict[str, t.Any]) -> None: + """Apply the extension's :attr:`Query` class as the default for relationships + and backrefs. + + :meta private: + """ + kwargs.setdefault("query_class", self.Query) + + if "backref" in kwargs: + backref = kwargs["backref"] + + if isinstance(backref, str): + backref = (backref, {}) + + backref[1].setdefault("query_class", self.Query) + + def relationship( + self, *args: t.Any, **kwargs: t.Any + ) -> sa_orm.RelationshipProperty[t.Any]: + """A :func:`sqlalchemy.orm.relationship` that applies this extension's + :attr:`Query` class for dynamic relationships and backrefs. + + .. versionchanged:: 3.0 + The :attr:`Query` class is set on ``backref``. + """ + self._set_rel_query(kwargs) + return sa_orm.relationship(*args, **kwargs) + + def dynamic_loader( + self, argument: t.Any, **kwargs: t.Any + ) -> sa_orm.RelationshipProperty[t.Any]: + """A :func:`sqlalchemy.orm.dynamic_loader` that applies this extension's + :attr:`Query` class for relationships and backrefs. + + .. versionchanged:: 3.0 + The :attr:`Query` class is set on ``backref``. + """ + self._set_rel_query(kwargs) + return sa_orm.dynamic_loader(argument, **kwargs) + + def _relation( + self, *args: t.Any, **kwargs: t.Any + ) -> sa_orm.RelationshipProperty[t.Any]: + """A :func:`sqlalchemy.orm.relationship` that applies this extension's + :attr:`Query` class for dynamic relationships and backrefs. + + SQLAlchemy 2.0 removes this name, use ``relationship`` instead. + + :meta private: + + .. versionchanged:: 3.0 + The :attr:`Query` class is set on ``backref``. + """ + self._set_rel_query(kwargs) + f = sa_orm.relationship + return f(*args, **kwargs) + + def __getattr__(self, name: str) -> t.Any: + if name == "relation": + return self._relation + + if name == "event": + return sa_event + + if name.startswith("_"): + raise AttributeError(name) + + for mod in (sa, sa_orm): + if hasattr(mod, name): + return getattr(mod, name) + + raise AttributeError(name) diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/model.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/model.py new file mode 100644 index 00000000..c6f9e5a9 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/model.py @@ -0,0 +1,330 @@ +from __future__ import annotations + +import re +import typing as t + +import sqlalchemy as sa +import sqlalchemy.orm as sa_orm + +from .query import Query + +if t.TYPE_CHECKING: + from .extension import SQLAlchemy + + +class _QueryProperty: + """A class property that creates a query object for a model. + + :meta private: + """ + + def __get__(self, obj: Model | None, cls: type[Model]) -> Query: + return cls.query_class( + cls, session=cls.__fsa__.session() # type: ignore[arg-type] + ) + + +class Model: + """The base class of the :attr:`.SQLAlchemy.Model` declarative model class. + + To define models, subclass :attr:`db.Model <.SQLAlchemy.Model>`, not this. To + customize ``db.Model``, subclass this and pass it as ``model_class`` to + :class:`.SQLAlchemy`. To customize ``db.Model`` at the metaclass level, pass an + already created declarative model class as ``model_class``. + """ + + __fsa__: t.ClassVar[SQLAlchemy] + """Internal reference to the extension object. + + :meta private: + """ + + query_class: t.ClassVar[type[Query]] = Query + """Query class used by :attr:`query`. Defaults to :attr:`.SQLAlchemy.Query`, which + defaults to :class:`.Query`. + """ + + query: t.ClassVar[Query] = _QueryProperty() # type: ignore[assignment] + """A SQLAlchemy query for a model. Equivalent to ``db.session.query(Model)``. Can be + customized per-model by overriding :attr:`query_class`. + + .. warning:: + The query interface is considered legacy in SQLAlchemy. Prefer using + ``session.execute(select())`` instead. + """ + + def __repr__(self) -> str: + state = sa.inspect(self) + assert state is not None + + if state.transient: + pk = f"(transient {id(self)})" + elif state.pending: + pk = f"(pending {id(self)})" + else: + pk = ", ".join(map(str, state.identity)) + + return f"<{type(self).__name__} {pk}>" + + +class BindMetaMixin(type): + """Metaclass mixin that sets a model's ``metadata`` based on its ``__bind_key__``. + + If the model sets ``metadata`` or ``__table__`` directly, ``__bind_key__`` is + ignored. If the ``metadata`` is the same as the parent model, it will not be set + directly on the child model. + """ + + __fsa__: SQLAlchemy + metadata: sa.MetaData + + def __init__( + cls, name: str, bases: tuple[type, ...], d: dict[str, t.Any], **kwargs: t.Any + ) -> None: + if not ("metadata" in cls.__dict__ or "__table__" in cls.__dict__): + bind_key = getattr(cls, "__bind_key__", None) + parent_metadata = getattr(cls, "metadata", None) + metadata = cls.__fsa__._make_metadata(bind_key) + + if metadata is not parent_metadata: + cls.metadata = metadata + + super().__init__(name, bases, d, **kwargs) + + +class BindMixin: + """DeclarativeBase mixin to set a model's ``metadata`` based on ``__bind_key__``. + + If no ``__bind_key__`` is specified, the model will use the default metadata + provided by ``DeclarativeBase`` or ``DeclarativeBaseNoMeta``. + If the model doesn't set ``metadata`` or ``__table__`` directly + and does set ``__bind_key__``, the model will use the metadata + for the specified bind key. + If the ``metadata`` is the same as the parent model, it will not be set + directly on the child model. + + .. versionchanged:: 3.1.0 + """ + + __fsa__: SQLAlchemy + metadata: sa.MetaData + + @classmethod + def __init_subclass__(cls: t.Type[BindMixin], **kwargs: t.Dict[str, t.Any]) -> None: + if not ("metadata" in cls.__dict__ or "__table__" in cls.__dict__) and hasattr( + cls, "__bind_key__" + ): + bind_key = getattr(cls, "__bind_key__", None) + parent_metadata = getattr(cls, "metadata", None) + metadata = cls.__fsa__._make_metadata(bind_key) + + if metadata is not parent_metadata: + cls.metadata = metadata + + super().__init_subclass__(**kwargs) + + +class NameMetaMixin(type): + """Metaclass mixin that sets a model's ``__tablename__`` by converting the + ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models + that do not otherwise define ``__tablename__``. If a model does not define a primary + key, it will not generate a name or ``__table__``, for single-table inheritance. + """ + + metadata: sa.MetaData + __tablename__: str + __table__: sa.Table + + def __init__( + cls, name: str, bases: tuple[type, ...], d: dict[str, t.Any], **kwargs: t.Any + ) -> None: + if should_set_tablename(cls): + cls.__tablename__ = camel_to_snake_case(cls.__name__) + + super().__init__(name, bases, d, **kwargs) + + # __table_cls__ has run. If no table was created, use the parent table. + if ( + "__tablename__" not in cls.__dict__ + and "__table__" in cls.__dict__ + and cls.__dict__["__table__"] is None + ): + del cls.__table__ + + def __table_cls__(cls, *args: t.Any, **kwargs: t.Any) -> sa.Table | None: + """This is called by SQLAlchemy during mapper setup. It determines the final + table object that the model will use. + + If no primary key is found, that indicates single-table inheritance, so no table + will be created and ``__tablename__`` will be unset. + """ + schema = kwargs.get("schema") + + if schema is None: + key = args[0] + else: + key = f"{schema}.{args[0]}" + + # Check if a table with this name already exists. Allows reflected tables to be + # applied to models by name. + if key in cls.metadata.tables: + return sa.Table(*args, **kwargs) + + # If a primary key is found, create a table for joined-table inheritance. + for arg in args: + if (isinstance(arg, sa.Column) and arg.primary_key) or isinstance( + arg, sa.PrimaryKeyConstraint + ): + return sa.Table(*args, **kwargs) + + # If no base classes define a table, return one that's missing a primary key + # so SQLAlchemy shows the correct error. + for base in cls.__mro__[1:-1]: + if "__table__" in base.__dict__: + break + else: + return sa.Table(*args, **kwargs) + + # Single-table inheritance, use the parent table name. __init__ will unset + # __table__ based on this. + if "__tablename__" in cls.__dict__: + del cls.__tablename__ + + return None + + +class NameMixin: + """DeclarativeBase mixin that sets a model's ``__tablename__`` by converting the + ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models + that do not otherwise define ``__tablename__``. If a model does not define a primary + key, it will not generate a name or ``__table__``, for single-table inheritance. + + .. versionchanged:: 3.1.0 + """ + + metadata: sa.MetaData + __tablename__: str + __table__: sa.Table + + @classmethod + def __init_subclass__(cls: t.Type[NameMixin], **kwargs: t.Dict[str, t.Any]) -> None: + if should_set_tablename(cls): + cls.__tablename__ = camel_to_snake_case(cls.__name__) + + super().__init_subclass__(**kwargs) + + # __table_cls__ has run. If no table was created, use the parent table. + if ( + "__tablename__" not in cls.__dict__ + and "__table__" in cls.__dict__ + and cls.__dict__["__table__"] is None + ): + del cls.__table__ + + @classmethod + def __table_cls__(cls, *args: t.Any, **kwargs: t.Any) -> sa.Table | None: + """This is called by SQLAlchemy during mapper setup. It determines the final + table object that the model will use. + + If no primary key is found, that indicates single-table inheritance, so no table + will be created and ``__tablename__`` will be unset. + """ + schema = kwargs.get("schema") + + if schema is None: + key = args[0] + else: + key = f"{schema}.{args[0]}" + + # Check if a table with this name already exists. Allows reflected tables to be + # applied to models by name. + if key in cls.metadata.tables: + return sa.Table(*args, **kwargs) + + # If a primary key is found, create a table for joined-table inheritance. + for arg in args: + if (isinstance(arg, sa.Column) and arg.primary_key) or isinstance( + arg, sa.PrimaryKeyConstraint + ): + return sa.Table(*args, **kwargs) + + # If no base classes define a table, return one that's missing a primary key + # so SQLAlchemy shows the correct error. + for base in cls.__mro__[1:-1]: + if "__table__" in base.__dict__: + break + else: + return sa.Table(*args, **kwargs) + + # Single-table inheritance, use the parent table name. __init__ will unset + # __table__ based on this. + if "__tablename__" in cls.__dict__: + del cls.__tablename__ + + return None + + +def should_set_tablename(cls: type) -> bool: + """Determine whether ``__tablename__`` should be generated for a model. + + - If no class in the MRO sets a name, one should be generated. + - If a declared attr is found, it should be used instead. + - If a name is found, it should be used if the class is a mixin, otherwise one + should be generated. + - Abstract models should not have one generated. + + Later, ``__table_cls__`` will determine if the model looks like single or + joined-table inheritance. If no primary key is found, the name will be unset. + """ + if ( + cls.__dict__.get("__abstract__", False) + or ( + not issubclass(cls, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) + and not any(isinstance(b, sa_orm.DeclarativeMeta) for b in cls.__mro__[1:]) + ) + or any( + (b is sa_orm.DeclarativeBase or b is sa_orm.DeclarativeBaseNoMeta) + for b in cls.__bases__ + ) + ): + return False + + for base in cls.__mro__: + if "__tablename__" not in base.__dict__: + continue + + if isinstance(base.__dict__["__tablename__"], sa_orm.declared_attr): + return False + + return not ( + base is cls + or base.__dict__.get("__abstract__", False) + or not ( + # SQLAlchemy 1.x + isinstance(base, sa_orm.DeclarativeMeta) + # 2.x: DeclarativeBas uses this as metaclass + or isinstance(base, sa_orm.decl_api.DeclarativeAttributeIntercept) + # 2.x: DeclarativeBaseNoMeta doesn't use a metaclass + or issubclass(base, sa_orm.DeclarativeBaseNoMeta) + ) + ) + + return True + + +def camel_to_snake_case(name: str) -> str: + """Convert a ``CamelCase`` name to ``snake_case``.""" + name = re.sub(r"((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))", r"_\1", name) + return name.lower().lstrip("_") + + +class DefaultMeta(BindMetaMixin, NameMetaMixin, sa_orm.DeclarativeMeta): + """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and + ``__tablename__`` support. + """ + + +class DefaultMetaNoName(BindMetaMixin, sa_orm.DeclarativeMeta): + """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and + ``__tablename__`` support. + """ diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/pagination.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/pagination.py new file mode 100644 index 00000000..3d49d6e0 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/pagination.py @@ -0,0 +1,364 @@ +from __future__ import annotations + +import typing as t +from math import ceil + +import sqlalchemy as sa +import sqlalchemy.orm as sa_orm +from flask import abort +from flask import request + + +class Pagination: + """Apply an offset and limit to the query based on the current page and number of + items per page. + + Don't create pagination objects manually. They are created by + :meth:`.SQLAlchemy.paginate` and :meth:`.Query.paginate`. + + This is a base class, a subclass must implement :meth:`_query_items` and + :meth:`_query_count`. Those methods will use arguments passed as ``kwargs`` to + perform the queries. + + :param page: The current page, used to calculate the offset. Defaults to the + ``page`` query arg during a request, or 1 otherwise. + :param per_page: The maximum number of items on a page, used to calculate the + offset and limit. Defaults to the ``per_page`` query arg during a request, + or 20 otherwise. + :param max_per_page: The maximum allowed value for ``per_page``, to limit a + user-provided value. Use ``None`` for no limit. Defaults to 100. + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + :param count: Calculate the total number of values by issuing an extra count + query. For very complex queries this may be inaccurate or slow, so it can be + disabled and set manually if necessary. + :param kwargs: Information about the query to paginate. Different subclasses will + require different arguments. + + .. versionchanged:: 3.0 + Iterating over a pagination object iterates over its items. + + .. versionchanged:: 3.0 + Creating instances manually is not a public API. + """ + + def __init__( + self, + page: int | None = None, + per_page: int | None = None, + max_per_page: int | None = 100, + error_out: bool = True, + count: bool = True, + **kwargs: t.Any, + ) -> None: + self._query_args = kwargs + page, per_page = self._prepare_page_args( + page=page, + per_page=per_page, + max_per_page=max_per_page, + error_out=error_out, + ) + + self.page: int = page + """The current page.""" + + self.per_page: int = per_page + """The maximum number of items on a page.""" + + self.max_per_page: int | None = max_per_page + """The maximum allowed value for ``per_page``.""" + + items = self._query_items() + + if not items and page != 1 and error_out: + abort(404) + + self.items: list[t.Any] = items + """The items on the current page. Iterating over the pagination object is + equivalent to iterating over the items. + """ + + if count: + total = self._query_count() + else: + total = None + + self.total: int | None = total + """The total number of items across all pages.""" + + @staticmethod + def _prepare_page_args( + *, + page: int | None = None, + per_page: int | None = None, + max_per_page: int | None = None, + error_out: bool = True, + ) -> tuple[int, int]: + if request: + if page is None: + try: + page = int(request.args.get("page", 1)) + except (TypeError, ValueError): + if error_out: + abort(404) + + page = 1 + + if per_page is None: + try: + per_page = int(request.args.get("per_page", 20)) + except (TypeError, ValueError): + if error_out: + abort(404) + + per_page = 20 + else: + if page is None: + page = 1 + + if per_page is None: + per_page = 20 + + if max_per_page is not None: + per_page = min(per_page, max_per_page) + + if page < 1: + if error_out: + abort(404) + else: + page = 1 + + if per_page < 1: + if error_out: + abort(404) + else: + per_page = 20 + + return page, per_page + + @property + def _query_offset(self) -> int: + """The index of the first item to query, passed to ``offset()``. + + :meta private: + + .. versionadded:: 3.0 + """ + return (self.page - 1) * self.per_page + + def _query_items(self) -> list[t.Any]: + """Execute the query to get the items on the current page. + + Uses init arguments stored in :attr:`_query_args`. + + :meta private: + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + def _query_count(self) -> int: + """Execute the query to get the total number of items. + + Uses init arguments stored in :attr:`_query_args`. + + :meta private: + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + @property + def first(self) -> int: + """The number of the first item on the page, starting from 1, or 0 if there are + no items. + + .. versionadded:: 3.0 + """ + if len(self.items) == 0: + return 0 + + return (self.page - 1) * self.per_page + 1 + + @property + def last(self) -> int: + """The number of the last item on the page, starting from 1, inclusive, or 0 if + there are no items. + + .. versionadded:: 3.0 + """ + first = self.first + return max(first, first + len(self.items) - 1) + + @property + def pages(self) -> int: + """The total number of pages.""" + if self.total == 0 or self.total is None: + return 0 + + return ceil(self.total / self.per_page) + + @property + def has_prev(self) -> bool: + """``True`` if this is not the first page.""" + return self.page > 1 + + @property + def prev_num(self) -> int | None: + """The previous page number, or ``None`` if this is the first page.""" + if not self.has_prev: + return None + + return self.page - 1 + + def prev(self, *, error_out: bool = False) -> Pagination: + """Query the :class:`Pagination` object for the previous page. + + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + """ + p = type(self)( + page=self.page - 1, + per_page=self.per_page, + error_out=error_out, + count=False, + **self._query_args, + ) + p.total = self.total + return p + + @property + def has_next(self) -> bool: + """``True`` if this is not the last page.""" + return self.page < self.pages + + @property + def next_num(self) -> int | None: + """The next page number, or ``None`` if this is the last page.""" + if not self.has_next: + return None + + return self.page + 1 + + def next(self, *, error_out: bool = False) -> Pagination: + """Query the :class:`Pagination` object for the next page. + + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + """ + p = type(self)( + page=self.page + 1, + per_page=self.per_page, + max_per_page=self.max_per_page, + error_out=error_out, + count=False, + **self._query_args, + ) + p.total = self.total + return p + + def iter_pages( + self, + *, + left_edge: int = 2, + left_current: int = 2, + right_current: int = 4, + right_edge: int = 2, + ) -> t.Iterator[int | None]: + """Yield page numbers for a pagination widget. Skipped pages between the edges + and middle are represented by a ``None``. + + For example, if there are 20 pages and the current page is 7, the following + values are yielded. + + .. code-block:: python + + 1, 2, None, 5, 6, 7, 8, 9, 10, 11, None, 19, 20 + + :param left_edge: How many pages to show from the first page. + :param left_current: How many pages to show left of the current page. + :param right_current: How many pages to show right of the current page. + :param right_edge: How many pages to show from the last page. + + .. versionchanged:: 3.0 + Improved efficiency of calculating what to yield. + + .. versionchanged:: 3.0 + ``right_current`` boundary is inclusive. + + .. versionchanged:: 3.0 + All parameters are keyword-only. + """ + pages_end = self.pages + 1 + + if pages_end == 1: + return + + left_end = min(1 + left_edge, pages_end) + yield from range(1, left_end) + + if left_end == pages_end: + return + + mid_start = max(left_end, self.page - left_current) + mid_end = min(self.page + right_current + 1, pages_end) + + if mid_start - left_end > 0: + yield None + + yield from range(mid_start, mid_end) + + if mid_end == pages_end: + return + + right_start = max(mid_end, pages_end - right_edge) + + if right_start - mid_end > 0: + yield None + + yield from range(right_start, pages_end) + + def __iter__(self) -> t.Iterator[t.Any]: + yield from self.items + + +class SelectPagination(Pagination): + """Returned by :meth:`.SQLAlchemy.paginate`. Takes ``select`` and ``session`` + arguments in addition to the :class:`Pagination` arguments. + + .. versionadded:: 3.0 + """ + + def _query_items(self) -> list[t.Any]: + select = self._query_args["select"] + select = select.limit(self.per_page).offset(self._query_offset) + session = self._query_args["session"] + return list(session.execute(select).unique().scalars()) + + def _query_count(self) -> int: + select = self._query_args["select"] + sub = select.options(sa_orm.lazyload("*")).order_by(None).subquery() + session = self._query_args["session"] + out = session.execute(sa.select(sa.func.count()).select_from(sub)).scalar() + return out # type: ignore[no-any-return] + + +class QueryPagination(Pagination): + """Returned by :meth:`.Query.paginate`. Takes a ``query`` argument in addition to + the :class:`Pagination` arguments. + + .. versionadded:: 3.0 + """ + + def _query_items(self) -> list[t.Any]: + query = self._query_args["query"] + out = query.limit(self.per_page).offset(self._query_offset).all() + return out # type: ignore[no-any-return] + + def _query_count(self) -> int: + # Query.count automatically disables eager loads + out = self._query_args["query"].order_by(None).count() + return out # type: ignore[no-any-return] diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/py.typed b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/query.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/query.py new file mode 100644 index 00000000..35f927d2 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/query.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +import typing as t + +import sqlalchemy.exc as sa_exc +import sqlalchemy.orm as sa_orm +from flask import abort + +from .pagination import Pagination +from .pagination import QueryPagination + + +class Query(sa_orm.Query): # type: ignore[type-arg] + """SQLAlchemy :class:`~sqlalchemy.orm.query.Query` subclass with some extra methods + useful for querying in a web application. + + This is the default query class for :attr:`.Model.query`. + + .. versionchanged:: 3.0 + Renamed to ``Query`` from ``BaseQuery``. + """ + + def get_or_404(self, ident: t.Any, description: str | None = None) -> t.Any: + """Like :meth:`~sqlalchemy.orm.Query.get` but aborts with a ``404 Not Found`` + error instead of returning ``None``. + + :param ident: The primary key to query. + :param description: A custom message to show on the error page. + """ + rv = self.get(ident) + + if rv is None: + abort(404, description=description) + + return rv + + def first_or_404(self, description: str | None = None) -> t.Any: + """Like :meth:`~sqlalchemy.orm.Query.first` but aborts with a ``404 Not Found`` + error instead of returning ``None``. + + :param description: A custom message to show on the error page. + """ + rv = self.first() + + if rv is None: + abort(404, description=description) + + return rv + + def one_or_404(self, description: str | None = None) -> t.Any: + """Like :meth:`~sqlalchemy.orm.Query.one` but aborts with a ``404 Not Found`` + error instead of raising ``NoResultFound`` or ``MultipleResultsFound``. + + :param description: A custom message to show on the error page. + + .. versionadded:: 3.0 + """ + try: + return self.one() + except (sa_exc.NoResultFound, sa_exc.MultipleResultsFound): + abort(404, description=description) + + def paginate( + self, + *, + page: int | None = None, + per_page: int | None = None, + max_per_page: int | None = None, + error_out: bool = True, + count: bool = True, + ) -> Pagination: + """Apply an offset and limit to the query based on the current page and number + of items per page, returning a :class:`.Pagination` object. + + :param page: The current page, used to calculate the offset. Defaults to the + ``page`` query arg during a request, or 1 otherwise. + :param per_page: The maximum number of items on a page, used to calculate the + offset and limit. Defaults to the ``per_page`` query arg during a request, + or 20 otherwise. + :param max_per_page: The maximum allowed value for ``per_page``, to limit a + user-provided value. Use ``None`` for no limit. Defaults to 100. + :param error_out: Abort with a ``404 Not Found`` error if no items are returned + and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if + either are not ints. + :param count: Calculate the total number of values by issuing an extra count + query. For very complex queries this may be inaccurate or slow, so it can be + disabled and set manually if necessary. + + .. versionchanged:: 3.0 + All parameters are keyword-only. + + .. versionchanged:: 3.0 + The ``count`` query is more efficient. + + .. versionchanged:: 3.0 + ``max_per_page`` defaults to 100. + """ + return QueryPagination( + query=self, + page=page, + per_page=per_page, + max_per_page=max_per_page, + error_out=error_out, + count=count, + ) diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/record_queries.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/record_queries.py new file mode 100644 index 00000000..e8273be9 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/record_queries.py @@ -0,0 +1,117 @@ +from __future__ import annotations + +import dataclasses +import inspect +import typing as t +from time import perf_counter + +import sqlalchemy as sa +import sqlalchemy.event as sa_event +from flask import current_app +from flask import g +from flask import has_app_context + + +def get_recorded_queries() -> list[_QueryInfo]: + """Get the list of recorded query information for the current session. Queries are + recorded if the config :data:`.SQLALCHEMY_RECORD_QUERIES` is enabled. + + Each query info object has the following attributes: + + ``statement`` + The string of SQL generated by SQLAlchemy with parameter placeholders. + ``parameters`` + The parameters sent with the SQL statement. + ``start_time`` / ``end_time`` + Timing info about when the query started execution and when the results where + returned. Accuracy and value depends on the operating system. + ``duration`` + The time the query took in seconds. + ``location`` + A string description of where in your application code the query was executed. + This may not be possible to calculate, and the format is not stable. + + .. versionchanged:: 3.0 + Renamed from ``get_debug_queries``. + + .. versionchanged:: 3.0 + The info object is a dataclass instead of a tuple. + + .. versionchanged:: 3.0 + The info object attribute ``context`` is renamed to ``location``. + + .. versionchanged:: 3.0 + Not enabled automatically in debug or testing mode. + """ + return g.get("_sqlalchemy_queries", []) # type: ignore[no-any-return] + + +@dataclasses.dataclass +class _QueryInfo: + """Information about an executed query. Returned by :func:`get_recorded_queries`. + + .. versionchanged:: 3.0 + Renamed from ``_DebugQueryTuple``. + + .. versionchanged:: 3.0 + Changed to a dataclass instead of a tuple. + + .. versionchanged:: 3.0 + ``context`` is renamed to ``location``. + """ + + statement: str | None + parameters: t.Any + start_time: float + end_time: float + location: str + + @property + def duration(self) -> float: + return self.end_time - self.start_time + + +def _listen(engine: sa.engine.Engine) -> None: + sa_event.listen(engine, "before_cursor_execute", _record_start, named=True) + sa_event.listen(engine, "after_cursor_execute", _record_end, named=True) + + +def _record_start(context: sa.engine.ExecutionContext, **kwargs: t.Any) -> None: + if not has_app_context(): + return + + context._fsa_start_time = perf_counter() # type: ignore[attr-defined] + + +def _record_end(context: sa.engine.ExecutionContext, **kwargs: t.Any) -> None: + if not has_app_context(): + return + + if "_sqlalchemy_queries" not in g: + g._sqlalchemy_queries = [] + + import_top = current_app.import_name.partition(".")[0] + import_dot = f"{import_top}." + frame = inspect.currentframe() + + while frame: + name = frame.f_globals.get("__name__") + + if name and (name == import_top or name.startswith(import_dot)): + code = frame.f_code + location = f"{code.co_filename}:{frame.f_lineno} ({code.co_name})" + break + + frame = frame.f_back + else: + location = "" + + g._sqlalchemy_queries.append( + _QueryInfo( + statement=context.statement, + parameters=context.parameters, + start_time=context._fsa_start_time, # type: ignore[attr-defined] + end_time=perf_counter(), + location=location, + ) + ) diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/session.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/session.py new file mode 100644 index 00000000..631fffa8 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/session.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +import typing as t + +import sqlalchemy as sa +import sqlalchemy.exc as sa_exc +import sqlalchemy.orm as sa_orm +from flask.globals import app_ctx + +if t.TYPE_CHECKING: + from .extension import SQLAlchemy + + +class Session(sa_orm.Session): + """A SQLAlchemy :class:`~sqlalchemy.orm.Session` class that chooses what engine to + use based on the bind key associated with the metadata associated with the thing + being queried. + + To customize ``db.session``, subclass this and pass it as the ``class_`` key in the + ``session_options`` to :class:`.SQLAlchemy`. + + .. versionchanged:: 3.0 + Renamed from ``SignallingSession``. + """ + + def __init__(self, db: SQLAlchemy, **kwargs: t.Any) -> None: + super().__init__(**kwargs) + self._db = db + self._model_changes: dict[object, tuple[t.Any, str]] = {} + + def get_bind( + self, + mapper: t.Any | None = None, + clause: t.Any | None = None, + bind: sa.engine.Engine | sa.engine.Connection | None = None, + **kwargs: t.Any, + ) -> sa.engine.Engine | sa.engine.Connection: + """Select an engine based on the ``bind_key`` of the metadata associated with + the model or table being queried. If no bind key is set, uses the default bind. + + .. versionchanged:: 3.0.3 + Fix finding the bind for a joined inheritance model. + + .. versionchanged:: 3.0 + The implementation more closely matches the base SQLAlchemy implementation. + + .. versionchanged:: 2.1 + Support joining an external transaction. + """ + if bind is not None: + return bind + + engines = self._db.engines + + if mapper is not None: + try: + mapper = sa.inspect(mapper) + except sa_exc.NoInspectionAvailable as e: + if isinstance(mapper, type): + raise sa_orm.exc.UnmappedClassError(mapper) from e + + raise + + engine = _clause_to_engine(mapper.local_table, engines) + + if engine is not None: + return engine + + if clause is not None: + engine = _clause_to_engine(clause, engines) + + if engine is not None: + return engine + + if None in engines: + return engines[None] + + return super().get_bind(mapper=mapper, clause=clause, bind=bind, **kwargs) + + +def _clause_to_engine( + clause: sa.ClauseElement | None, + engines: t.Mapping[str | None, sa.engine.Engine], +) -> sa.engine.Engine | None: + """If the clause is a table, return the engine associated with the table's + metadata's bind key. + """ + table = None + + if clause is not None: + if isinstance(clause, sa.Table): + table = clause + elif isinstance(clause, sa.UpdateBase) and isinstance(clause.table, sa.Table): + table = clause.table + + if table is not None and "bind_key" in table.metadata.info: + key = table.metadata.info["bind_key"] + + if key not in engines: + raise sa_exc.UnboundExecutionError( + f"Bind key '{key}' is not in 'SQLALCHEMY_BINDS' config." + ) + + return engines[key] + + return None + + +def _app_ctx_id() -> int: + """Get the id of the current Flask application context for the session scope.""" + return id(app_ctx._get_current_object()) # type: ignore[attr-defined] diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/table.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/table.py new file mode 100644 index 00000000..ab08a692 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/table.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +import typing as t + +import sqlalchemy as sa +import sqlalchemy.sql.schema as sa_sql_schema + + +class _Table(sa.Table): + @t.overload + def __init__( + self, + name: str, + *args: sa_sql_schema.SchemaItem, + bind_key: str | None = None, + **kwargs: t.Any, + ) -> None: + ... + + @t.overload + def __init__( + self, + name: str, + metadata: sa.MetaData, + *args: sa_sql_schema.SchemaItem, + **kwargs: t.Any, + ) -> None: + ... + + @t.overload + def __init__( + self, name: str, *args: sa_sql_schema.SchemaItem, **kwargs: t.Any + ) -> None: + ... + + def __init__( + self, name: str, *args: sa_sql_schema.SchemaItem, **kwargs: t.Any + ) -> None: + super().__init__(name, *args, **kwargs) # type: ignore[arg-type] diff --git a/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/track_modifications.py b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/track_modifications.py new file mode 100644 index 00000000..7028b653 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/flask_sqlalchemy/track_modifications.py @@ -0,0 +1,88 @@ +from __future__ import annotations + +import typing as t + +import sqlalchemy as sa +import sqlalchemy.event as sa_event +import sqlalchemy.orm as sa_orm +from flask import current_app +from flask import has_app_context +from flask.signals import Namespace # type: ignore[attr-defined] + +if t.TYPE_CHECKING: + from .session import Session + +_signals = Namespace() + +models_committed = _signals.signal("models-committed") +"""This Blinker signal is sent after the session is committed if there were changed +models in the session. + +The sender is the application that emitted the changes. The receiver is passed the +``changes`` argument with a list of tuples in the form ``(instance, operation)``. +The operations are ``"insert"``, ``"update"``, and ``"delete"``. +""" + +before_models_committed = _signals.signal("before-models-committed") +"""This signal works exactly like :data:`models_committed` but is emitted before the +commit takes place. +""" + + +def _listen(session: sa_orm.scoped_session[Session]) -> None: + sa_event.listen(session, "before_flush", _record_ops, named=True) + sa_event.listen(session, "before_commit", _record_ops, named=True) + sa_event.listen(session, "before_commit", _before_commit) + sa_event.listen(session, "after_commit", _after_commit) + sa_event.listen(session, "after_rollback", _after_rollback) + + +def _record_ops(session: Session, **kwargs: t.Any) -> None: + if not has_app_context(): + return + + if not current_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: + return + + for targets, operation in ( + (session.new, "insert"), + (session.dirty, "update"), + (session.deleted, "delete"), + ): + for target in targets: + state = sa.inspect(target) + key = state.identity_key if state.has_identity else id(target) + session._model_changes[key] = (target, operation) + + +def _before_commit(session: Session) -> None: + if not has_app_context(): + return + + app = current_app._get_current_object() # type: ignore[attr-defined] + + if not app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: + return + + if session._model_changes: + changes = list(session._model_changes.values()) + before_models_committed.send(app, changes=changes) + + +def _after_commit(session: Session) -> None: + if not has_app_context(): + return + + app = current_app._get_current_object() # type: ignore[attr-defined] + + if not app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: + return + + if session._model_changes: + changes = list(session._model_changes.values()) + models_committed.send(app, changes=changes) + session._model_changes.clear() + + +def _after_rollback(session: Session) -> None: + session._model_changes.clear() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/AUTHORS b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/AUTHORS new file mode 100644 index 00000000..42a5c227 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/AUTHORS @@ -0,0 +1,51 @@ +Original Authors +---------------- +* Armin Rigo +* Christian Tismer + +Contributors +------------ +* Al Stone +* Alexander Schmidt +* Alexey Borzenkov +* Andreas Schwab +* Armin Ronacher +* Bin Wang +* Bob Ippolito +* ChangBo Guo +* Christoph Gohlke +* Denis Bilenko +* Dirk Mueller +* Donovan Preston +* Fantix King +* Floris Bruynooghe +* Fredrik Fornwall +* Gerd Woetzel +* Giel van Schijndel +* Gökhan Karabulut +* Gustavo Niemeyer +* Guy Rozendorn +* Hye-Shik Chang +* Jared Kuolt +* Jason Madden +* Josh Snyder +* Kyle Ambroff +* Laszlo Boszormenyi +* Mao Han +* Marc Abramowitz +* Marc Schlaich +* Marcin Bachry +* Matt Madison +* Matt Turner +* Michael Ellerman +* Michael Matz +* Ralf Schmitt +* Robie Basak +* Ronny Pfannschmidt +* Samual M. Rushing +* Tony Bowles +* Tony Breeds +* Trevor Bowen +* Tulio Magno Quites Machado Filho +* Ulrich Weigand +* Victor Stinner diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/LICENSE b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/LICENSE new file mode 100644 index 00000000..b73a4a10 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/LICENSE @@ -0,0 +1,30 @@ +The following files are derived from Stackless Python and are subject to the +same license as Stackless Python: + + src/greenlet/slp_platformselect.h + files in src/greenlet/platform/ directory + +See LICENSE.PSF and http://www.stackless.com/ for details. + +Unless otherwise noted, the files in greenlet have been released under the +following MIT license: + +Copyright (c) Armin Rigo, Christian Tismer and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/LICENSE.PSF b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/LICENSE.PSF new file mode 100644 index 00000000..d3b509a2 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/LICENSE.PSF @@ -0,0 +1,47 @@ +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011 Python Software Foundation; All Rights Reserved" are retained in Python +alone or in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/METADATA new file mode 100644 index 00000000..9071f91c --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/METADATA @@ -0,0 +1,102 @@ +Metadata-Version: 2.1 +Name: greenlet +Version: 3.0.0 +Summary: Lightweight in-process concurrent programming +Home-page: https://greenlet.readthedocs.io/ +Author: Alexey Borzenkov +Author-email: snaury@gmail.com +Maintainer: Jason Madden +Maintainer-email: jason@seecoresoftware.com +License: MIT License +Project-URL: Bug Tracker, https://github.com/python-greenlet/greenlet/issues +Project-URL: Source Code, https://github.com/python-greenlet/greenlet/ +Project-URL: Documentation, https://greenlet.readthedocs.io/ +Keywords: greenlet coroutine concurrency threads cooperative +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Programming Language :: C +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Operating System :: OS Independent +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE +License-File: LICENSE.PSF +License-File: AUTHORS +Provides-Extra: docs +Requires-Dist: Sphinx ; extra == 'docs' +Provides-Extra: test +Requires-Dist: objgraph ; extra == 'test' +Requires-Dist: psutil ; extra == 'test' + +.. This file is included into docs/history.rst + +.. image:: https://github.com/python-greenlet/greenlet/workflows/tests/badge.svg + :target: https://github.com/python-greenlet/greenlet/actions + +Greenlets are lightweight coroutines for in-process concurrent +programming. + +The "greenlet" package is a spin-off of `Stackless`_, a version of +CPython that supports micro-threads called "tasklets". Tasklets run +pseudo-concurrently (typically in a single or a few OS-level threads) +and are synchronized with data exchanges on "channels". + +A "greenlet", on the other hand, is a still more primitive notion of +micro-thread with no implicit scheduling; coroutines, in other words. +This is useful when you want to control exactly when your code runs. +You can build custom scheduled micro-threads on top of greenlet; +however, it seems that greenlets are useful on their own as a way to +make advanced control flow structures. For example, we can recreate +generators; the difference with Python's own generators is that our +generators can call nested functions and the nested functions can +yield values too. (Additionally, you don't need a "yield" keyword. See +the example in `test_generator.py +`_). + +Greenlets are provided as a C extension module for the regular unmodified +interpreter. + +.. _`Stackless`: http://www.stackless.com + + +Who is using Greenlet? +====================== + +There are several libraries that use Greenlet as a more flexible +alternative to Python's built in coroutine support: + + - `Concurrence`_ + - `Eventlet`_ + - `Gevent`_ + +.. _Concurrence: http://opensource.hyves.org/concurrence/ +.. _Eventlet: http://eventlet.net/ +.. _Gevent: http://www.gevent.org/ + +Getting Greenlet +================ + +The easiest way to get Greenlet is to install it with pip:: + + pip install greenlet + + +Source code archives and binary distributions are available on the +python package index at https://pypi.org/project/greenlet + +The source code repository is hosted on github: +https://github.com/python-greenlet/greenlet + +Documentation is available on readthedocs.org: +https://greenlet.readthedocs.io diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/RECORD new file mode 100644 index 00000000..e7f54633 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/RECORD @@ -0,0 +1,116 @@ +../../include/site/python3.9/greenlet/greenlet.h,sha256=sz5pYRSQqedgOt2AMgxLZdTjO-qcr_JMvgiEJR9IAJ8,4755 +greenlet-3.0.0.dist-info/AUTHORS,sha256=swW28t2knVRxRkaEQNZtO7MP9Sgnompb7B6cNgJM8Gk,849 +greenlet-3.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +greenlet-3.0.0.dist-info/LICENSE,sha256=dpgx1uXfrywggC-sz_H6-0wgJd2PYlPfpH_K1Z1NCXk,1434 +greenlet-3.0.0.dist-info/LICENSE.PSF,sha256=5f88I8EQ5JTNfXNsEP2W1GJFe6_soxCEDbZScpjH1Gs,2424 +greenlet-3.0.0.dist-info/METADATA,sha256=ciTeMC6P1oHtJreNQP7ol0VbWtvKF6SdbOmi5BnrvoU,3937 +greenlet-3.0.0.dist-info/RECORD,, +greenlet-3.0.0.dist-info/WHEEL,sha256=2xSj8c4s_gFbWpcImYQptdXS3JLuzC2uK5Om8I_SEKg,100 +greenlet-3.0.0.dist-info/top_level.txt,sha256=YSnRsCRoO61JGlP57o8iKL6rdLWDWuiyKD8ekpWUsDc,9 +greenlet/TBrokenGreenlet.cpp,sha256=YgKaHkQV6_dKBrgS0HKDSqZroskv0IwSZDo4bsiwz3w,1029 +greenlet/TExceptionState.cpp,sha256=Ctg2YfyEYNjOYbteRB_oIJa9lNGyC7N1F3h4XqqQdg8,1367 +greenlet/TGreenlet.cpp,sha256=tJjCH-hSwDEfcy0EmrOBG76wduj5KiU2IdkVhnEwnI8,20495 +greenlet/TGreenletGlobals.cpp,sha256=qLi1icS1UDSbefTkolz9TycEi_GOUblsEznMp0HFywQ,3268 +greenlet/TMainGreenlet.cpp,sha256=FvWtGJDKb64DLy0n-ddcTF6xJDwczPMKSm9mXSsHJKg,3365 +greenlet/TPythonState.cpp,sha256=b2vBapjZTf2WDv9bUSLy_807VmzaZP5rYO6JVY_LBOU,14677 +greenlet/TStackState.cpp,sha256=CMNZJ7YQqh66aM4IgLF7hGpG_vYMykxSPRCdbRxF7_s,6180 +greenlet/TThreadStateDestroy.cpp,sha256=H_VSoXz75rdqS78B54UO6bISao-H2C_AkQpKVVMsdIs,6959 +greenlet/TUserGreenlet.cpp,sha256=IApI-Y761dTgESEHzkbbbH3zSgpI-F3aWFRhC6IiIPU,23341 +greenlet/__init__.py,sha256=DqeE7tGBT0QP4mL-81dofM1I-3ej8X5zynBpbpmkj5Y,1723 +greenlet/__pycache__/__init__.cpython-39.pyc,, +greenlet/_greenlet.cp39-win_amd64.pyd,sha256=I3sJ-4d58uOZAugg00a7VeDVfopR1zgH0RLsVKwBHvA,215552 +greenlet/greenlet.cpp,sha256=1ThdNjkCby1wU8pdiBx9ZJ1CaKbhYjsfrTKH_s2poBQ,48814 +greenlet/greenlet.h,sha256=sz5pYRSQqedgOt2AMgxLZdTjO-qcr_JMvgiEJR9IAJ8,4755 +greenlet/greenlet_allocator.hpp,sha256=kxyWW4Qdwlrc7ufgdb5vd6Y7jhauQ699Kod0mqiO1iM,1582 +greenlet/greenlet_compiler_compat.hpp,sha256=m7wvwrZqBoCQpDMTP-Z7whdXIES7e3AuXBgvPHSsfxg,4140 +greenlet/greenlet_cpython_add_pending.hpp,sha256=apAwIhGlgYrnYn03zWL6Sxy68kltDeb1e0QupZfb3DQ,6043 +greenlet/greenlet_cpython_compat.hpp,sha256=ZpN8gewZeOtd6T-mLidA7zteQ_P4vG8T1za_KPvCijg,3621 +greenlet/greenlet_exceptions.hpp,sha256=Dt8YdaQn8AK9nBfwU9rrDoMlR2Lw5aLTQV6ZAsHmfsw,3683 +greenlet/greenlet_greenlet.hpp,sha256=yyQ0Zi8dKvp-lbwHNQzcfpSvuAyDmKkwBlCZBZeY1w0,25764 +greenlet/greenlet_internal.hpp,sha256=ZXH5zemWCN8wH8zAqMUGycvz_3IulRL6Gf2hZA6CknE,2703 +greenlet/greenlet_refs.hpp,sha256=ECkHKV1CVamtzmWWGKXXMpw8lXLeIzastXM9tfqlsNI,33864 +greenlet/greenlet_slp_switch.hpp,sha256=kM1QHA2iV-gH4cFyN6lfIagHQxvJZjWOVJdIxRE3TlQ,3198 +greenlet/greenlet_thread_state.hpp,sha256=0UwJCNd86ifwM2yDd3QrNmHAECL-eNADHubwiB_XGA4,20614 +greenlet/greenlet_thread_state_dict_cleanup.hpp,sha256=tEN0rI1pZiEsdtr7Oda24gr52fGiHnYTLyM8Vme3Gns,3831 +greenlet/greenlet_thread_support.hpp,sha256=XUJ6ljWjf9OYyuOILiz8e_yHvT3fbaUiHdhiPNQUV4s,867 +greenlet/platform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +greenlet/platform/__pycache__/__init__.cpython-39.pyc,, +greenlet/platform/setup_switch_x64_masm.cmd,sha256=ZpClUJeU0ujEPSTWNSepP0W2f9XiYQKA8QKSoVou8EU,143 +greenlet/platform/switch_aarch64_gcc.h,sha256=GKC0yWNXnbK2X--X6aguRCMj2Tg7hDU1Zkl3RljDvC8,4307 +greenlet/platform/switch_alpha_unix.h,sha256=Z-SvF8JQV3oxWT8JRbL9RFu4gRFxPdJ7cviM8YayMmw,671 +greenlet/platform/switch_amd64_unix.h,sha256=EcSFCBlodEBhqhKjcJqY_5Dn_jn7pKpkJlOvp7gFXLI,2748 +greenlet/platform/switch_arm32_gcc.h,sha256=Z3KkHszdgq6uU4YN3BxvKMG2AdDnovwCCNrqGWZ1Lyo,2479 +greenlet/platform/switch_arm32_ios.h,sha256=mm5_R9aXB92hyxzFRwB71M60H6AlvHjrpTrc72Pz3l8,1892 +greenlet/platform/switch_arm64_masm.asm,sha256=4kpTtfy7rfcr8j1CpJLAK21EtZpGDAJXWRU68HEy5A8,1245 +greenlet/platform/switch_arm64_masm.obj,sha256=DmLnIB_icoEHAz1naue_pJPTZgR9ElM7-Nmztr-o9_U,746 +greenlet/platform/switch_arm64_msvc.h,sha256=RqK5MHLmXI3Q-FQ7tm32KWnbDNZKnkJdq8CR89cz640,398 +greenlet/platform/switch_csky_gcc.h,sha256=kDikyiPpewP71KoBZQO_MukDTXTXBiC7x-hF0_2DL0w,1331 +greenlet/platform/switch_loongarch64_linux.h,sha256=7M-Dhc4Q8tRbJCJhalDLwU6S9Mx8MjmN1RbTDgIvQTM,779 +greenlet/platform/switch_m68k_gcc.h,sha256=VSa6NpZhvyyvF-Q58CTIWSpEDo4FKygOyTz00whctlw,928 +greenlet/platform/switch_mips_unix.h,sha256=E0tYsqc5anDY1BhenU1l8DW-nVHC_BElzLgJw3TGtPk,1426 +greenlet/platform/switch_ppc64_aix.h,sha256=_BL0iyRr3ZA5iPlr3uk9SJ5sNRWGYLrXcZ5z-CE9anE,3860 +greenlet/platform/switch_ppc64_linux.h,sha256=0rriT5XyxPb0GqsSSn_bP9iQsnjsPbBmu0yqo5goSyQ,3815 +greenlet/platform/switch_ppc_aix.h,sha256=pHA4slEjUFP3J3SYm1TAlNPhgb2G_PAtax5cO8BEe1A,2941 +greenlet/platform/switch_ppc_linux.h,sha256=YwrlKUzxlXuiKMQqr6MFAV1bPzWnmvk6X1AqJZEpOWU,2759 +greenlet/platform/switch_ppc_macosx.h,sha256=L8sB0c00V4G2_5cQCG3zX-23DKq3le_Dcj0sUDcACos,2624 +greenlet/platform/switch_ppc_unix.h,sha256=POy4bRBcH74Chfw4viFE9bVlZ-7BaNsFC0NnXr1L2tg,2652 +greenlet/platform/switch_riscv_unix.h,sha256=jX3vC_xZXiUho8tz4J6Ai8BNQB80yLn03fxkoMztVCU,740 +greenlet/platform/switch_s390_unix.h,sha256=RRlGu957ybmq95qNNY4Qw1mcaoT3eBnW5KbVwu48KX8,2763 +greenlet/platform/switch_sparc_sun_gcc.h,sha256=xZish9GsMHBienUbUMsX1-ZZ-as7hs36sVhYIE3ew8Y,2797 +greenlet/platform/switch_x32_unix.h,sha256=nM98PKtzTWc1lcM7TRMUZJzskVdR1C69U1UqZRWX0GE,1509 +greenlet/platform/switch_x64_masm.asm,sha256=nu6n2sWyXuXfpPx40d9YmLfHXUc1sHgeTvX1kUzuvEM,1841 +greenlet/platform/switch_x64_masm.obj,sha256=GNtTNxYdo7idFUYsQv-mrXWgyT5EJ93-9q90lN6svtQ,1078 +greenlet/platform/switch_x64_msvc.h,sha256=LIeasyKo_vHzspdMzMHbosRhrBfKI4BkQOh4qcTHyJw,1805 +greenlet/platform/switch_x86_msvc.h,sha256=TtGOwinbFfnn6clxMNkCz8i6OmgB6kVRrShoF5iT9to,12838 +greenlet/platform/switch_x86_unix.h,sha256=VplW9H0FF0cZHw1DhJdIUs5q6YLS4cwb2nYwjF83R1s,3059 +greenlet/slp_platformselect.h,sha256=JEnia_2HsTwdqvnnEsDxHQqalYvFJqx_CDsqvNUQYe8,3600 +greenlet/tests/__init__.py,sha256=x1pyqvx1TkXbALCFQe6_YAUGstK1RPMje8pdqR8L_rk,8396 +greenlet/tests/__pycache__/__init__.cpython-39.pyc,, +greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-39.pyc,, +greenlet/tests/__pycache__/fail_cpp_exception.cpython-39.pyc,, +greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-39.pyc,, +greenlet/tests/__pycache__/fail_slp_switch.cpython-39.pyc,, +greenlet/tests/__pycache__/fail_switch_three_greenlets.cpython-39.pyc,, +greenlet/tests/__pycache__/fail_switch_three_greenlets2.cpython-39.pyc,, +greenlet/tests/__pycache__/fail_switch_two_greenlets.cpython-39.pyc,, +greenlet/tests/__pycache__/leakcheck.cpython-39.pyc,, +greenlet/tests/__pycache__/test_contextvars.cpython-39.pyc,, +greenlet/tests/__pycache__/test_cpp.cpython-39.pyc,, +greenlet/tests/__pycache__/test_extension_interface.cpython-39.pyc,, +greenlet/tests/__pycache__/test_gc.cpython-39.pyc,, +greenlet/tests/__pycache__/test_generator.cpython-39.pyc,, +greenlet/tests/__pycache__/test_generator_nested.cpython-39.pyc,, +greenlet/tests/__pycache__/test_greenlet.cpython-39.pyc,, +greenlet/tests/__pycache__/test_greenlet_trash.cpython-39.pyc,, +greenlet/tests/__pycache__/test_leaks.cpython-39.pyc,, +greenlet/tests/__pycache__/test_stack_saved.cpython-39.pyc,, +greenlet/tests/__pycache__/test_throw.cpython-39.pyc,, +greenlet/tests/__pycache__/test_tracing.cpython-39.pyc,, +greenlet/tests/__pycache__/test_version.cpython-39.pyc,, +greenlet/tests/__pycache__/test_weakref.cpython-39.pyc,, +greenlet/tests/_test_extension.c,sha256=vkeGA-6oeJcGILsD7oIrT1qZop2GaTOHXiNT7mcSl-0,5773 +greenlet/tests/_test_extension.cp39-win_amd64.pyd,sha256=odOQ7W0MnxVBfCn4eJgvKxKqCdosSnyi_oLd34UDFEU,13312 +greenlet/tests/_test_extension_cpp.cp39-win_amd64.pyd,sha256=Hhpyb7ZZliD4ty-5qdRgtmdf29tmFZ9xbt4E3spcP_o,14848 +greenlet/tests/_test_extension_cpp.cpp,sha256=ovRuyHHtrR5mVCnLOcGQiHtKqaEt5cyTP25t9k_YwU0,6152 +greenlet/tests/fail_clearing_run_switches.py,sha256=o433oA_nUCtOPaMEGc8VEhZIKa71imVHXFw7TsXaP8M,1263 +greenlet/tests/fail_cpp_exception.py,sha256=o_ZbipWikok8Bjc-vjiQvcb5FHh2nVW-McGKMLcMzh0,985 +greenlet/tests/fail_initialstub_already_started.py,sha256=txENn5IyzGx2p-XR1XB7qXmC8JX_4mKDEA8kYBXUQKc,1961 +greenlet/tests/fail_slp_switch.py,sha256=rJBZcZfTWR3e2ERQtPAud6YKShiDsP84PmwOJbp4ey0,524 +greenlet/tests/fail_switch_three_greenlets.py,sha256=zSitV7rkNnaoHYVzAGGLnxz-yPtohXJJzaE8ehFDQ0M,956 +greenlet/tests/fail_switch_three_greenlets2.py,sha256=FPJensn2EJxoropl03JSTVP3kgP33k04h6aDWWozrOk,1285 +greenlet/tests/fail_switch_two_greenlets.py,sha256=1CaI8s3504VbbF1vj1uBYuy-zxBHVzHPIAd1LIc8ONg,817 +greenlet/tests/leakcheck.py,sha256=SgPOQ5_vttOiLDsCOV6wXvvXRxy6noNHqEwctTC5Vpc,11929 +greenlet/tests/test_contextvars.py,sha256=kPHW_QxQopTBxBlDix4Vs9erPp4_Elx5_N02e7_9VCQ,10305 +greenlet/tests/test_cpp.py,sha256=42pJVjNmAYiNR35_TN8YyLrnFW8bzuiOL4XnK1PTmWQ,2448 +greenlet/tests/test_extension_interface.py,sha256=eJ3cwLacdK2WbsrC-4DgeyHdwLRcG4zx7rrkRtqSzC4,3829 +greenlet/tests/test_gc.py,sha256=nf4pgF0eUz8tUYQGPHRPWQZPslztN-FfxvD4EONIpmw,2916 +greenlet/tests/test_generator.py,sha256=tONXiTf98VGm347o1b-810daPiwdla5cbpFg6QI1R1g,1240 +greenlet/tests/test_generator_nested.py,sha256=gMTDwBb5Rx4UcuYYp31YufLONLXruVDaCcKlJ4UIk64,3720 +greenlet/tests/test_greenlet.py,sha256=smMZkBmJVgBHo1Wcwcdt71anFK-XoU5-r_W4oae4e7M,43091 +greenlet/tests/test_greenlet_trash.py,sha256=P6r-3K4fmXX8foW8BVgthuqVKjicHMDvxfK7Al4x028,7508 +greenlet/tests/test_leaks.py,sha256=JmmlMstkKYYCWPk5HsEszGHhkfqDH-26jCk_DYMzINc,17623 +greenlet/tests/test_stack_saved.py,sha256=eyzqNY2VCGuGlxhT_In6TvZ6Okb0AXFZVyBEnK1jDwA,446 +greenlet/tests/test_throw.py,sha256=cowzx8900jpKon8-N4-UwsGH9ox5hfsqtDoVUNat84g,3734 +greenlet/tests/test_tracing.py,sha256=VlwzMU0C1noospZhuUMyB7MHw200emIvGCN_6G2p2ZU,8250 +greenlet/tests/test_version.py,sha256=O9DpAITsOFgiRcjd4odQ7ejmwx_N9Q1zQENVcbtFHIc,1339 +greenlet/tests/test_weakref.py,sha256=NWOaaJOMn83oKdXGoGzGAswb-QRHprlF2f0-4igjZMI,898 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/WHEEL new file mode 100644 index 00000000..ee197dd3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.2) +Root-Is-Purelib: false +Tag: cp39-cp39-win_amd64 + diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/top_level.txt b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/top_level.txt new file mode 100644 index 00000000..46725be4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet-3.0.0.dist-info/top_level.txt @@ -0,0 +1 @@ +greenlet diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/TBrokenGreenlet.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/TBrokenGreenlet.cpp new file mode 100644 index 00000000..11a3beab --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/TBrokenGreenlet.cpp @@ -0,0 +1,45 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +/** + * Implementation of greenlet::UserGreenlet. + * + * Format with: + * clang-format -i --style=file src/greenlet/greenlet.c + * + * + * Fix missing braces with: + * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" +*/ + +#include "greenlet_greenlet.hpp" + +namespace greenlet { + +void* BrokenGreenlet::operator new(size_t UNUSED(count)) +{ + return allocator.allocate(1); +} + + +void BrokenGreenlet::operator delete(void* ptr) +{ + return allocator.deallocate(static_cast(ptr), + 1); +} + +greenlet::PythonAllocator greenlet::BrokenGreenlet::allocator; + +bool +BrokenGreenlet::force_slp_switch_error() const noexcept +{ + return this->_force_slp_switch_error; +} + +UserGreenlet::switchstack_result_t BrokenGreenlet::g_switchstack(void) +{ + if (this->_force_switch_error) { + return switchstack_result_t(-1); + } + return UserGreenlet::g_switchstack(); +} + +}; //namespace greenlet diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/TExceptionState.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/TExceptionState.cpp new file mode 100644 index 00000000..ee6b1917 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/TExceptionState.cpp @@ -0,0 +1,62 @@ +#ifndef GREENLET_EXCEPTION_STATE_CPP +#define GREENLET_EXCEPTION_STATE_CPP + +#include +#include "greenlet_greenlet.hpp" + +namespace greenlet { + + +ExceptionState::ExceptionState() +{ + this->clear(); +} + +void ExceptionState::operator<<(const PyThreadState *const tstate) noexcept +{ + this->exc_info = tstate->exc_info; + this->exc_state = tstate->exc_state; +} + +void ExceptionState::operator>>(PyThreadState *const tstate) noexcept +{ + tstate->exc_state = this->exc_state; + tstate->exc_info = + this->exc_info ? this->exc_info : &tstate->exc_state; + this->clear(); +} + +void ExceptionState::clear() noexcept +{ + this->exc_info = nullptr; + this->exc_state.exc_value = nullptr; +#if !GREENLET_PY311 + this->exc_state.exc_type = nullptr; + this->exc_state.exc_traceback = nullptr; +#endif + this->exc_state.previous_item = nullptr; +} + +int ExceptionState::tp_traverse(visitproc visit, void* arg) noexcept +{ + Py_VISIT(this->exc_state.exc_value); +#if !GREENLET_PY311 + Py_VISIT(this->exc_state.exc_type); + Py_VISIT(this->exc_state.exc_traceback); +#endif + return 0; +} + +void ExceptionState::tp_clear() noexcept +{ + Py_CLEAR(this->exc_state.exc_value); +#if !GREENLET_PY311 + Py_CLEAR(this->exc_state.exc_type); + Py_CLEAR(this->exc_state.exc_traceback); +#endif +} + + +}; // namespace greenlet + +#endif // GREENLET_EXCEPTION_STATE_CPP diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/TGreenlet.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/TGreenlet.cpp new file mode 100644 index 00000000..60acab33 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/TGreenlet.cpp @@ -0,0 +1,610 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +/** + * Implementation of greenlet::Greenlet. + * + * Format with: + * clang-format -i --style=file src/greenlet/greenlet.c + * + * + * Fix missing braces with: + * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" +*/ + +#include "greenlet_internal.hpp" +#include "greenlet_greenlet.hpp" +#include "greenlet_thread_state.hpp" + +#include "TGreenletGlobals.cpp" +#include "TThreadStateDestroy.cpp" + +namespace greenlet { + +Greenlet::Greenlet(PyGreenlet* p) +{ + p ->pimpl = this; +} + +Greenlet::~Greenlet() +{ + // XXX: Can't do this. tp_clear is a virtual function, and by the + // time we're here, we've sliced off our child classes. + //this->tp_clear(); +} + +Greenlet::Greenlet(PyGreenlet* p, const StackState& initial_stack) + : stack_state(initial_stack) +{ + // can't use a delegating constructor because of + // MSVC for Python 2.7 + p->pimpl = this; +} + +bool +Greenlet::force_slp_switch_error() const noexcept +{ + return false; +} + +void +Greenlet::release_args() +{ + this->switch_args.CLEAR(); +} + +/** + * CAUTION: This will allocate memory and may trigger garbage + * collection and arbitrary Python code. + */ +OwnedObject +Greenlet::throw_GreenletExit_during_dealloc(const ThreadState& UNUSED(current_thread_state)) +{ + // If we're killed because we lost all references in the + // middle of a switch, that's ok. Don't reset the args/kwargs, + // we still want to pass them to the parent. + PyErr_SetString(mod_globs->PyExc_GreenletExit, + "Killing the greenlet because all references have vanished."); + // To get here it had to have run before + return this->g_switch(); +} + +inline void +Greenlet::slp_restore_state() noexcept +{ +#ifdef SLP_BEFORE_RESTORE_STATE + SLP_BEFORE_RESTORE_STATE(); +#endif + this->stack_state.copy_heap_to_stack( + this->thread_state()->borrow_current()->stack_state); +} + + +inline int +Greenlet::slp_save_state(char *const stackref) noexcept +{ + // XXX: This used to happen in the middle, before saving, but + // after finding the next owner. Does that matter? This is + // only defined for Sparc/GCC where it flushes register + // windows to the stack (I think) +#ifdef SLP_BEFORE_SAVE_STATE + SLP_BEFORE_SAVE_STATE(); +#endif + return this->stack_state.copy_stack_to_heap(stackref, + this->thread_state()->borrow_current()->stack_state); +} + +/** + * CAUTION: This will allocate memory and may trigger garbage + * collection and arbitrary Python code. + */ +OwnedObject +Greenlet::on_switchstack_or_initialstub_failure( + Greenlet* target, + const Greenlet::switchstack_result_t& err, + const bool target_was_me, + const bool was_initial_stub) +{ + // If we get here, either g_initialstub() + // failed, or g_switchstack() failed. Either one of those + // cases SHOULD leave us in the original greenlet with a valid stack. + if (!PyErr_Occurred()) { + PyErr_SetString( + PyExc_SystemError, + was_initial_stub + ? "Failed to switch stacks into a greenlet for the first time." + : "Failed to switch stacks into a running greenlet."); + } + this->release_args(); + + if (target && !target_was_me) { + target->murder_in_place(); + } + + assert(!err.the_new_current_greenlet); + assert(!err.origin_greenlet); + return OwnedObject(); + +} + +OwnedGreenlet +Greenlet::g_switchstack_success() noexcept +{ + PyThreadState* tstate = PyThreadState_GET(); + // restore the saved state + this->python_state >> tstate; + this->exception_state >> tstate; + + // The thread state hasn't been changed yet. + ThreadState* thread_state = this->thread_state(); + OwnedGreenlet result(thread_state->get_current()); + thread_state->set_current(this->self()); + //assert(thread_state->borrow_current().borrow() == this->_self); + return result; +} + +Greenlet::switchstack_result_t +Greenlet::g_switchstack(void) +{ + // if any of these assertions fail, it's likely because we + // switched away and tried to switch back to us. Early stages of + // switching are not reentrant because we re-use ``this->args()``. + // Switching away would happen if we trigger a garbage collection + // (by just using some Python APIs that happen to allocate Python + // objects) and some garbage had weakref callbacks or __del__ that + // switches (people don't write code like that by hand, but with + // gevent it's possible without realizing it) + assert(this->args() || PyErr_Occurred()); + { /* save state */ + if (this->thread_state()->is_current(this->self())) { + // Hmm, nothing to do. + // TODO: Does this bypass trace events that are + // important? + return switchstack_result_t(0, + this, this->thread_state()->borrow_current()); + } + BorrowedGreenlet current = this->thread_state()->borrow_current(); + PyThreadState* tstate = PyThreadState_GET(); + + current->python_state << tstate; + current->exception_state << tstate; + this->python_state.will_switch_from(tstate); + switching_thread_state = this; + } + assert(this->args() || PyErr_Occurred()); + // If this is the first switch into a greenlet, this will + // return twice, once with 1 in the new greenlet, once with 0 + // in the origin. + int err; + if (this->force_slp_switch_error()) { + err = -1; + } + else { + err = slp_switch(); + } + + if (err < 0) { /* error */ + // Tested by + // test_greenlet.TestBrokenGreenlets.test_failed_to_slp_switch_into_running + // + // It's not clear if it's worth trying to clean up and + // continue here. Failing to switch stacks is a big deal which + // may not be recoverable (who knows what state the stack is in). + // Also, we've stolen references in preparation for calling + // ``g_switchstack_success()`` and we don't have a clean + // mechanism for backing that all out. + Py_FatalError("greenlet: Failed low-level slp_switch(). The stack is probably corrupt."); + } + + // No stack-based variables are valid anymore. + + // But the global is volatile so we can reload it without the + // compiler caching it from earlier. + Greenlet* greenlet_that_switched_in = switching_thread_state; // aka this + switching_thread_state = nullptr; + // except that no stack variables are valid, we would: + // assert(this == greenlet_that_switched_in); + + // switchstack success is where we restore the exception state, + // etc. It returns the origin greenlet because its convenient. + + OwnedGreenlet origin = greenlet_that_switched_in->g_switchstack_success(); + assert(greenlet_that_switched_in->args() || PyErr_Occurred()); + return switchstack_result_t(err, greenlet_that_switched_in, origin); +} + + +inline void +Greenlet::check_switch_allowed() const +{ + // TODO: Make this take a parameter of the current greenlet, + // or current main greenlet, to make the check for + // cross-thread switching cheaper. Surely somewhere up the + // call stack we've already accessed the thread local variable. + + // We expect to always have a main greenlet now; accessing the thread state + // created it. However, if we get here and cleanup has already + // begun because we're a greenlet that was running in a + // (now dead) thread, these invariants will not hold true. In + // fact, accessing `this->thread_state` may not even be possible. + + // If the thread this greenlet was running in is dead, + // we'll still have a reference to a main greenlet, but the + // thread state pointer we have is bogus. + // TODO: Give the objects an API to determine if they belong + // to a dead thread. + + const BorrowedMainGreenlet main_greenlet = this->find_main_greenlet_in_lineage(); + + if (!main_greenlet) { + throw PyErrOccurred(mod_globs->PyExc_GreenletError, + "cannot switch to a garbage collected greenlet"); + } + + if (!main_greenlet->thread_state()) { + throw PyErrOccurred(mod_globs->PyExc_GreenletError, + "cannot switch to a different thread (which happens to have exited)"); + } + + // The main greenlet we found was from the .parent lineage. + // That may or may not have any relationship to the main + // greenlet of the running thread. We can't actually access + // our this->thread_state members to try to check that, + // because it could be in the process of getting destroyed, + // but setting the main_greenlet->thread_state member to NULL + // may not be visible yet. So we need to check against the + // current thread state (once the cheaper checks are out of + // the way) + const BorrowedMainGreenlet current_main_greenlet = GET_THREAD_STATE().state().borrow_main_greenlet(); + if ( + // lineage main greenlet is not this thread's greenlet + current_main_greenlet != main_greenlet + || ( + // atteched to some thread + this->main_greenlet() + // XXX: Same condition as above. Was this supposed to be + // this->main_greenlet()? + && current_main_greenlet != main_greenlet) + // switching into a known dead thread (XXX: which, if we get here, + // is bad, because we just accessed the thread state, which is + // gone!) + || (!current_main_greenlet->thread_state())) { + // CAUTION: This may trigger memory allocations, gc, and + // arbitrary Python code. + throw PyErrOccurred(mod_globs->PyExc_GreenletError, + "cannot switch to a different thread"); + } +} + +const OwnedObject +Greenlet::context() const +{ + using greenlet::PythonStateContext; + OwnedObject result; + + if (this->is_currently_running_in_some_thread()) { + /* Currently running greenlet: context is stored in the thread state, + not the greenlet object. */ + if (GET_THREAD_STATE().state().is_current(this->self())) { + result = PythonStateContext::context(PyThreadState_GET()); + } + else { + throw ValueError( + "cannot get context of a " + "greenlet that is running in a different thread"); + } + } + else { + /* Greenlet is not running: just return context. */ + result = this->python_state.context(); + } + if (!result) { + result = OwnedObject::None(); + } + return result; +} + + +void +Greenlet::context(BorrowedObject given) +{ + using greenlet::PythonStateContext; + if (!given) { + throw AttributeError("can't delete context attribute"); + } + if (given.is_None()) { + /* "Empty context" is stored as NULL, not None. */ + given = nullptr; + } + + //checks type, incrs refcnt + greenlet::refs::OwnedContext context(given); + PyThreadState* tstate = PyThreadState_GET(); + + if (this->is_currently_running_in_some_thread()) { + if (!GET_THREAD_STATE().state().is_current(this->self())) { + throw ValueError("cannot set context of a greenlet" + " that is running in a different thread"); + } + + /* Currently running greenlet: context is stored in the thread state, + not the greenlet object. */ + OwnedObject octx = OwnedObject::consuming(PythonStateContext::context(tstate)); + PythonStateContext::context(tstate, context.relinquish_ownership()); + } + else { + /* Greenlet is not running: just set context. Note that the + greenlet may be dead.*/ + this->python_state.context() = context; + } +} + +/** + * CAUTION: May invoke arbitrary Python code. + * + * Figure out what the result of ``greenlet.switch(arg, kwargs)`` + * should be and transfers ownership of it to the left-hand-side. + * + * If switch() was just passed an arg tuple, then we'll just return that. + * If only keyword arguments were passed, then we'll pass the keyword + * argument dict. Otherwise, we'll create a tuple of (args, kwargs) and + * return both. + * + * CAUTION: This may allocate a new tuple object, which may + * cause the Python garbage collector to run, which in turn may + * run arbitrary Python code that switches. + */ +OwnedObject& operator<<=(OwnedObject& lhs, greenlet::SwitchingArgs& rhs) noexcept +{ + // Because this may invoke arbitrary Python code, which could + // result in switching back to us, we need to get the + // arguments locally on the stack. + assert(rhs); + OwnedObject args = rhs.args(); + OwnedObject kwargs = rhs.kwargs(); + rhs.CLEAR(); + // We shouldn't be called twice for the same switch. + assert(args || kwargs); + assert(!rhs); + + if (!kwargs) { + lhs = args; + } + else if (!PyDict_Size(kwargs.borrow())) { + lhs = args; + } + else if (!PySequence_Length(args.borrow())) { + lhs = kwargs; + } + else { + // PyTuple_Pack allocates memory, may GC, may run arbitrary + // Python code. + lhs = OwnedObject::consuming(PyTuple_Pack(2, args.borrow(), kwargs.borrow())); + } + return lhs; +} + +static OwnedObject +g_handle_exit(const OwnedObject& greenlet_result) +{ + if (!greenlet_result && mod_globs->PyExc_GreenletExit.PyExceptionMatches()) { + /* catch and ignore GreenletExit */ + PyErrFetchParam val; + PyErr_Fetch(PyErrFetchParam(), val, PyErrFetchParam()); + if (!val) { + return OwnedObject::None(); + } + return OwnedObject(val); + } + + if (greenlet_result) { + // package the result into a 1-tuple + // PyTuple_Pack increments the reference of its arguments, + // so we always need to decref the greenlet result; + // the owner will do that. + return OwnedObject::consuming(PyTuple_Pack(1, greenlet_result.borrow())); + } + + return OwnedObject(); +} + + + +/** + * May run arbitrary Python code. + */ +OwnedObject +Greenlet::g_switch_finish(const switchstack_result_t& err) +{ + assert(err.the_new_current_greenlet == this); + + ThreadState& state = *this->thread_state(); + // Because calling the trace function could do arbitrary things, + // including switching away from this greenlet and then maybe + // switching back, we need to capture the arguments now so that + // they don't change. + OwnedObject result; + if (this->args()) { + result <<= this->args(); + } + else { + assert(PyErr_Occurred()); + } + assert(!this->args()); + try { + // Our only caller handles the bad error case + assert(err.status >= 0); + assert(state.borrow_current() == this->self()); + if (OwnedObject tracefunc = state.get_tracefunc()) { + assert(result || PyErr_Occurred()); + g_calltrace(tracefunc, + result ? mod_globs->event_switch : mod_globs->event_throw, + err.origin_greenlet, + this->self()); + } + // The above could have invoked arbitrary Python code, but + // it couldn't switch back to this object and *also* + // throw an exception, so the args won't have changed. + + if (PyErr_Occurred()) { + // We get here if we fell of the end of the run() function + // raising an exception. The switch itself was + // successful, but the function raised. + // valgrind reports that memory allocated here can still + // be reached after a test run. + throw PyErrOccurred::from_current(); + } + return result; + } + catch (const PyErrOccurred&) { + /* Turn switch errors into switch throws */ + /* Turn trace errors into switch throws */ + this->release_args(); + throw; + } +} + +void +Greenlet::g_calltrace(const OwnedObject& tracefunc, + const greenlet::refs::ImmortalEventName& event, + const BorrowedGreenlet& origin, + const BorrowedGreenlet& target) +{ + PyErrPieces saved_exc; + try { + TracingGuard tracing_guard; + // TODO: We have saved the active exception (if any) that's + // about to be raised. In the 'throw' case, we could provide + // the exception to the tracefunction, which seems very helpful. + tracing_guard.CallTraceFunction(tracefunc, event, origin, target); + } + catch (const PyErrOccurred&) { + // In case of exceptions trace function is removed, + // and any existing exception is replaced with the tracing + // exception. + GET_THREAD_STATE().state().set_tracefunc(Py_None); + throw; + } + + saved_exc.PyErrRestore(); + assert( + (event == mod_globs->event_throw && PyErr_Occurred()) + || (event == mod_globs->event_switch && !PyErr_Occurred()) + ); +} + +void +Greenlet::murder_in_place() +{ + if (this->active()) { + assert(!this->is_currently_running_in_some_thread()); + this->deactivate_and_free(); + } +} + +inline void +Greenlet::deactivate_and_free() +{ + if (!this->active()) { + return; + } + // Throw away any saved stack. + this->stack_state = StackState(); + assert(!this->stack_state.active()); + // Throw away any Python references. + // We're holding a borrowed reference to the last + // frame we executed. Since we borrowed it, the + // normal traversal, clear, and dealloc functions + // ignore it, meaning it leaks. (The thread state + // object can't find it to clear it when that's + // deallocated either, because by definition if we + // got an object on this list, it wasn't + // running and the thread state doesn't have + // this frame.) + // So here, we *do* clear it. + this->python_state.tp_clear(true); +} + +bool +Greenlet::belongs_to_thread(const ThreadState* thread_state) const +{ + if (!this->thread_state() // not running anywhere, or thread + // exited + || !thread_state) { // same, or there is no thread state. + return false; + } + return true; +} + + +void +Greenlet::deallocing_greenlet_in_thread(const ThreadState* current_thread_state) +{ + /* Cannot raise an exception to kill the greenlet if + it is not running in the same thread! */ + if (this->belongs_to_thread(current_thread_state)) { + assert(current_thread_state); + // To get here it had to have run before + /* Send the greenlet a GreenletExit exception. */ + + // We don't care about the return value, only whether an + // exception happened. + this->throw_GreenletExit_during_dealloc(*current_thread_state); + return; + } + + // Not the same thread! Temporarily save the greenlet + // into its thread's deleteme list, *if* it exists. + // If that thread has already exited, and processed its pending + // cleanup, we'll never be able to clean everything up: we won't + // be able to raise an exception. + // That's mostly OK! Since we can't add it to a list, our refcount + // won't increase, and we'll go ahead with the DECREFs later. + ThreadState *const thread_state = this->thread_state(); + if (thread_state) { + thread_state->delete_when_thread_running(this->self()); + } + else { + // The thread is dead, we can't raise an exception. + // We need to make it look non-active, though, so that dealloc + // finishes killing it. + this->deactivate_and_free(); + } + return; +} + + +int +Greenlet::tp_traverse(visitproc visit, void* arg) +{ + + int result; + if ((result = this->exception_state.tp_traverse(visit, arg)) != 0) { + return result; + } + //XXX: This is ugly. But so is handling everything having to do + //with the top frame. + bool visit_top_frame = this->was_running_in_dead_thread(); + // When true, the thread is dead. Our implicit weak reference to the + // frame is now all that's left; we consider ourselves to + // strongly own it now. + if ((result = this->python_state.tp_traverse(visit, arg, visit_top_frame)) != 0) { + return result; + } + return 0; +} + +int +Greenlet::tp_clear() +{ + bool own_top_frame = this->was_running_in_dead_thread(); + this->exception_state.tp_clear(); + this->python_state.tp_clear(own_top_frame); + return 0; +} + +bool Greenlet::is_currently_running_in_some_thread() const +{ + return this->stack_state.active() && !this->python_state.top_frame(); +} + + +}; // namespace greenlet diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/TGreenletGlobals.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/TGreenletGlobals.cpp new file mode 100644 index 00000000..c71c963b --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/TGreenletGlobals.cpp @@ -0,0 +1,94 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +/** + * Implementation of GreenletGlobals. + * + * Format with: + * clang-format -i --style=file src/greenlet/greenlet.c + * + * + * Fix missing braces with: + * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" +*/ +#ifndef T_GREENLET_GLOBALS +#define T_GREENLET_GLOBALS + +#include "greenlet_refs.hpp" +#include "greenlet_exceptions.hpp" +#include "greenlet_thread_support.hpp" +#include "greenlet_thread_state.hpp" + +namespace greenlet { + +// This encapsulates what were previously module global "constants" +// established at init time. +// This is a step towards Python3 style module state that allows +// reloading. +// +// In an earlier iteration of this code, we used placement new to be +// able to allocate this object statically still, so that references +// to its members don't incur an extra pointer indirection. +// But under some scenarios, that could result in crashes at +// shutdown because apparently the destructor was getting run twice? +class GreenletGlobals +{ + +public: + const greenlet::refs::ImmortalEventName event_switch; + const greenlet::refs::ImmortalEventName event_throw; + const greenlet::refs::ImmortalException PyExc_GreenletError; + const greenlet::refs::ImmortalException PyExc_GreenletExit; + const greenlet::refs::ImmortalObject empty_tuple; + const greenlet::refs::ImmortalObject empty_dict; + const greenlet::refs::ImmortalString str_run; + Mutex* const thread_states_to_destroy_lock; + greenlet::cleanup_queue_t thread_states_to_destroy; + + GreenletGlobals() : + event_switch("switch"), + event_throw("throw"), + PyExc_GreenletError("greenlet.error"), + PyExc_GreenletExit("greenlet.GreenletExit", PyExc_BaseException), + empty_tuple(Require(PyTuple_New(0))), + empty_dict(Require(PyDict_New())), + str_run("run"), + thread_states_to_destroy_lock(new Mutex()) + {} + + ~GreenletGlobals() + { + // This object is (currently) effectively immortal, and not + // just because of those placement new tricks; if we try to + // deallocate the static object we allocated, and overwrote, + // we would be doing so at C++ teardown time, which is after + // the final Python GIL is released, and we can't use the API + // then. + // (The members will still be destructed, but they also don't + // do any deallocation.) + } + + void queue_to_destroy(ThreadState* ts) const + { + // we're currently accessed through a static const object, + // implicitly marking our members as const, so code can't just + // call push_back (or pop_back) without casting away the + // const. + // + // Do that for callers. + greenlet::cleanup_queue_t& q = const_cast(this->thread_states_to_destroy); + q.push_back(ts); + } + + ThreadState* take_next_to_destroy() const + { + greenlet::cleanup_queue_t& q = const_cast(this->thread_states_to_destroy); + ThreadState* result = q.back(); + q.pop_back(); + return result; + } +}; + +}; // namespace greenlet + +static const greenlet::GreenletGlobals* mod_globs; + +#endif // T_GREENLET_GLOBALS diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/TMainGreenlet.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/TMainGreenlet.cpp new file mode 100644 index 00000000..c33aadb3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/TMainGreenlet.cpp @@ -0,0 +1,155 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +/** + * Implementation of greenlet::MainGreenlet. + * + * Format with: + * clang-format -i --style=file src/greenlet/greenlet.c + * + * + * Fix missing braces with: + * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" +*/ + +#include "greenlet_greenlet.hpp" +#include "greenlet_thread_state.hpp" + + +// Protected by the GIL. Incremented when we create a main greenlet, +// in a new thread, decremented when it is destroyed. +static Py_ssize_t G_TOTAL_MAIN_GREENLETS; + +namespace greenlet { +greenlet::PythonAllocator MainGreenlet::allocator; + +void* MainGreenlet::operator new(size_t UNUSED(count)) +{ + return allocator.allocate(1); +} + + +void MainGreenlet::operator delete(void* ptr) +{ + return allocator.deallocate(static_cast(ptr), + 1); +} + + +MainGreenlet::MainGreenlet(PyGreenlet* p, ThreadState* state) + : Greenlet(p, StackState::make_main()), + _self(p), + _thread_state(state) +{ + G_TOTAL_MAIN_GREENLETS++; +} + +MainGreenlet::~MainGreenlet() +{ + G_TOTAL_MAIN_GREENLETS--; + this->tp_clear(); +} + +ThreadState* +MainGreenlet::thread_state() const noexcept +{ + return this->_thread_state; +} + +void +MainGreenlet::thread_state(ThreadState* t) noexcept +{ + assert(!t); + this->_thread_state = t; +} + +BorrowedGreenlet +MainGreenlet::self() const noexcept +{ + return BorrowedGreenlet(this->_self.borrow()); +} + + +const BorrowedMainGreenlet +MainGreenlet::main_greenlet() const +{ + return this->_self; +} + +BorrowedMainGreenlet +MainGreenlet::find_main_greenlet_in_lineage() const +{ + return BorrowedMainGreenlet(this->_self); +} + +bool +MainGreenlet::was_running_in_dead_thread() const noexcept +{ + return !this->_thread_state; +} + +OwnedObject +MainGreenlet::g_switch() +{ + try { + this->check_switch_allowed(); + } + catch (const PyErrOccurred&) { + this->release_args(); + throw; + } + + switchstack_result_t err = this->g_switchstack(); + if (err.status < 0) { + // XXX: This code path is untested, but it is shared + // with the UserGreenlet path that is tested. + return this->on_switchstack_or_initialstub_failure( + this, + err, + true, // target was me + false // was initial stub + ); + } + + return err.the_new_current_greenlet->g_switch_finish(err); +} + +int +MainGreenlet::tp_traverse(visitproc visit, void* arg) +{ + if (this->_thread_state) { + // we've already traversed main, (self), don't do it again. + int result = this->_thread_state->tp_traverse(visit, arg, false); + if (result) { + return result; + } + } + return Greenlet::tp_traverse(visit, arg); +} + +const OwnedObject& +MainGreenlet::run() const +{ + throw AttributeError("Main greenlets do not have a run attribute."); +} + +void +MainGreenlet::run(const BorrowedObject UNUSED(nrun)) +{ + throw AttributeError("Main greenlets do not have a run attribute."); +} + +void +MainGreenlet::parent(const BorrowedObject raw_new_parent) +{ + if (!raw_new_parent) { + throw AttributeError("can't delete attribute"); + } + throw AttributeError("cannot set the parent of a main greenlet"); +} + +const OwnedGreenlet +MainGreenlet::parent() const +{ + return OwnedGreenlet(); // null becomes None +} + +}; // namespace greenlet diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/TPythonState.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/TPythonState.cpp new file mode 100644 index 00000000..9d57155c --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/TPythonState.cpp @@ -0,0 +1,368 @@ +#ifndef GREENLET_PYTHON_STATE_CPP +#define GREENLET_PYTHON_STATE_CPP + +#include +#include "greenlet_greenlet.hpp" + +namespace greenlet { + +PythonState::PythonState() + : _top_frame() +#if GREENLET_USE_CFRAME + ,cframe(nullptr) + ,use_tracing(0) +#endif +#if GREENLET_PY312 + ,py_recursion_depth(0) + ,c_recursion_depth(0) +#else + ,recursion_depth(0) +#endif + ,trash_delete_nesting(0) +#if GREENLET_PY311 + ,current_frame(nullptr) + ,datastack_chunk(nullptr) + ,datastack_top(nullptr) + ,datastack_limit(nullptr) +#endif +#if GREENLET_PY312 + ,_prev_frame(nullptr) +#endif +{ +#if GREENLET_USE_CFRAME + /* + The PyThreadState->cframe pointer usually points to memory on + the stack, alloceted in a call into PyEval_EvalFrameDefault. + + Initially, before any evaluation begins, it points to the + initial PyThreadState object's ``root_cframe`` object, which is + statically allocated for the lifetime of the thread. + + A greenlet can last for longer than a call to + PyEval_EvalFrameDefault, so we can't set its ``cframe`` pointer + to be the current ``PyThreadState->cframe``; nor could we use + one from the greenlet parent for the same reason. Yet a further + no: we can't allocate one scoped to the greenlet and then + destroy it when the greenlet is deallocated, because inside the + interpreter the _PyCFrame objects form a linked list, and that too + can result in accessing memory beyond its dynamic lifetime (if + the greenlet doesn't actually finish before it dies, its entry + could still be in the list). + + Using the ``root_cframe`` is problematic, though, because its + members are never modified by the interpreter and are set to 0, + meaning that its ``use_tracing`` flag is never updated. We don't + want to modify that value in the ``root_cframe`` ourself: it + *shouldn't* matter much because we should probably never get + back to the point where that's the only cframe on the stack; + even if it did matter, the major consequence of an incorrect + value for ``use_tracing`` is that if its true the interpreter + does some extra work --- however, it's just good code hygiene. + + Our solution: before a greenlet runs, after its initial + creation, it uses the ``root_cframe`` just to have something to + put there. However, once the greenlet is actually switched to + for the first time, ``g_initialstub`` (which doesn't actually + "return" while the greenlet is running) stores a new _PyCFrame on + its local stack, and copies the appropriate values from the + currently running _PyCFrame; this is then made the _PyCFrame for the + newly-minted greenlet. ``g_initialstub`` then proceeds to call + ``glet.run()``, which results in ``PyEval_...`` adding the + _PyCFrame to the list. Switches continue as normal. Finally, when + the greenlet finishes, the call to ``glet.run()`` returns and + the _PyCFrame is taken out of the linked list and the stack value + is now unused and free to expire. + + XXX: I think we can do better. If we're deallocing in the same + thread, can't we traverse the list and unlink our frame? + Can we just keep a reference to the thread state in case we + dealloc in another thread? (Is that even possible if we're still + running and haven't returned from g_initialstub?) + */ + this->cframe = &PyThreadState_GET()->root_cframe; +#endif +} + + +inline void PythonState::may_switch_away() noexcept +{ +#if GREENLET_PY311 + // PyThreadState_GetFrame is probably going to have to allocate a + // new frame object. That may trigger garbage collection. Because + // we call this during the early phases of a switch (it doesn't + // matter to which greenlet, as this has a global effect), if a GC + // triggers a switch away, two things can happen, both bad: + // - We might not get switched back to, halting forward progress. + // this is pathological, but possible. + // - We might get switched back to with a different set of + // arguments or a throw instead of a switch. That would corrupt + // our state (specifically, PyErr_Occurred() and this->args() + // would no longer agree). + // + // Thus, when we call this API, we need to have GC disabled. + // This method serves as a bottleneck we call when maybe beginning + // a switch. In this way, it is always safe -- no risk of GC -- to + // use ``_GetFrame()`` whenever we need to, just as it was in + // <=3.10 (because subsequent calls will be cached and not + // allocate memory). + + GCDisabledGuard no_gc; + Py_XDECREF(PyThreadState_GetFrame(PyThreadState_GET())); +#endif +} + +void PythonState::operator<<(const PyThreadState *const tstate) noexcept +{ + this->_context.steal(tstate->context); +#if GREENLET_USE_CFRAME + /* + IMPORTANT: ``cframe`` is a pointer into the STACK. Thus, because + the call to ``slp_switch()`` changes the contents of the stack, + you cannot read from ``ts_current->cframe`` after that call and + necessarily get the same values you get from reading it here. + Anything you need to restore from now to then must be saved in a + global/threadlocal variable (because we can't use stack + variables here either). For things that need to persist across + the switch, use `will_switch_from`. + */ + this->cframe = tstate->cframe; + #if !GREENLET_PY312 + this->use_tracing = tstate->cframe->use_tracing; + #endif +#endif // GREENLET_USE_CFRAME +#if GREENLET_PY311 + #if GREENLET_PY312 + this->py_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; + this->c_recursion_depth = C_RECURSION_LIMIT - tstate->c_recursion_remaining; + #else // not 312 + this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining; + #endif // GREENLET_PY312 + this->current_frame = tstate->cframe->current_frame; + this->datastack_chunk = tstate->datastack_chunk; + this->datastack_top = tstate->datastack_top; + this->datastack_limit = tstate->datastack_limit; + + PyFrameObject *frame = PyThreadState_GetFrame((PyThreadState *)tstate); + Py_XDECREF(frame); // PyThreadState_GetFrame gives us a new + // reference. + this->_top_frame.steal(frame); + #if GREENLET_PY312 + if (frame) { + this->_prev_frame = frame->f_frame->previous; + frame->f_frame->previous = nullptr; + } + #endif + #if GREENLET_PY312 + this->trash_delete_nesting = tstate->trash.delete_nesting; + #else // not 312 + this->trash_delete_nesting = tstate->trash_delete_nesting; + #endif // GREENLET_PY312 +#else // Not 311 + this->recursion_depth = tstate->recursion_depth; + this->_top_frame.steal(tstate->frame); + this->trash_delete_nesting = tstate->trash_delete_nesting; +#endif // GREENLET_PY311 +} + + +void PythonState::operator>>(PyThreadState *const tstate) noexcept +{ + tstate->context = this->_context.relinquish_ownership(); + /* Incrementing this value invalidates the contextvars cache, + which would otherwise remain valid across switches */ + tstate->context_ver++; +#if GREENLET_USE_CFRAME + tstate->cframe = this->cframe; + /* + If we were tracing, we need to keep tracing. + There should never be the possibility of hitting the + root_cframe here. See note above about why we can't + just copy this from ``origin->cframe->use_tracing``. + */ + #if !GREENLET_PY312 + tstate->cframe->use_tracing = this->use_tracing; + #endif +#endif // GREENLET_USE_CFRAME +#if GREENLET_PY311 + #if GREENLET_PY312 + tstate->py_recursion_remaining = tstate->py_recursion_limit - this->py_recursion_depth; + tstate->c_recursion_remaining = C_RECURSION_LIMIT - this->c_recursion_depth; + // We're just going to throw this object away anyway, go ahead and + // do it now. + PyFrameObject* frame = this->_top_frame.relinquish_ownership(); + if (frame && frame->f_frame) { + frame->f_frame->previous = this->_prev_frame; + } + this->_prev_frame = nullptr; + #else // \/ 3.11 + tstate->recursion_remaining = tstate->recursion_limit - this->recursion_depth; + #endif // GREENLET_PY312 + tstate->cframe->current_frame = this->current_frame; + tstate->datastack_chunk = this->datastack_chunk; + tstate->datastack_top = this->datastack_top; + tstate->datastack_limit = this->datastack_limit; + this->_top_frame.relinquish_ownership(); + #if GREENLET_PY312 + tstate->trash.delete_nesting = this->trash_delete_nesting; + #else // not 3.12 + tstate->trash_delete_nesting = this->trash_delete_nesting; + #endif // GREENLET_PY312 +#else // not 3.11 + tstate->frame = this->_top_frame.relinquish_ownership(); + tstate->recursion_depth = this->recursion_depth; + tstate->trash_delete_nesting = this->trash_delete_nesting; +#endif // GREENLET_PY311 +} + +inline void PythonState::will_switch_from(PyThreadState *const origin_tstate) noexcept +{ +#if GREENLET_USE_CFRAME && !GREENLET_PY312 + // The weird thing is, we don't actually save this for an + // effect on the current greenlet, it's saved for an + // effect on the target greenlet. That is, we want + // continuity of this setting across the greenlet switch. + this->use_tracing = origin_tstate->cframe->use_tracing; +#endif +} + +void PythonState::set_initial_state(const PyThreadState* const tstate) noexcept +{ + this->_top_frame = nullptr; +#if GREENLET_PY312 + this->py_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; + // XXX: TODO: Comment from a reviewer: + // Should this be ``C_RECURSION_LIMIT - tstate->c_recursion_remaining``? + // But to me it looks more like that might not be the right + // initialization either? + this->c_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; +#elif GREENLET_PY311 + this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining; +#else + this->recursion_depth = tstate->recursion_depth; +#endif +} +// TODO: Better state management about when we own the top frame. +int PythonState::tp_traverse(visitproc visit, void* arg, bool own_top_frame) noexcept +{ + Py_VISIT(this->_context.borrow()); + if (own_top_frame) { + Py_VISIT(this->_top_frame.borrow()); + } + return 0; +} + +void PythonState::tp_clear(bool own_top_frame) noexcept +{ + PythonStateContext::tp_clear(); + // If we get here owning a frame, + // we got dealloc'd without being finished. We may or may not be + // in the same thread. + if (own_top_frame) { + this->_top_frame.CLEAR(); + } +} + +#if GREENLET_USE_CFRAME +void PythonState::set_new_cframe(_PyCFrame& frame) noexcept +{ + frame = *PyThreadState_GET()->cframe; + /* Make the target greenlet refer to the stack value. */ + this->cframe = &frame; + /* + And restore the link to the previous frame so this one gets + unliked appropriately. + */ + this->cframe->previous = &PyThreadState_GET()->root_cframe; +} +#endif + +const PythonState::OwnedFrame& PythonState::top_frame() const noexcept +{ + return this->_top_frame; +} + +void PythonState::did_finish(PyThreadState* tstate) noexcept +{ +#if GREENLET_PY311 + // See https://github.com/gevent/gevent/issues/1924 and + // https://github.com/python-greenlet/greenlet/issues/328. In + // short, Python 3.11 allocates memory for frames as a sort of + // linked list that's kept as part of PyThreadState in the + // ``datastack_chunk`` member and friends. These are saved and + // restored as part of switching greenlets. + // + // When we initially switch to a greenlet, we set those to NULL. + // That causes the frame management code to treat this like a + // brand new thread and start a fresh list of chunks, beginning + // with a new "root" chunk. As we make calls in this greenlet, + // those chunks get added, and as calls return, they get popped. + // But the frame code (pystate.c) is careful to make sure that the + // root chunk never gets popped. + // + // Thus, when a greenlet exits for the last time, there will be at + // least a single root chunk that we must be responsible for + // deallocating. + // + // The complex part is that these chunks are allocated and freed + // using ``_PyObject_VirtualAlloc``/``Free``. Those aren't public + // functions, and they aren't exported for linking. It so happens + // that we know they are just thin wrappers around the Arena + // allocator, so we can use that directly to deallocate in a + // compatible way. + // + // CAUTION: Check this implementation detail on every major version. + // + // It might be nice to be able to do this in our destructor, but + // can we be sure that no one else is using that memory? Plus, as + // described below, our pointers may not even be valid anymore. As + // a special case, there is one time that we know we can do this, + // and that's from the destructor of the associated UserGreenlet + // (NOT main greenlet) + PyObjectArenaAllocator alloc; + _PyStackChunk* chunk = nullptr; + if (tstate) { + // We really did finish, we can never be switched to again. + chunk = tstate->datastack_chunk; + // Unfortunately, we can't do much sanity checking. Our + // this->datastack_chunk pointer is out of date (evaluation may + // have popped down through it already) so we can't verify that + // we deallocate it. I don't think we can even check datastack_top + // for the same reason. + + PyObject_GetArenaAllocator(&alloc); + tstate->datastack_chunk = nullptr; + tstate->datastack_limit = nullptr; + tstate->datastack_top = nullptr; + + } + else if (this->datastack_chunk) { + // The UserGreenlet (NOT the main greenlet!) is being deallocated. If we're + // still holding a stack chunk, it's garbage because we know + // we can never switch back to let cPython clean it up. + // Because the last time we got switched away from, and we + // haven't run since then, we know our chain is valid and can + // be dealloced. + chunk = this->datastack_chunk; + PyObject_GetArenaAllocator(&alloc); + } + + if (alloc.free && chunk) { + // In case the arena mechanism has been torn down already. + while (chunk) { + _PyStackChunk *prev = chunk->previous; + chunk->previous = nullptr; + alloc.free(alloc.ctx, chunk, chunk->size); + chunk = prev; + } + } + + this->datastack_chunk = nullptr; + this->datastack_limit = nullptr; + this->datastack_top = nullptr; +#endif +} + + +}; // namespace greenlet + +#endif // GREENLET_PYTHON_STATE_CPP diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/TStackState.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/TStackState.cpp new file mode 100644 index 00000000..5ce1ea19 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/TStackState.cpp @@ -0,0 +1,232 @@ +#ifndef GREENLET_STACK_STATE_CPP +#define GREENLET_STACK_STATE_CPP + +#include "greenlet_greenlet.hpp" + +namespace greenlet { + +#ifdef GREENLET_USE_STDIO +#include +using std::cerr; +using std::endl; + +std::ostream& operator<<(std::ostream& os, const StackState& s) +{ + os << "StackState(stack_start=" << (void*)s._stack_start + << ", stack_stop=" << (void*)s.stack_stop + << ", stack_copy=" << (void*)s.stack_copy + << ", stack_saved=" << s._stack_saved + << ", stack_prev=" << s.stack_prev + << ", addr=" << &s + << ")"; + return os; +} +#endif + +StackState::StackState(void* mark, StackState& current) + : _stack_start(nullptr), + stack_stop((char*)mark), + stack_copy(nullptr), + _stack_saved(0), + /* Skip a dying greenlet */ + stack_prev(current._stack_start + ? ¤t + : current.stack_prev) +{ +} + +StackState::StackState() + : _stack_start(nullptr), + stack_stop(nullptr), + stack_copy(nullptr), + _stack_saved(0), + stack_prev(nullptr) +{ +} + +StackState::StackState(const StackState& other) +// can't use a delegating constructor because of +// MSVC for Python 2.7 + : _stack_start(nullptr), + stack_stop(nullptr), + stack_copy(nullptr), + _stack_saved(0), + stack_prev(nullptr) +{ + this->operator=(other); +} + +StackState& StackState::operator=(const StackState& other) +{ + if (&other == this) { + return *this; + } + if (other._stack_saved) { + throw std::runtime_error("Refusing to steal memory."); + } + + //If we have memory allocated, dispose of it + this->free_stack_copy(); + + this->_stack_start = other._stack_start; + this->stack_stop = other.stack_stop; + this->stack_copy = other.stack_copy; + this->_stack_saved = other._stack_saved; + this->stack_prev = other.stack_prev; + return *this; +} + +inline void StackState::free_stack_copy() noexcept +{ + PyMem_Free(this->stack_copy); + this->stack_copy = nullptr; + this->_stack_saved = 0; +} + +inline void StackState::copy_heap_to_stack(const StackState& current) noexcept +{ + + /* Restore the heap copy back into the C stack */ + if (this->_stack_saved != 0) { + memcpy(this->_stack_start, this->stack_copy, this->_stack_saved); + this->free_stack_copy(); + } + StackState* owner = const_cast(¤t); + if (!owner->_stack_start) { + owner = owner->stack_prev; /* greenlet is dying, skip it */ + } + while (owner && owner->stack_stop <= this->stack_stop) { + // cerr << "\tOwner: " << owner << endl; + owner = owner->stack_prev; /* find greenlet with more stack */ + } + this->stack_prev = owner; + // cerr << "\tFinished with: " << *this << endl; +} + +inline int StackState::copy_stack_to_heap_up_to(const char* const stop) noexcept +{ + /* Save more of g's stack into the heap -- at least up to 'stop' + g->stack_stop |________| + | | + | __ stop . . . . . + | | ==> . . + |________| _______ + | | | | + | | | | + g->stack_start | | |_______| g->stack_copy + */ + intptr_t sz1 = this->_stack_saved; + intptr_t sz2 = stop - this->_stack_start; + assert(this->_stack_start); + if (sz2 > sz1) { + char* c = (char*)PyMem_Realloc(this->stack_copy, sz2); + if (!c) { + PyErr_NoMemory(); + return -1; + } + memcpy(c + sz1, this->_stack_start + sz1, sz2 - sz1); + this->stack_copy = c; + this->_stack_saved = sz2; + } + return 0; +} + +inline int StackState::copy_stack_to_heap(char* const stackref, + const StackState& current) noexcept +{ + /* must free all the C stack up to target_stop */ + const char* const target_stop = this->stack_stop; + + StackState* owner = const_cast(¤t); + assert(owner->_stack_saved == 0); // everything is present on the stack + if (!owner->_stack_start) { + owner = owner->stack_prev; /* not saved if dying */ + } + else { + owner->_stack_start = stackref; + } + + while (owner->stack_stop < target_stop) { + /* ts_current is entierely within the area to free */ + if (owner->copy_stack_to_heap_up_to(owner->stack_stop)) { + return -1; /* XXX */ + } + owner = owner->stack_prev; + } + if (owner != this) { + if (owner->copy_stack_to_heap_up_to(target_stop)) { + return -1; /* XXX */ + } + } + return 0; +} + +inline bool StackState::started() const noexcept +{ + return this->stack_stop != nullptr; +} + +inline bool StackState::main() const noexcept +{ + return this->stack_stop == (char*)-1; +} + +inline bool StackState::active() const noexcept +{ + return this->_stack_start != nullptr; +} + +inline void StackState::set_active() noexcept +{ + assert(this->_stack_start == nullptr); + this->_stack_start = (char*)1; +} + +inline void StackState::set_inactive() noexcept +{ + this->_stack_start = nullptr; + // XXX: What if we still have memory out there? + // That case is actually triggered by + // test_issue251_issue252_explicit_reference_not_collectable (greenlet.tests.test_leaks.TestLeaks) + // and + // test_issue251_issue252_need_to_collect_in_background + // (greenlet.tests.test_leaks.TestLeaks) + // + // Those objects never get deallocated, so the destructor never + // runs. + // It *seems* safe to clean up the memory here? + if (this->_stack_saved) { + this->free_stack_copy(); + } +} + +inline intptr_t StackState::stack_saved() const noexcept +{ + return this->_stack_saved; +} + +inline char* StackState::stack_start() const noexcept +{ + return this->_stack_start; +} + + +inline StackState StackState::make_main() noexcept +{ + StackState s; + s._stack_start = (char*)1; + s.stack_stop = (char*)-1; + return s; +} + +StackState::~StackState() +{ + if (this->_stack_saved != 0) { + this->free_stack_copy(); + } +} + + +}; // namespace greenlet + +#endif // GREENLET_STACK_STATE_CPP diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/TThreadStateDestroy.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/TThreadStateDestroy.cpp new file mode 100644 index 00000000..645bf52b --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/TThreadStateDestroy.cpp @@ -0,0 +1,190 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +/** + * Implementation of the ThreadState destructors. + * + * Format with: + * clang-format -i --style=file src/greenlet/greenlet.c + * + * + * Fix missing braces with: + * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" +*/ +#ifndef T_THREADSTATE_DESTROY +#define T_THREADSTATE_DESTROY + +#include "greenlet_greenlet.hpp" +#include "greenlet_thread_state.hpp" +#include "greenlet_thread_support.hpp" +#include "TGreenletGlobals.cpp" + +namespace greenlet { + +struct ThreadState_DestroyWithGIL +{ + ThreadState_DestroyWithGIL(ThreadState* state) + { + if (state && state->has_main_greenlet()) { + DestroyWithGIL(state); + } + } + + static int + DestroyWithGIL(ThreadState* state) + { + // Holding the GIL. + // Passed a non-shared pointer to the actual thread state. + // state -> main greenlet + assert(state->has_main_greenlet()); + PyGreenlet* main(state->borrow_main_greenlet()); + // When we need to do cross-thread operations, we check this. + // A NULL value means the thread died some time ago. + // We do this here, rather than in a Python dealloc function + // for the greenlet, in case there's still a reference out + // there. + static_cast(main->pimpl)->thread_state(nullptr); + + delete state; // Deleting this runs the destructor, DECREFs the main greenlet. + return 0; + } +}; + + + +struct ThreadState_DestroyNoGIL +{ +#if GREENLET_BROKEN_PY_ADD_PENDING + static int _push_pending_call(struct _pending_calls *pending, + int (*func)(void *), void *arg) + { + int i = pending->last; + int j = (i + 1) % NPENDINGCALLS; + if (j == pending->first) { + return -1; /* Queue full */ + } + pending->calls[i].func = func; + pending->calls[i].arg = arg; + pending->last = j; + return 0; + } + + static int AddPendingCall(int (*func)(void *), void *arg) + { + _PyRuntimeState *runtime = &_PyRuntime; + if (!runtime) { + // obviously impossible + return 0; + } + struct _pending_calls *pending = &runtime->ceval.pending; + if (!pending->lock) { + return 0; + } + int result = 0; + PyThread_acquire_lock(pending->lock, WAIT_LOCK); + if (!pending->finishing) { + result = _push_pending_call(pending, func, arg); + } + PyThread_release_lock(pending->lock); + SIGNAL_PENDING_CALLS(&runtime->ceval); + return result; + } +#else + // Python < 3.8 or >= 3.9 + static int AddPendingCall(int (*func)(void*), void* arg) + { + return Py_AddPendingCall(func, arg); + } +#endif + + ThreadState_DestroyNoGIL(ThreadState* state) + { + // We are *NOT* holding the GIL. Our thread is in the middle + // of its death throes and the Python thread state is already + // gone so we can't use most Python APIs. One that is safe is + // ``Py_AddPendingCall``, unless the interpreter itself has + // been torn down. There is a limited number of calls that can + // be queued: 32 (NPENDINGCALLS) in CPython 3.10, so we + // coalesce these calls using our own queue. + if (state && state->has_main_greenlet()) { + // mark the thread as dead ASAP. + // this is racy! If we try to throw or switch to a + // greenlet from this thread from some other thread before + // we clear the state pointer, it won't realize the state + // is dead which can crash the process. + PyGreenlet* p = state->borrow_main_greenlet(); + assert(p->pimpl->thread_state() == state || p->pimpl->thread_state() == nullptr); + static_cast(p->pimpl)->thread_state(nullptr); + } + + // NOTE: Because we're not holding the GIL here, some other + // Python thread could run and call ``os.fork()``, which would + // be bad if that happenend while we are holding the cleanup + // lock (it wouldn't function in the child process). + // Make a best effort to try to keep the duration we hold the + // lock short. + // TODO: On platforms that support it, use ``pthread_atfork`` to + // drop this lock. + LockGuard cleanup_lock(*mod_globs->thread_states_to_destroy_lock); + + if (state && state->has_main_greenlet()) { + // Because we don't have the GIL, this is a race condition. + if (!PyInterpreterState_Head()) { + // We have to leak the thread state, if the + // interpreter has shut down when we're getting + // deallocated, we can't run the cleanup code that + // deleting it would imply. + return; + } + + mod_globs->queue_to_destroy(state); + if (mod_globs->thread_states_to_destroy.size() == 1) { + // We added the first item to the queue. We need to schedule + // the cleanup. + int result = ThreadState_DestroyNoGIL::AddPendingCall( + ThreadState_DestroyNoGIL::DestroyQueueWithGIL, + NULL); + if (result < 0) { + // Hmm, what can we do here? + fprintf(stderr, + "greenlet: WARNING: failed in call to Py_AddPendingCall; " + "expect a memory leak.\n"); + } + } + } + } + + static int + DestroyQueueWithGIL(void* UNUSED(arg)) + { + // We're holding the GIL here, so no Python code should be able to + // run to call ``os.fork()``. + while (1) { + ThreadState* to_destroy; + { + LockGuard cleanup_lock(*mod_globs->thread_states_to_destroy_lock); + if (mod_globs->thread_states_to_destroy.empty()) { + break; + } + to_destroy = mod_globs->take_next_to_destroy(); + } + // Drop the lock while we do the actual deletion. + ThreadState_DestroyWithGIL::DestroyWithGIL(to_destroy); + } + return 0; + } + +}; + +}; // namespace greenlet + +// The intent when GET_THREAD_STATE() is needed multiple times in a +// function is to take a reference to its return value in a local +// variable, to avoid the thread-local indirection. On some platforms +// (macOS), accessing a thread-local involves a function call (plus an +// initial function call in each function that uses a thread local); +// in contrast, static volatile variables are at some pre-computed +// offset. +typedef greenlet::ThreadStateCreator ThreadStateCreator; +static thread_local ThreadStateCreator g_thread_state_global; +#define GET_THREAD_STATE() g_thread_state_global + +#endif //T_THREADSTATE_DESTROY diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/TUserGreenlet.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/TUserGreenlet.cpp new file mode 100644 index 00000000..975b29cc --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/TUserGreenlet.cpp @@ -0,0 +1,663 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +/** + * Implementation of greenlet::UserGreenlet. + * + * Format with: + * clang-format -i --style=file src/greenlet/greenlet.c + * + * + * Fix missing braces with: + * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" +*/ + +#include "greenlet_internal.hpp" +#include "greenlet_greenlet.hpp" +#include "greenlet_thread_state.hpp" +#include "TThreadStateDestroy.cpp" + + +namespace greenlet { +using greenlet::refs::BorrowedMainGreenlet; +greenlet::PythonAllocator UserGreenlet::allocator; + +void* UserGreenlet::operator new(size_t UNUSED(count)) +{ + return allocator.allocate(1); +} + + +void UserGreenlet::operator delete(void* ptr) +{ + return allocator.deallocate(static_cast(ptr), + 1); +} + + +UserGreenlet::UserGreenlet(PyGreenlet* p, BorrowedGreenlet the_parent) + : Greenlet(p), _parent(the_parent) +{ + this->_self = p; +} + +UserGreenlet::~UserGreenlet() +{ + // Python 3.11: If we don't clear out the raw frame datastack + // when deleting an unfinished greenlet, + // TestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main fails. + this->python_state.did_finish(nullptr); + this->tp_clear(); +} + +BorrowedGreenlet +UserGreenlet::self() const noexcept +{ + return this->_self; +} + + + +const BorrowedMainGreenlet +UserGreenlet::main_greenlet() const +{ + return this->_main_greenlet; +} + + +BorrowedMainGreenlet +UserGreenlet::find_main_greenlet_in_lineage() const +{ + if (this->started()) { + assert(this->_main_greenlet); + return BorrowedMainGreenlet(this->_main_greenlet); + } + + if (!this->_parent) { + /* garbage collected greenlet in chain */ + // XXX: WHAT? + return BorrowedMainGreenlet(nullptr); + } + + return this->_parent->find_main_greenlet_in_lineage(); +} + + +/** + * CAUTION: This will allocate memory and may trigger garbage + * collection and arbitrary Python code. + */ +OwnedObject +UserGreenlet::throw_GreenletExit_during_dealloc(const ThreadState& current_thread_state) +{ + /* The dying greenlet cannot be a parent of ts_current + because the 'parent' field chain would hold a + reference */ + UserGreenlet::ParentIsCurrentGuard with_current_parent(this, current_thread_state); + + // We don't care about the return value, only whether an + // exception happened. Whether or not an exception happens, + // we need to restore the parent in case the greenlet gets + // resurrected. + return Greenlet::throw_GreenletExit_during_dealloc(current_thread_state); +} + +ThreadState* +UserGreenlet::thread_state() const noexcept +{ + // TODO: maybe make this throw, if the thread state isn't there? + // if (!this->main_greenlet) { + // throw std::runtime_error("No thread state"); // TODO: Better exception + // } + if (!this->_main_greenlet) { + return nullptr; + } + return this->_main_greenlet->thread_state(); +} + + +bool +UserGreenlet::was_running_in_dead_thread() const noexcept +{ + return this->_main_greenlet && !this->thread_state(); +} + +OwnedObject +UserGreenlet::g_switch() +{ + assert(this->args() || PyErr_Occurred()); + + try { + this->check_switch_allowed(); + } + catch (const PyErrOccurred&) { + this->release_args(); + throw; + } + + // Switching greenlets used to attempt to clean out ones that need + // deleted *if* we detected a thread switch. Should it still do + // that? + // An issue is that if we delete a greenlet from another thread, + // it gets queued to this thread, and ``kill_greenlet()`` switches + // back into the greenlet + + /* find the real target by ignoring dead greenlets, + and if necessary starting a greenlet. */ + switchstack_result_t err; + Greenlet* target = this; + // TODO: probably cleaner to handle the case where we do + // switch to ourself separately from the other cases. + // This can probably even further be simplified if we keep + // track of the switching_state we're going for and just call + // into g_switch() if it's not ourself. The main problem with that + // is that we would be using more stack space. + bool target_was_me = true; + bool was_initial_stub = false; + while (target) { + if (target->active()) { + if (!target_was_me) { + target->args() <<= this->args(); + assert(!this->args()); + } + err = target->g_switchstack(); + break; + } + if (!target->started()) { + // We never encounter a main greenlet that's not started. + assert(!target->main()); + UserGreenlet* real_target = static_cast(target); + assert(real_target); + void* dummymarker; + was_initial_stub = true; + if (!target_was_me) { + target->args() <<= this->args(); + assert(!this->args()); + } + try { + // This can only throw back to us while we're + // still in this greenlet. Once the new greenlet + // is bootstrapped, it has its own exception state. + err = real_target->g_initialstub(&dummymarker); + } + catch (const PyErrOccurred&) { + this->release_args(); + throw; + } + catch (const GreenletStartedWhileInPython&) { + // The greenlet was started sometime before this + // greenlet actually switched to it, i.e., + // "concurrent" calls to switch() or throw(). + // We need to retry the switch. + // Note that the current greenlet has been reset + // to this one (or we wouldn't be running!) + continue; + } + break; + } + + target = target->parent(); + target_was_me = false; + } + // The ``this`` pointer and all other stack or register based + // variables are invalid now, at least where things succeed + // above. + // But this one, probably not so much? It's not clear if it's + // safe to throw an exception at this point. + + if (err.status < 0) { + // If we get here, either g_initialstub() + // failed, or g_switchstack() failed. Either one of those + // cases SHOULD leave us in the original greenlet with a valid + // stack. + return this->on_switchstack_or_initialstub_failure(target, err, target_was_me, was_initial_stub); + } + + // err.the_new_current_greenlet would be the same as ``target``, + // if target wasn't probably corrupt. + return err.the_new_current_greenlet->g_switch_finish(err); +} + + + +Greenlet::switchstack_result_t +UserGreenlet::g_initialstub(void* mark) +{ + OwnedObject run; + + // We need to grab a reference to the current switch arguments + // in case we're entered concurrently during the call to + // GetAttr() and have to try again. + // We'll restore them when we return in that case. + // Scope them tightly to avoid ref leaks. + { + SwitchingArgs args(this->args()); + + /* save exception in case getattr clears it */ + PyErrPieces saved; + + /* + self.run is the object to call in the new greenlet. + This could run arbitrary python code and switch greenlets! + */ + run = this->_self.PyRequireAttr(mod_globs->str_run); + /* restore saved exception */ + saved.PyErrRestore(); + + + /* recheck that it's safe to switch in case greenlet reparented anywhere above */ + this->check_switch_allowed(); + + /* by the time we got here another start could happen elsewhere, + * that means it should now be a regular switch. + * This can happen if the Python code is a subclass that implements + * __getattribute__ or __getattr__, or makes ``run`` a descriptor; + * all of those can run arbitrary code that switches back into + * this greenlet. + */ + if (this->stack_state.started()) { + // the successful switch cleared these out, we need to + // restore our version. They will be copied on up to the + // next target. + assert(!this->args()); + this->args() <<= args; + throw GreenletStartedWhileInPython(); + } + } + + // Sweet, if we got here, we have the go-ahead and will switch + // greenlets. + // Nothing we do from here on out should allow for a thread or + // greenlet switch: No arbitrary calls to Python, including + // decref'ing + +#if GREENLET_USE_CFRAME + /* OK, we need it, we're about to switch greenlets, save the state. */ + /* + See green_new(). This is a stack-allocated variable used + while *self* is in PyObject_Call(). + We want to defer copying the state info until we're sure + we need it and are in a stable place to do so. + */ + _PyCFrame trace_info; + + this->python_state.set_new_cframe(trace_info); +#endif + /* start the greenlet */ + ThreadState& thread_state = GET_THREAD_STATE().state(); + this->stack_state = StackState(mark, + thread_state.borrow_current()->stack_state); + this->python_state.set_initial_state(PyThreadState_GET()); + this->exception_state.clear(); + this->_main_greenlet = thread_state.get_main_greenlet(); + + /* perform the initial switch */ + switchstack_result_t err = this->g_switchstack(); + /* returns twice! + The 1st time with ``err == 1``: we are in the new greenlet. + This one owns a greenlet that used to be current. + The 2nd time with ``err <= 0``: back in the caller's + greenlet; this happens if the child finishes or switches + explicitly to us. Either way, the ``err`` variable is + created twice at the same memory location, but possibly + having different ``origin`` values. Note that it's not + constructed for the second time until the switch actually happens. + */ + if (err.status == 1) { + // In the new greenlet. + + // This never returns! Calling inner_bootstrap steals + // the contents of our run object within this stack frame, so + // it is not valid to do anything with it. + try { + this->inner_bootstrap(err.origin_greenlet.relinquish_ownership(), + run.relinquish_ownership()); + } + // Getting a C++ exception here isn't good. It's probably a + // bug in the underlying greenlet, meaning it's probably a + // C++ extension. We're going to abort anyway, but try to + // display some nice information if possible. + // + // The catching is tested by + // ``test_cpp.CPPTests.test_unhandled_exception_in_greenlet_aborts``. + // + // PyErrOccurred can theoretically be thrown by + // inner_bootstrap() -> g_switch_finish(), but that should + // never make it back to here. It is a std::exception and + // would be caught if it is. + catch (const std::exception& e) { + std::string base = "greenlet: Unhandled C++ exception: "; + base += e.what(); + Py_FatalError(base.c_str()); + } + catch (...) { + // Some compilers/runtimes use exceptions internally. + // It appears that GCC on Linux with libstdc++ throws an + // exception internally at process shutdown time to unwind + // stacks and clean up resources. Depending on exactly + // where we are when the process exits, that could result + // in an unknown exception getting here. If we + // Py_FatalError() or abort() here, we interfere with + // orderly process shutdown. Throwing the exception on up + // is the right thing to do. + // + // gevent's ``examples/dns_mass_resolve.py`` demonstrates this. +#ifndef NDEBUG + fprintf(stderr, + "greenlet: inner_bootstrap threw unknown exception; " + "is the process terminating?\n"); +#endif + throw; + } + Py_FatalError("greenlet: inner_bootstrap returned with no exception.\n"); + } + + + // In contrast, notice that we're keeping the origin greenlet + // around as an owned reference; we need it to call the trace + // function for the switch back into the parent. It was only + // captured at the time the switch actually happened, though, + // so we haven't been keeping an extra reference around this + // whole time. + + /* back in the parent */ + if (err.status < 0) { + /* start failed badly, restore greenlet state */ + this->stack_state = StackState(); + this->_main_greenlet.CLEAR(); + // CAUTION: This may run arbitrary Python code. + run.CLEAR(); // inner_bootstrap didn't run, we own the reference. + } + + // In the success case, the spawned code (inner_bootstrap) will + // take care of decrefing this, so we relinquish ownership so as + // to not double-decref. + + run.relinquish_ownership(); + + return err; +} + + +void +UserGreenlet::inner_bootstrap(PyGreenlet* origin_greenlet, PyObject* run) +{ + // The arguments here would be another great place for move. + // As it is, we take them as a reference so that when we clear + // them we clear what's on the stack above us. Do that NOW, and + // without using a C++ RAII object, + // so there's no way that exiting the parent frame can clear it, + // or we clear it unexpectedly. This arises in the context of the + // interpreter shutting down. See https://github.com/python-greenlet/greenlet/issues/325 + //PyObject* run = _run.relinquish_ownership(); + + /* in the new greenlet */ + assert(this->thread_state()->borrow_current() == this->_self); + // C++ exceptions cannot propagate to the parent greenlet from + // here. (TODO: Do we need a catch(...) clause, perhaps on the + // function itself? ALl we could do is terminate the program.) + // NOTE: On 32-bit Windows, the call chain is extremely + // important here in ways that are subtle, having to do with + // the depth of the SEH list. The call to restore it MUST NOT + // add a new SEH handler to the list, or we'll restore it to + // the wrong thing. + this->thread_state()->restore_exception_state(); + /* stack variables from above are no good and also will not unwind! */ + // EXCEPT: That can't be true, we access run, among others, here. + + this->stack_state.set_active(); /* running */ + + // We're about to possibly run Python code again, which + // could switch back/away to/from us, so we need to grab the + // arguments locally. + SwitchingArgs args; + args <<= this->args(); + assert(!this->args()); + + // XXX: We could clear this much earlier, right? + // Or would that introduce the possibility of running Python + // code when we don't want to? + // CAUTION: This may run arbitrary Python code. + this->_run_callable.CLEAR(); + + + // The first switch we need to manually call the trace + // function here instead of in g_switch_finish, because we + // never return there. + if (OwnedObject tracefunc = this->thread_state()->get_tracefunc()) { + OwnedGreenlet trace_origin; + trace_origin = origin_greenlet; + try { + g_calltrace(tracefunc, + args ? mod_globs->event_switch : mod_globs->event_throw, + trace_origin, + this->_self); + } + catch (const PyErrOccurred&) { + /* Turn trace errors into switch throws */ + args.CLEAR(); + } + } + + // We no longer need the origin, it was only here for + // tracing. + // We may never actually exit this stack frame so we need + // to explicitly clear it. + // This could run Python code and switch. + Py_CLEAR(origin_greenlet); + + OwnedObject result; + if (!args) { + /* pending exception */ + result = NULL; + } + else { + /* call g.run(*args, **kwargs) */ + // This could result in further switches + try { + //result = run.PyCall(args.args(), args.kwargs()); + // CAUTION: Just invoking this, before the function even + // runs, may cause memory allocations, which may trigger + // GC, which may run arbitrary Python code. + result = OwnedObject::consuming(PyObject_Call(run, args.args().borrow(), args.kwargs().borrow())); + } + catch (...) { + // Unhandled C++ exception! + + // If we declare ourselves as noexcept, if we don't catch + // this here, most platforms will just abort() the + // process. But on 64-bit Windows with older versions of + // the C runtime, this can actually corrupt memory and + // just return. We see this when compiling with the + // Windows 7.0 SDK targeting Windows Server 2008, but not + // when using the Appveyor Visual Studio 2019 image. So + // this currently only affects Python 2.7 on Windows 64. + // That is, the tests pass and the runtime aborts + // everywhere else. + // + // However, if we catch it and try to continue with a + // Python error, then all Windows 64 bit platforms corrupt + // memory. So all we can do is manually abort, hopefully + // with a good error message. (Note that the above was + // tested WITHOUT the `/EHr` switch being used at compile + // time, so MSVC may have "optimized" out important + // checking. Using that switch, we may be in a better + // place in terms of memory corruption.) But sometimes it + // can't be caught here at all, which is confusing but not + // terribly surprising; so again, the G_NOEXCEPT_WIN32 + // plus "/EHr". + // + // Hopefully the basic C stdlib is still functional enough + // for us to at least print an error. + // + // It gets more complicated than that, though, on some + // platforms, specifically at least Linux/gcc/libstdc++. They use + // an exception to unwind the stack when a background + // thread exits. (See comments about noexcept.) So this + // may not actually represent anything untoward. On those + // platforms we allow throws of this to propagate, or + // attempt to anyway. +# if defined(WIN32) || defined(_WIN32) + Py_FatalError( + "greenlet: Unhandled C++ exception from a greenlet run function. " + "Because memory is likely corrupted, terminating process."); + std::abort(); +#else + throw; +#endif + } + } + // These lines may run arbitrary code + args.CLEAR(); + Py_CLEAR(run); + + if (!result + && mod_globs->PyExc_GreenletExit.PyExceptionMatches() + && (this->args())) { + // This can happen, for example, if our only reference + // goes away after we switch back to the parent. + // See test_dealloc_switch_args_not_lost + PyErrPieces clear_error; + result <<= this->args(); + result = single_result(result); + } + this->release_args(); + this->python_state.did_finish(PyThreadState_GET()); + + result = g_handle_exit(result); + assert(this->thread_state()->borrow_current() == this->_self); + + /* jump back to parent */ + this->stack_state.set_inactive(); /* dead */ + + + // TODO: Can we decref some things here? Release our main greenlet + // and maybe parent? + for (Greenlet* parent = this->_parent; + parent; + parent = parent->parent()) { + // We need to somewhere consume a reference to + // the result; in most cases we'll never have control + // back in this stack frame again. Calling + // green_switch actually adds another reference! + // This would probably be clearer with a specific API + // to hand results to the parent. + parent->args() <<= result; + assert(!result); + // The parent greenlet now owns the result; in the + // typical case we'll never get back here to assign to + // result and thus release the reference. + try { + result = parent->g_switch(); + } + catch (const PyErrOccurred&) { + // Ignore, keep passing the error on up. + } + + /* Return here means switch to parent failed, + * in which case we throw *current* exception + * to the next parent in chain. + */ + assert(!result); + } + /* We ran out of parents, cannot continue */ + PyErr_WriteUnraisable(this->self().borrow_o()); + Py_FatalError("greenlet: ran out of parent greenlets while propagating exception; " + "cannot continue"); + std::abort(); +} + +void +UserGreenlet::run(const BorrowedObject nrun) +{ + if (this->started()) { + throw AttributeError( + "run cannot be set " + "after the start of the greenlet"); + } + this->_run_callable = nrun; +} + +const OwnedGreenlet +UserGreenlet::parent() const +{ + return this->_parent; +} + +void +UserGreenlet::parent(const BorrowedObject raw_new_parent) +{ + if (!raw_new_parent) { + throw AttributeError("can't delete attribute"); + } + + BorrowedMainGreenlet main_greenlet_of_new_parent; + BorrowedGreenlet new_parent(raw_new_parent.borrow()); // could + // throw + // TypeError! + for (BorrowedGreenlet p = new_parent; p; p = p->parent()) { + if (p == this->_self) { + throw ValueError("cyclic parent chain"); + } + main_greenlet_of_new_parent = p->main_greenlet(); + } + + if (!main_greenlet_of_new_parent) { + throw ValueError("parent must not be garbage collected"); + } + + if (this->started() + && this->_main_greenlet != main_greenlet_of_new_parent) { + throw ValueError("parent cannot be on a different thread"); + } + + this->_parent = new_parent; +} + +void +UserGreenlet::murder_in_place() +{ + this->_main_greenlet.CLEAR(); + Greenlet::murder_in_place(); +} + +bool +UserGreenlet::belongs_to_thread(const ThreadState* thread_state) const +{ + return Greenlet::belongs_to_thread(thread_state) && this->_main_greenlet == thread_state->borrow_main_greenlet(); +} + + +int +UserGreenlet::tp_traverse(visitproc visit, void* arg) +{ + Py_VISIT(this->_parent.borrow_o()); + Py_VISIT(this->_main_greenlet.borrow_o()); + Py_VISIT(this->_run_callable.borrow_o()); + + return Greenlet::tp_traverse(visit, arg); +} + +int +UserGreenlet::tp_clear() +{ + Greenlet::tp_clear(); + this->_parent.CLEAR(); + this->_main_greenlet.CLEAR(); + this->_run_callable.CLEAR(); + return 0; +} + +UserGreenlet::ParentIsCurrentGuard::ParentIsCurrentGuard(UserGreenlet* p, + const ThreadState& thread_state) + : oldparent(p->_parent), + greenlet(p) +{ + p->_parent = thread_state.get_current(); +} + +UserGreenlet::ParentIsCurrentGuard::~ParentIsCurrentGuard() +{ + this->greenlet->_parent = oldparent; + oldparent.CLEAR(); +} + +}; //namespace greenlet diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/__init__.py b/Meliora/gmapenv/Lib/site-packages/greenlet/__init__.py new file mode 100644 index 00000000..5459ad07 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/__init__.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +""" +The root of the greenlet package. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +__all__ = [ + '__version__', + '_C_API', + + 'GreenletExit', + 'error', + + 'getcurrent', + 'greenlet', + + 'gettrace', + 'settrace', +] + +# pylint:disable=no-name-in-module + +### +# Metadata +### +__version__ = '3.0.0' +from ._greenlet import _C_API # pylint:disable=no-name-in-module + +### +# Exceptions +### +from ._greenlet import GreenletExit +from ._greenlet import error + +### +# greenlets +### +from ._greenlet import getcurrent +from ._greenlet import greenlet + +### +# tracing +### +try: + from ._greenlet import gettrace + from ._greenlet import settrace +except ImportError: + # Tracing wasn't supported. + # XXX: The option to disable it was removed in 1.0, + # so this branch should be dead code. + pass + +### +# Constants +# These constants aren't documented and aren't recommended. +# In 1.0, USE_GC and USE_TRACING are always true, and USE_CONTEXT_VARS +# is the same as ``sys.version_info[:2] >= 3.7`` +### +from ._greenlet import GREENLET_USE_CONTEXT_VARS # pylint:disable=unused-import +from ._greenlet import GREENLET_USE_GC # pylint:disable=unused-import +from ._greenlet import GREENLET_USE_TRACING # pylint:disable=unused-import + +# Controlling the use of the gc module. Provisional API for this greenlet +# implementation in 2.0. +from ._greenlet import CLOCKS_PER_SEC # pylint:disable=unused-import +from ._greenlet import enable_optional_cleanup # pylint:disable=unused-import +from ._greenlet import get_clocks_used_doing_optional_cleanup # pylint:disable=unused-import + +# Other APIS in the _greenlet module are for test support. diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3dfccae5bba715cd1dfe5b4a718f2dfa88d2bb4 GIT binary patch literal 987 zcmZXSU2D@&7{^cAv`y3Wy_*WVC%a>^L>w{H;pj%&sXGJ?S#s8er8(i`WV(GA zFTC?J_)T&rUJd*NUimy{8z?5^e}2zP+H?L-f_B>`aBcl~&cD|Q`H8{bmj%IVc=BH$ z5uqe9qDo?{E3{%DSAnavs@ViKscDcEiE3XBT8rwm9yKB>X{;@3K~E!U0yk+>vkh!h zTXPGzMO&I3V23&ex!Qs^+7PvATUR>39ojL-2a*mDW41)JDNh>?}`(5bh(Vp(^ z0rzQNb02s>2bu@KLpszv1Rl|m<`M7)-2mQLknPQ@hxYP}kEIZ5EKbJ?cqKVc6RyTt z5S|AsKC!RC7P4)W-QXk_NufB4*O`zCQdSgS#Ca@I;7%svRI$?{4Hagrvc=d1msn=3 ztTUJG9`2RS^!5+D&#@|NTuLEJd&N~)NXb)GT6a4D;!4RNt=EEQa+f@J#V(}E!ok+WA4Fh>3v+X_q+229`K*y)P>aO zpVV@`>+a2_cvyG;zIb*T{dzV!d69jvLB!PSlBHCnkerY$f7ZRP&K1g&y zdmzz)vbCp2=b`JegS9S752cSXKpBF3Bl12n%I{mC$}F`?%!?nDPwUOE5;_-Wof-!i>OHWD?DZX d7{shP2HX{EXc|rpNIw?(Nlj8C_eUgsf9pNh{-6FqNPpZT38R6-Zmf<%s zbo#_fNuN6DPxu`ho;7JHe(TD=n#kX=;c4!iU)UTv4z?K&pVC$sM$*VjP6H2mSeUH9W3pFGw{3ZFAwt{#$<`gN@Uwux-~m+7iT zQB}$QIq+SjRC}^q)u_{i-=VBrm*v{W->NLvGe_~k`mZs|byY8yE83pv8fd4b|E|w; z72v%Q`6UW;mFvrN?X=)ZFK$1d61{p}6fb#SS|D@m-O2}CuIf`}Uv)+F3YY8EUMvR$ z^v3T#{H6UD1bLmJin#_3K}G;LIRd|#q{P&JK@9hlT2)ZSh_Si?$RBt>x!{xw%0m~0 zT&}NKy%zcC+BNjRa;MCmGkYqs1b4uplsore<*uGN3k8Ww7jWw8jo;t_<%T2m|JVO% z@m(JL`O3W~4$Ze7&afYb*bn*k!$A9Cfc=nTKV-{;-Hi9dGx9^@Lzjdu4qbHdh2t+_ z(^@i;?=#-&?{aDJeHq^Rn}Inzncn&(e9GEs^gRT>#Z6j#t#9&_%O`~S@thn@FCW%e2k=Ivduw zTpQB=yIRw8j+=md-MyqB%eA@)Wi>s!Sxe?Nf1cseTC+1*yTeGRikj|j&&YIn$2VyS z_q!l$B-A1SZ|~s^V@tRTj?Qv<`^h_gK0z{mzEVHm)Sy^tZHlv&Z-d4ex2mh~}=&BSq;Ojd{25cVa$<)XM&*bZu?}TItB*^klGs zjz`cy8ukHC(!GSRw1$LFYl#rS`^c)IH+O4p10d5#=K*64@TMjG4}FE&lJNQ?XuBJJ zu0unlm9F@??I8f2bk|8QSzR#It^Uaetv^oHFE~hjz*m5IdFgkVE+cYNx4~lMTKvR} zSWnG7?jL3b2}k+^^0u!l&o9VOle#jKL*k5<=Ldw+F|!ylr}ni61@yOBBw>MGls3uT z;J*l;h#$ld9USd?PHlRV#}07|+~VkyvDB10N-e|wjOa0MP<3aaL||KlJqS?$Gd z%=2+@`u5oXIujV$DvJyQ6uQ08gT}2Mt&x86M;U4SV6CP|Na&So$EOxn(tRTuRxN?% zxX#Y^g!OHj{soH)I&EAoRXrTd9=Pf@YKb1E|C%4M@<7o+O<$+!(R@vop-qR~`_tY1 ze_(m(M@uZkc=Ru%dtyt^BmF}LlK$;(`>AgK@-(}BQ`6T=w_iy!>=x^eS&1G81AzVK zT`XLr8ocYDy}+@G*K#T*5D1Pkl3zuxQ^gL8jOVZ60>${swJ-VX{{sjyhsf$E#&y^ zuEwiIhpj17KrGeAwuLUW^}xph4;V$5O$*eTv%%wo2FUw$K*SA1>t zl*yA?jN`#+8;t<|B~=|bzrzJ>KQq6*u#(f~_p}EDUoSt^WquElX4L#nXVy>8FBZN- z&$|2l?|y;45+v9(`uaOmWgu~M*ZzMi&8Ys(Cx5bki+?2jJMJL(+l|Y=Bb#;SKY`bz z|0Sk^?<8}-`%R|H^uMrQq0L#4-T2R^pbcRgUF4HjLHL+}(Ut#d4eil!7ivp($sFnK z*Lqk4UY}pbS)Ehs(_ z;BrA!8`n&S!l~&1NWTEflS$L35n~rY9^*A=EJX=T-^7;!L;qgHO#LoZzreU2)9Vbk zyS(`UvwYxq2mgWXyC)EbHq*BFt)@3?dM}Q8fYu6NQP7qUw*$8=nx0{^9_dupzvv3& zcePm7PrDr!P_5}-LS7f|Ag6)fwMbh zE)qQ{;!8FCBCHy&=~HC+0W$>FTG)QBK}^Lyt*}{(H_5`DTWHK!%wFaKw@_q&TCTeN zi(IZqa$jk47zCm=Ws*p=bL4zK8u=MDp6ggAz%?-4$_v+bf8h)?p)V=kL>3Bl&kE zp9Yr}HqkinSd3m8n&!EIMh%RBnq!`7?R`V_Q#IWl%cv$c2@3VXH0;4bAhupIK2%f$bh+75Ip)j71_ zzezLxSHH>ti*V0Ms%Z^qdVk}XJu=k`KDN?~Z$PB5Up5-Xx5&|R??EMS_SvWu(Sv}b zSEU}zGyO~0rcCsy-$)ZBP7_b7Cj66Cf33^Y`g>Xx?&B10U||}78EXE;76A)PEk>+Z zC^eq+1ZRFRhPP-tmA&k(|FxhulRUPEM!E#1dTEKCT`=_^hoggLPznZudgh!YMs-E~ zd@0z6l@HNc#bsjC3dg1CW28Lf$p{ZAz|IUwW;atU9bP~M4RU*TFtfUV`5hcoKiS1Q zlIgWT>zUqri)4Wp5P+1SsKrZNvEEvIzQ+~II=!josjlKKUA~Hx>^|a|Y2X~uWyDxO zFn>W~VHV*t=Lz#wls;dUeUfJHoFfY)W$*M}W)lhdBW4SG0JED{8YV z|0cV4<9$V+Q$MiR!-sc)KD+5#H-YvK)IT1$Ljd-q18nObHa`krM6({wbb$mw@KF3t zKL*TWPisaLVtzdyvSR~G|2Mli`{}c|ntaCi<}&oqC0(T1h7A!tvl0Y-QWz_AZ=J=H zvZF_Y5SJn=4^1frf4qwOYj7kYKFlW zPl6js;lIyH!L>|1GWsz?4+gcuG|x!KdNgCf${)~6Ka9~y;ra-OP*Fx#6;M;W1^RDs zZWd(dF#4$U-GD#l2QPZ|R!&atoA@#PfBX#Xtm2fK{yPP4`zR~s!Q!FFCC|lFedS#& zLStrraGG~k?&FvOBtcAJK5lu46xI_K4Y&RK5s;Zq^x;xXDp9TEbGF6R22&k~Ju~h+Sm=QFW2Ltq$-&QX7|5<2UiZ zQofq**N!LBAivieA!ML6a43#~b{;qo_!+3BkCyNlp|4G|QH;67wE*H;zpPLMJ<-wL!F6m%)5|LA{|nKm zj|*_ER|T~AsiM(rH2v?Q57U1;=A8uHx47N(55SA*ABzmt{5!E1DjW7hkE$&EF&zJR zUs!)N95+2NkLkY`WjZ16zuZNVg1W5fGl}MB^4T%SI~bY*XDytz={`114*^pmTC!vT zb@%6$`J36f-W!}`bY{u*f%!qnnfaJu zI4slWry6VQxcwj}%O4TZzcBp^J2PAr7R676tP1O6r4wIe;(G8$IKwdHKVisEX8;$* z4?mbDig?0heZ38DW@6k8?cVxV@qqG}Ays}Z%7^uHwFWZ^wP$c;;uM*L{!k7~|7FPR z?5VZ3yaBEdANK9BSf}24oo&Ux%k(xZk*D)AybW{lWDI`YAV%7HgHCOEif__7m z=p`(w``ge&1Vb+2Kbq*dw5Gy}@r2E$ktIViV|z)_CB_)xg#P8IqtQEZA=-=R`=q^7 zfB>3RP=8=noo<;`C23~W;Ri9RytlyAbs2qULqqNYK>1R@1e*q4q%cQb09-4D9>!!k zzs>a4H*zQqJG}KF(H24T5bI5rCVqlcgqDhwW76o^i*)11tu9xnaBYVB@5f}hI{d88 z-Gv73@IYU|QiSRSlU(<2Vlyzw`6sBYZ zSbv*jb8gxwPh?T3s3%2Auk}F*$MW=Q@l#|`ziRq>Biq;yJ|jqY9D56$hZr69`+az4 zWz=vCn{6HFN4SCj-Hul+ew|Ai1VyZ3HfWqn@mQcPp!kTL#FgPtdQ!^vWl^t?xmo}> zAQ|&5fLn~_uafkkA#LZeLSa}RSs>>5PMYV!WX?n>GMOaGp`Seb1@H%McaUZ2lg<^O zU7*@4y$DoD$Ks<;+w|{5a--vH%bcYwx@wsHC1L&AAWVM^rhkfyL13PV)u<%FL!XGQ zK5&Pf(BoFB`;cRhakSc=?vMi4It4yVqJS}dZ&&%P_!C8k66i^Wpt4zTdCj10=bm-^Zi{pG%Pfm|p=RO$WUG9?ZD{ImLU(2Gcz((fq35 zQY4Z2pN9&v@Zsu!OdSPzWBXL>#UK2|#lH({!{~QC8#tgRv9L}5#*eIi)^QyrMuDT) z{ru0qn=6dJU5Cn4CzAfl>M*|BKQ+x&RqTB{bM$Si!9(!dW^A3tZl+Yh(=!2o)%dGP z_ki?7dE4WYhiMNekI%op5e35X_ymldAIps1v)!KZLzbg}ac8$;t5mVsPO)8jYRbia zA!cO01DZbQblJqayoxHzWdIbqRs%K$`8r*driVTzfL9nTjU^Vl5FA?p)QQ-?A3(0@ag`{9Scygul~LFD$T&yNtt06uzn z=N-lecoc(&JerdSRdh-V5O~BD_6Sn;mzawN+#uEtTOFQg?H)SQYUH3hY>qxGJQ%C~ z0JCqjfGEn^;pyh0V;`N!0-_{a^4;10>v<1mhJKHXVhlH2ORfUpzo6C@#Gn0_!yi*) zXVlmkuQQ``!31da`j{%yKZx&%1)!J(K=+suyF!Uw;bGNMk)2UwXXujQ7>zIyyXcGQ zA!gqkr6I1{hG9x zr8aNOsyt=W{>1*L!;fThD8!BWK!k2uC`Z3TLlM0#qK~YByh~hC6G_w=1l_FLjUS}f zBDFS>2m)M~xHkv?y~46ko2tWv0N`bdbBCT!`pg%gQJ7D`+K zRr(TWYL{TvE&=skQlRPBR(jQ}s?n13JQT8RMgn>}JU8J)Ut^I$^{WS(p;n0D_8%-$2ujWYE}-`Jf!%H*@}Ecxb7y8E*A|zCzEF1B z0-?!WCfL$9scO;$upFE^cGKXl7ofI9^qyEJA&d!6mAVF21XXt<*0v`$F=WEuyG;#r z1&j^xS78))fT^_h0Fr>EMc7YR1Pm>NzZ&i<Mgcf8@-&uOw z&0*`Cpv(j`T}>;{3fEn3?M~#BVyj+ssBj`!qYn>+5-)xnZ=wsA;L~KxBw5WpV zUFt~o}Mb}2sOd5BMD8k4{KE`>H?um=N?zQIbiJhkTb9e zF48*|*ci%uPf&LG7CYhfdY}xoPP1z@Ikn!o(Jr)Mr_?&msr7(W>$^j(zLq()b~?50 zQnfzcY&SE5wfG;A1{y?=%O!|LQcDzm&o8hU5FiS*Rw@lHz5-Pk&HSLtTfb60*1Eh6 zf5W5hZpcRO$)R1buI56|F0oL*{Hiq6hh8M^BUxuaw}dtiyZ^Z4xKmAkA!v(6el_u# zOa4|$rB2`1nOSUxLE;Ut2Dh_+#oTIb=H}5#$6-lgD*zPw!#gD8Mq$Q|i3~5tA)OFt zA(<=1AbX4Po#w9J@iuD0=@Bc3sxgwykar9l$|o2esD*`!mddz-Ac2&SdW5x*4Ku>= zCfv?6pU8mnYjalD;*AmpT4k}d#2;G&7K!O^2WeSW&nFm3WB0jxox@X3oW~uv zmpy?s7TYT^Zhco~=i?1(x=M_GOGHKX4{|tTrz$e@6;&i)e1EJtG!atK5*o~ePb@t}?;AoeXYg1^Jj7S-S(6L5(fEf_F zBHxeR67r25Z#Nj$`-T%op&f7ipR97;2JCUVI)1}fs?Pn{AQa^z52zDWYUGujmq9q0 z{wt*MrWoQ%dP=+JcD|(oUqQlzUP z?`0Zhu}D;vC{>k(N{e^26u~cLPQcnc(fgD18%Uwx#gFs@UlXPA9{>{a=2mPfA*ztu ziyCD@33-)RxIsQ?{3mGoua+Tk?=_uEEVfd$E~zslm8}4q(0tsRm_V-MUWX@aaPyf~ zFMU4k(GfCh!%TmXRD@^N(XMIuG;E0-0((WR^HkO|&iN01~uOt4B4r9WRygdIg;K+FNKNNw( z4)bQgF?FshhTYm$Us!1+AZ}!mmi8xbc{P#3JN>!SD;qcQ!D3pk)RE)BT! z9j^}JRav>jc=}D@ZO^ycyzNZbwrP}N@h2U@Yw$ZKG*3FgEZJ3uzAN?jDs^LBaHa6% zc`#(=1<1yVxO|EbpAdi@gdN|r1;NkcZ$cd{@h|H)nm-`|@A)<>k-rfz!s-YXagk~U zZPl25AIE|~2(CmkI3zI-D9O&}YoJoEgr;1d-zLyN2>Q>Sh4JXi^PAW#0}R%%bL_9M z2w6}>ix{*D*onm?4Om!+s$AlMA@F_irwx#Dbzqy*13O6*w9H#)61fszXk9 zR0fUdaAl+G+BSvCpz+C#HY(HPw{q^&{-r#07RG2a4J{M={UFYPlO^+KoC7&5piE<# zFzF96emnHiAUAKL)9g*GfOmYmY+V)6E(i(?;BW!MIGki;xd{kgO*(vkc}?J}C498c zYn@Em=T+Rny@f^i+~Vy2Vbkd?OKHv}g?gSsfHC)YPj5;GSM*cJKW9IQoH`5-GA(e} z_u)Kt+bgVZGT*=wJ|0l|Bn4|gQs7931;#RVN@j5rN}f%F2y3va*88kskIgA_c(DFc zaec_BoMcp0%oaO4kR^^sC~Z}w9 z2BC!V`6@%8XGXxzC{YPli;3tl%gp41w?Tttc5q znmjaff7hE@y?aGH=oT^L-(o1nk+6+{IODhQE*`MGeAgC^C0!z|ZUi|PcMauYOHa2^ zrs+$TqJ(1w+Uo&2Xrc}oTB5h{7&#GYr;)K;9rn@^RSa8T+&a_ZtJt2)dxvr~S*laS z3ffWr2ji|UxYeonXF%+3g4q~H_^->Gw=U~L)9)b;>}Ary^>rdh0=uJqqT=;;77Uu~wqW{-YKDGZG3ppPDH_Dj z(7VL*`~PsAVr>EAyVr!*EnH(K{1~%&oxp3y|5Hyn3aI@pY8vZQrBP0$c2+`elDUtm z+!LMLzowd0^itezYrFbe#{AdQ$c6Z^;;kVSwrTn&R*ZE4&4l@2E%PCk=3}AE58$r= ze?|C%t~Ec1Kj?GwtME4gf7OURsS&B7C6GT4b?2epXb3U)AR258G+I>$%on#CUkl8? z<~*dTyhzH@k}uvZsUSAXUDe9MphimpChnhMQsRj^mQ)UzY7hdBlT31!imZXudR5C4 z3+=$D5A#)0Wcu=3y#nP76QtQSUD1#$j=* zholc(25e=^vz1-1vIPNFwme(eSF3Dk@F0zk{Q24^{CwXY$(F!1xTV4LI^KY%Q_$zg zBk-Hs1zxbWyz>-V4#sa%{E0z7(Y&;3@12`g4eZMrOe_aH%wb;;Spo506*)-?5bIxO zJ%cLYG!=E6(*fdz&=ca-?~#_paRX?VZNbc7g^PiUI&cv$25HhAi`|Erl56`dHX0MV zyx*!?QUnRSJ4W&A8!V$3(g+R>zz>VBNfML(lIbLi+ys3-VjJy6hB&5Q7h63KtaZKd z<>oZFbgQTP?HPt{prqWjtPAkbk)s!nmyYz8$b5nfqo}euVNrL11w30M7t1Pc0*MQH zHM6=#Arz=9uw?=zy5*^h^%Q-hK&cyD;&Tsf|I{LI#hB6wu~AXHryOWTFahL$NdJ+) z8diKJ#@op4X--V&xr~a_|69KFUrNv9#{DuZ9nmAb^>mq3)SI!~aPnfP!DEVy1`%YfKArvCvHrl>m(ob2~klX3fB!w&*wup6-nQ~g9cCm4b+7bU}b zrHCzT9mlYq)HFVfHjyFb8#AC?s0=MiQ{}yZX&8Weu@P zYP+b?@dX7y$>~LV&qpFB{XZAqF3Zdtq!-~_*jt9^T#|ipSsI;_$pi#2hG&>#zL|6iB zNwJcYHNRvReYtQioc%iHn$bS>`97rZm}4M9IkKO8N8^A<lE>y5(OT{2_lEuf;g%+ZkSz_FJ!AL4ujGuxnfW5ab8 zNHfhn-(wwyJ|d79H4j-H{N>@#hra;+um}&O;~JrmFd_~msRoPz2rH%d3D_hK;;;lw z%Ip8+OGJSRwd^(lcQ8vC7*!OW7DF%3uacwPH-MTNn&w|+kCMYz=J#?%=|IT=1Fi0j zfu_N6NF?#3z+`cT0Qw9|;FC~SKfH41j6r9?5W-OLG9ip;^l)+t^j3?*RBPBF9En5B zWJ!(!YRL_-x|!V10_Op%Yg!9d7sft0+$ZE0JRJ0&(IC*|eX=`*K%wA4f`smnWya-J zhfx}Tc?o?b{ZpT#oUzj0nt_oS6A^7D2LukIlA^bfL)IAAP}-p&nYfY5oTUG=XH;cL z`vWT@aeIwQBm*|CS}O%}|CyE+RRtkQ4fm;BS52JjYGdCioa;?oR+XsRMIW>EJ@^{9 zzw$N+>A?LJ6MKpfopp5jciUf)qvKtjs@!Fp7luDk9WYRi)a2Zt@J$9$F73tU=z}{K z!U;3J(Qs3lQb*cKj0qH3$=ez^&V}vFkiBDUK`NXDj7MPt0VO2lLW~p}%JsLRG|{+{ zwWeXjXm_iV;FbieDrU1{f${XoHWYcB0o{Mkx0z@O3o*XN7g6!XWbg&5pRcGJbq><> zf90=W8xTsI2!;(mhTjNGSx5n^|8;E+e9z;NYfKo!{WuiPLNbL{D42+cyD(yO-4Cq9 z&TRpBoz)6WXTM4S+l<@LmNly-Mt>{uMs~p21;c%@iK}uG8zE4}XF~{~yi1o)$e69n zqghd=;cQDs0F191-!`Yg_zEg;yMBobHTQ=7pn!ODf$XlgSea1DHPj18M9sya)oMR z5fZhVymSOtT73!?HmxJc_);XJNX62PifrAe&1gNn3n0W^k#RF>cU&jlDD2MPVNo4j z;ly-3a`B7!T~2w@zjhKCLGB~?G5xJCIwu6M7By^YYZz#A>@}d%dH|Mm)n)5sUjacMP^t~1pKNcnD4fqE5^p<+v_ z(rsX&kCdw!ZVW`sKv8dso=mPCLP0 zixbuAWV<*bEb{%5oBb~PNL#}_7n{M7t!ayz#@c)|Jg;phsB!)5sMHy{%052jv~;;mG_7Eh4qd7 zcYFM>hOlx=#!JUxKpO|a>4#xcS3vZI*l!!L|Z=8g*B zH()s#tAJGavcWV@zEmyEfbsllg6hBOuXe(#*tP5ikKn&c{KK!%^jlgXHac)Z^PNTK z5;W*Drhh2*xp_Bq9P4I z3#Vz0M~nU(|GssW3K;zY8^S;C2G&yApA{!LPqcZQ>xGD(`68$J@<1fH7`i#mp~YK* z65a&Q(dB_ooFggL^aa=%_+icknvPwm!ZNMw$3>@e4;fnnroZz!8==u-u{8kHk)>q4 zfs4>kk`&l^Xt?ZMn58=0g6oab;gGZXfh>jlNI}ZI}gu@0Oba?lO%BzN#e8C!?K57C_9U?Sod=*Te1){qH6lvWa}Kv6 zqAnPgW{;MHt>tOyaA?KIoN=65sC-xihK*$Mf`OUB z*t5r@JR-m2cpk$)rhgGKIZS&z3-#Ou|M?%rb2GLnFjy6wnHtaHK-zeorf$pA>7boQ zpSQ+?eW{H`0mcJ!Ysn1sl;}CF^_CR?hBZN&-A5?vEr_KWN#+)zLUDT-W*@w%H3-J^ zUd$GtOh$AV7Tk@4Er541X=?Zs2=juCz5itFPqaeQVUSWs^vap0^~Mvh$U!bcm{G)x zBM>gv@7WAjw4YTX2hIs{y~|rbg7Pa%Lp_2i9Dsi%U$L)^9d3$Ddu#gyQPmpSWBt_v z0<6v+E;Kl`YiCwXI1mLk>yh8|^%V{j@1X8$CKqJD`%!vnFqWymD?ajC7&R5|l7fg( zhgwqlE9_yl_s)0#i_t0l@ZM)g6H2W_MeP4qSEoSG7%y_LSP{id$xhb=ALEh32oAa8 z51yJDa4)ROBut5<2A1SO4~z_HLt*7-gtx?g(IT)wH%ZPy`Wcl&k*7tgBKpIYbLA@f z8y|OGfHZ;E(wyevUZ(A&;-89VEiW085px^=Dovwe31`(1&Z=4Atj9|@>qKG$%Y$r1 zdC9J!YK(AJghl7NOR zIxzwF!2AQzVpS+m!!@bD$}Y-VvNYjfXs* z&i=IM14fS%08bBNBLWi}I}f7`-$aZ;Gy)p&m|hzO`x@JcR~%zaL>|A6;OeQlU0B4Mvz@-(xd7=4bd z)iS8GtTTgkpe^C91?xmQ^l6D4lc^SA-!&m$%bR`6fg4}c(ebCfu@K?Z7mS*=yq4Enzj7g+YSakJ&+6mwiau0rfii@Yo_8%>Y+S^TRG;p>Eqf z*GR>&YUfBxT<`20oi7Q9ZQ0xf zFOZnrlmq${t082=)<$qI&%&f5JQoGvjYkWImFsfW5sTG1==%8+3Xa1fY6}s2OiuLr zR^$;L@#fP*pn|c*pTpfM9({EdASVI7kp-9p?q5m10(p798Ukb263?g?%aQOa_Kq}~ zXlO9j$Mhd6<7tZCSPAT)0(P_04&nw;frsxUBar6lK7lRiEuE)ul7aO!ip!BK%aP$& zWPAQ5Dk1oqn5OhR$k}`b=;L)XH+$MO3m{KwV8-ezo9e)zq^glLAO89Uk=F$p|jn{>QaVKqYi7zv*A` zR}v1aOT6Od2SyD_h%{2kw>s&+0~I=75oO2B3@4z1q*K=uXa~@y-SB0@OZ_OIR4FPKkl;OyI`B|jX~82j z2z`?H5y)2e6@LLR4Doi4=aU+b?!JaFN^&)ytdXf^!xP|yd=JSoKBucH4X2wenh?yU z0cIhE_;AYODq)C8aTeGmZTJB^*lv-GAc)gvLkWX$UxWl~m$MYqmw}7}qu1`{FrYgg zFd2ZMOaCR1(}KJd43e*U4hM|M;vt9g;wMIvYR@Q!@A<&tfSy7D1W?ohyYmTFLp$Ja z23~FcF7&}mYyItEp^eNxQw71bHl&Yl@X}?1h1GK_-SUyBdFEWku>Z=L^@JooxHGE) z4j-^cYN)jly&4T7_ym9~AT>a(+i1*^xUU5P62)Rvt&|baxvL7g^`#x@o*H(d@%p8{t1Zz+@{iHuOhFr4u|{EGPe)4T7XcfOvA( z;3ceo2HgbNzTVgjs<#c?mmbHnBj?5JqF+Qg%UqBOWYhuU)<22xIU62imGDPw)Tgt%l)oBO zPiL@kEm{^^bStPPWzKcXL2xJ6BmJAAHL8$(n4M4+QGr`+xqa6n{Ib{QgcC-7y|ts) zW*mw}8==9(+#OFrdLu6AQ6haC%d8Y}jvdFx@j!7s7<-44-pRzGf_;8LQ1sys9})Ss z^kFHyCwgQAnYatC0t2JI`~up8{9F0}^Yt^2LUm2Qp@@s--oK{%0tO=1g#~YC!Bhm9 zAN3pI^5{HN)75sOEv~*p&sfnA{VQ0-G7r?zJfisdM+L=e9TcBCMz)tJCm&FGk6C#o z#xcm_L{u5|Dl2JaRT(|4tQup6%9?Fu)fl_5XKqiL;9vZk;$M~!RqXHJWLJB1G8i=( z(^3Y$s;g2f1#i)E;vR=h-EMl1^m$;!jG#+b$O17CoZ|yh6YqEoI*!9-WQhBEn6m~8 zp9pch2{vf*OZa?*58A;(Sf6r4G^{Hxg*t+UGh&@GO#e(4{_L*rYKoZe3i!Xwv`1?EsZ5$XRVQ}md@V1f8}bt5NSLk z49rzC;HySBjBPkrShVFSbeHxh^i#pnb4|{KE<{7%6mm>~f(Gmmq3dV~N)7gLA55ty zNI;ui+JikT?M+X$H$=4upXQhV+A9rFkFuM4@_^Ju}?D>Z!r$3Lj=dOOJ(uL*Oow!YDbd}%?o}3)LYaT15g!@Wrs=se@Aek zK_lpc_v8p(SBEPDt)AY+0!2?H=!vT&h1Is;4`&wk*bklp0Ul13x()f^+ckP~KSbwrU;P?|xL@J~VEh*B^iU z&&k{4MBeTNV(Da?;0Rs!QI@md zPg+^-6-bN0jisSfd-RMhw=^8z$wR=F1EmUrfQ8`y*5b;U0aNua_md*JsVtQwFTvi9 z`vrUTx7i7wjYwgytNs;)w(*My8I}Lb2>F;G+4LX?`Q~pagd7Wx9Y%o-LI}{SSQJ5m5KLAp(2cO~-*1FnKD6uRVwd8I2 zFsSo2bZK2_bjTptrZ^j|yvAhe&Y16Ntx%hwHSf>D`NiL(NnumQX9F<`IGe$XATcS2 zKu{;b#V;LzBQ9YR=5aTo3g&OB`%=7a5ih ztAfTS=D;5xmV>s;*rBa%7asUuXYW?`*SJ+gj8ypLfe(d*zw*hpTJ6?_|0B-$M`Y^i zq8$_g2#+8^3R(V{Fg7jegQ-kR4OqUtCA(Zy=5_bck70bp5*5805L6WZw?hBEJaH9H zlP0FF47ZNh#Nc8)w^b~ix^ne5S)BFUtS~>!%7-cxP0zE_mWz?ODD7aWbP}{Ypa!b6%tp~qHW`9RAcwB z_1lcc;P3%AaBt(KA@N~P;Rj*Ex1t;)umu)GP!mWFjA=XZi@;=Np_f66&p<`0<UXsJALTrPep^_Q^xE<6`a3kT_Vi29%VeF^3Ck8#pB zGhKIQN|j&$bv_?v*ZHT)`)D(p3l<=6hm&^?@{n+Z(@@QWl5n__FkU4DoP?1o;Z!H# zOeCx_06*3*kT0eWur0xd{sO1iDFXVLqs}9mpgvE7LVK2tbQ{qOU$>F(Af3U}{{;5K zt%%w%O(&j9#jp2Z{5rK^6)SDr)l(vhxI2n_+3zMmyM+wz$5e;n8{z%_zokN4s_8N= z7!115*M$)st>Ji%x z?&*9)yzCdid%}H%dYcVP4sVyMw|c7h3HQb7?Ts(xZJc_`Q}x2??cT2?Z-jaq!dsRT z?qTZfRh4(PdaG7>r{RqjangU=P{NVhwvhw6>~|@&;Sog1h}HjVyg^TL8AlwIT2BX? zW@Yu}2^ds0euS#gC|JdbE9`%b1t5)-*XgnSr2=THa-CY|5D*C(*h>1}Ob`!DI3FAHjmFkT!0km|8IS)?O8nC*F~K+$ zC74xf+^(|jwX$lB0j!+rV7Yj!jn%5y94Tg{eNx75W}=%e2TX_~1@K+;XfR#m4sFveb0@O?@?F7>ssb`X!%-oBpah z#i)V$#*iuo1&J8OeRFplG$U;|Y4)6stBv{?Gw%f$X}(z8Tn@pLQW;==SwT!HP5cq! ziVz&Y74foBz&31a{lL4A{tT!r1yB@*^l+IpcvPqq!d185lLnHlufRUGLvL}j{vlL4 zo!uJE>OioNK3F{4^%1iB3m4yK9<&u}@D5IRC4$;{P#wV{$ETLCsg(g`26z*H2%R8c z4PW4rV$n;?mb#%wxMF*8;a?t1LLWm+3Y)dEZFA2P`$J=@sF}H6n?=i zTSM|iCLVG|NBEM4C7CFYO0sc%veA!BGmX>)ftLRW@ykL~G=Z!O>e&YV@)%qQ%v>XA zIY)8b_z%80xn5t-7YP&YNbIc9RuR+qZ?UF-qs3qKYGq$&-ces@$*~#QlKn0pK2~)C z#&-hlBfg=UTF;eGS*d?w!H&j3qZ73F&YiGd_I1kjNN!^|@*~L#1QuXA5RK4g6qTR` zKW2qN@PY<7b}-9w!=Y?+GZM^r4h(67apvt77dg0m=J~P?paWb~`Oj4RwzaNi;7--u za?Wmhr0k`+M>B{KBPLmtYKdQ=|Bc4OIDfP*`)pUo=V(Ryw+x+wFWc+A?L+&(MYmn$AQN4bar){q>V* z2^43fs8OBIH>UHyNfYH>T_ZTCC1Z9jJpp-tBGQ|>x0&bUo1Ga4iFuP zjalQ0M&R6d{x<&0Z**DoWrgNqruNIBny@c|=u>+M?&cDlh&Geiry-~hxNWtUAWjVo z#1h1sTW_2Ru-9c51FbN8SR8Q362#35T!M67^74g^#sW8y@8nwZ>)cjVf$o zH>Q6Xtk$UHr)H8DVG9TmvMD=bh zQh!KmabS9jgH?-pPK%jnQOObeUkDNmE=Fk*3_#=tFJ^2B83T+5C>EbEv?W~F5r+I| z{voSUH?-z`Sz((h2CL(_;WDhzi-h0u-hYO#6t>fnC#6o%^vw~NtJRTYbp{xMEQK|) zRmfF;%b~27%MQVs7R z$Rc|XkA89jcsU!Av4xnov+g-03o!k&qo;Q4g0rPrBCqr`d^;nf2L}6E!?Tfi1 zg=;zw$Ms40HCCTae!^3UV?C9HxKZg%<4;K9t$t7fPD4O1^rOvM{QZ4D%SGh-fqy~g zqmwxwV55z3YSjqpAx8;l34DhqnR65g9q6GGE`eLa;Tyn?;G`+|ir~(BN$rz$G8Z1& zb><7m#n#76ekwtI#v;HOlFhY#2>po^ehG#fZvHV#LnyNRH<&Y4$uJ?rroZH^KhvJ4 zLSZC9nI|wz-4V% z&)ChI!1OnOW`*OP;j(S9BS9n4D?z*-Fa>Cly|v^8_$)(H?9Z zM(k6WjIwRfezrBT+fWv@iA7%C|Mnr@O*`3 z)Lo_sb@Po)4uw;0W_~UAMiZ0sAYj6jo0XalTHR{ge=66;OW54TC2vL}-f-1H2IT9h zSfZ9l#ZHRocUs|gz^U{*)JI^#dgESn*Lfsp!?>tROC#~7T0sCR*9c<-pn3vDKp5jZ z!KSe|CWj{CJ~*T0cU&ByrCc04_;2bz@#iIT8&1YX@xUHxx`OziwWjZakf?6zI*pKnGPNDptVC;m3Ay;%Z&RV~A6$T)}TV%`9Zk7ej8keke*t&lm3$kdPMae5Thm%reo**8=ZIpC*>|7#TWgkJ<|4|G;R9cY zry5^fMBp0!w!!(i6C~wYijW+9i7}iU(`I}NA4?;k3~-GVcniwm=HfSz0^9^CqNof| zE_{rrSa73@s8*$Yld>qy4SLXTQl4hKo+FrgpIn5J1S_0Ac1*z(Wlro>}OB3Z}Tq@O5SK_QlC54 z&=jpX0#Bj#ujW_ct_xwn*=3X-#-%fL~5`LQc*dLybtoB&r6KDJ^&zo z0{*7^_)i{a1qy0UuWt-4rKfD1>T|8+TtmL+iCKsQ`J@rrk3L<{)OvHa)I_Bl1OgStmpN+#ZejVFeEw(S>tq>IKjZh+r+sT{~W1P<;FGbA8CQjT-bYa?L zi29YcaJM9W1yG!HYj}ZW42{LzfcYo;5SNYJK3F^NA~+v;yo*5bKNxlL?f5y^FGa;O zqzy7HQt9OiHjFd~RPGGn@y)t0H z8quJeDtFkm5Zsuz9B1C%fEB9tZ*>0~k7l}HK;*F4p}C>jt+Q zCf$FKrs1J$h9)9AJY{vjRMLGBGU(h*WUO8R>P;&!90iPuYe-|PWgZtog8l4Id(Mz& zELZ!;br1_Xhns)2bHLMh+U85|>fKnbU(iK31ow?E&Ty5E)CilbVgzEE{-e8UdRSS2J5^}`Ds?PnV*DJ}!YgAv;x~F+i!M{g0bsWT zj6YHmf&&D?Wjz+=#BK`V!x5#}e7I?j>5o}(jFzuSkeI2&VFTEhj^zc~lb#S+G63D+ zMulTKA2t0!s}jC|XTcGK_V(oxmWUpukBuZl8Hte*40TcA-X1PA6dRHl8<9|KxsJAH zD89&pJMo3Bb@pEg(ns*U>Hio`a15RDo&g=;7JtJ^r;w|~tf>ppp-PAjfjKe#kD>zX z3yD}kI4)yVk#6jO&5Z*|R3Gf>!mu8`+6S-BtLi&Y;7dx($I%=q+(i{FMI=eF4P zhT<(9ejG}a{^K(u88Lr6jA%qs2dp&t7U`#;1%M9{gRKVgdIjWF>fwQdCLgHxeyRp# zYht^Q^_$ye!!zh1+<9Ifh~zDAzwG>oo|8Y#J7=3`TFASosRFmY93O8tSH@r5**{d+ zw)eflmp6B0z1-X}$ZVd`?0Wg$vhu7Zy*X0Y7Fx}>in28ek5Q%f?hNTog=;n&S!WkdVC zp0QkjfD7W{`T1NZq2$u@hI?Hrl(6ZKOQUSplyHjia;>KPAh&lOQpsmXF(xmQ)WG8unB*#?p@lNtg zNuI2dPj!+fN%AO_T;wE=mE+lo+KZxl23AyizGQyB^Nr$M@w?&0vXN_C%L~Q zzowE?aA!&K3o7|6r}Wq07Fbs*`D`coLrK0(C6_qKZ%Fbym0ap1w@UIAD)}5Id8H(e zR>=zgMC_j>xmYDfoYMD7@<1jh+;`#ylQdT4ntrz`eTh?gp_KmYMj8BgC;2)_ep4k^ zImweHxk)8o>LibozSwU+W~FCdms_a@0vaMv|{m$uTGS5J|37$%~w1 zevi}ipQVy-agx7T!Q{azd8w29ktBOma>7Y|Qi+pI?1afxkV-4 z=Oq6{k{?&ee{hn2FUfbRLs=}?p>P>E zG?G#kfh*`B6X4I`7hr4QnVP3!as%;iv!dCES)8ut?!&IXgRU0>Xe6Sa(H7Q+p2A(c zk^10xXU4o^w5ea=tEn(X&)CcDC;$p%{lK}4f964n`9K!F501@eh{KJ>c<3bI#6X0w ze#c<4)e4hv7r+n^pS_&>!AX7`p`sk7ClVkow7*%Q`>z04(3l*^LN5|DO&_``tPjL@ zU3SEJKVQU@tam#L<7G$1PF_V_!2%8+d7o_( zu}|j&@;Yb=;mDu&PD;drjyyotb)42br~rCcHhp`ki?`ZP(YUjx%e8D9%;sS5xs3R* zPryS z)vO@;Vpc@Y{c1JO(OkUoN>Tf z@s|4k_4`cMV#J_ze1;JuhnrAx=OQ@S{WZL;SQD|{*rzCx!Q<=M@8a4%eH%>xI>Dbt z4PZ@e5A9WD@heAXq0!S(t#}K!%g#g|?@_w5*;ofv6df;69Y=9R zjw*xrQFM!i>yDdQv7poADQP`M;jDCrERcI8CuCp-iaH0_WljHa4&5ID^jJBN!A85m1-zxQ$x0(h)255Z2twa1I&pk14uA zA9BNP@WKjyg6^$Q{DXZFy*;$Yl^xMHM-K_%OR$wwtFrfQi)3xqrnW_n-5j3UGFl(t zV{im-ztu;0_LOI2d82*2&*C?}b2rr6NHMx;zr5p8Y|{KRUkvNGt5pB85&=f1Z-fhsQ%Ns^yC*dB9;w%}&^RY;3b??Wa6L#C`{t8c| z<5u?%*3(KbJC}BC6FJK_NYh%gGspo_>3XhzF&mC#2kb=HMY;PHS&69l8oY9bNz!FN zs-l5aY}ml^b*Y)RhFM?@^ZZ&FrU!r)>1{I3J?P%}6)PaI0MNh9kzkw!);O<|k-69L zC*kJ#r&jkM{Hw-x7@pMFj<%j`a5=Wakp>r8k(L+$H6iyHLR_gJhK&iDw?9pYGyb2> z;>lySu)pe5e>g9ND6Fpi9ffLU zYuwCS_;;W_NS~Zqmzr|A-216GUCyp1cIivF0%X0RV?mwhAp-Qp^xVtmklcAUq1f}M zKltv+_t2Y;y`iWUzZw@GB`e_{8!o_CKn1CQqw@Rf!5W*i)A(GYo|8DtF7F24D*~tn zEox^#E5>tig-Nx8ujEGA5ou*dvM_exe|2((G!*+xe0~KjaR2SK_?E$l!p|-*&tdp9eZA_xHlKek)$;NW<2O! zIJ=|O3433-7`P;!=13zrXqL<^C&vK>I}XtS%d>H5-EG{C2SKbg&I~{*#dZ#c1|t4= z@3U?b%ebNac`jLRdCOAw=Xf_}L%2cJGg$y7F&|Lg&xZdA>|^MJ`cb|=BJa^tfaT(8-dXMw;lrfU z1iK?{;WG*M4JgM~{(|fl<7b^ajDIr(;{ah5P~kGZ#XmB4P@kGtR$k_EO)GV`UkW2( zo;Ef2dptlnTg9KOmzR`QRlsvLWn~{gJgqd87rO}C-`?j!1F$)ir)6!zBR{kyB4y39d&7mDg{{e^*$^0O3Oe7#{6T>sr3{GQnD4rYPrX5xJ@Bhs z(|MLZdf9g4d7!p<3-HpXen+gQc8mW8utbGQ8;{o_#kFjEG`oIFEXU}NNrk@UMfj>c zVA5F9{X!g0uJ~~=mR5TH#ai<5{2-$smh5T*QuOT>o4@87Ve{Gg`d3a|1pr(IE|oL^ zcd~MKXyqnMlrf7DXn2L+5`{HgeYG!n=QdvG%O{Y+hBKTx~c(XubQVh5JVHi zFJmqssc)FU!wZlmj0i=Mpq8xI?Y#pSDd)EUOn(Cku(u%Y$;KndF9)diB(*H#MbY!_ z%ijcKVgHag!#6z~ojCwYcHEhmp5!nMKk1fi^-L0~ShBOzE!i%0k5zRCcB`BJGj&re z!$*tQ`(U}=Tv5EE9AB1Qvithz)iXm&z8H1&^|5k&i@uu{^N5U!K5gCyLrcD#asAcd zM0S2fpO+!Vn-M4r32fgO>uIST@x|{E$rZ5$Nu=VmpZZ#ggt3Mv#jq}7X62>6m zdFm>OLFFp%$T{;-V&I%PXg*_;*8F}z>$8bhYy_yC1deGrrzJLCcOQz<@itGZ+l>d( zcfy^8r_i33K(r*@7HD68fb% z{I0+k@FpB@t~V}_mU4a%(5kiMfTh~hkv@2j%jRV-db@0%XE6`%0SR5K4DRC{#P_l6 z@JRCfjHO3}^e=F`LFGlf#@K-C9Zu&xE!olhkoVc%@%Ox=y)V|E7AVYg4PUnWv?BaQ z3O9xH;oomH62r6iw0NSuLwaU7z9u^{+_R?zS7JG@IpL|9mC51R6~*o4CD8O@ReM@8 zqhkPe!A~@;6>cimFZe#R^^*$h{Z+u_5YRLA(bV#z;son%W3kiNAk|o` zM+kcvo!RBO22&2i`6jpei$bi_b@HeWz~F=Vfbec$F`5gj4}-}8k>HihkY5%Vi-)7K zsAj?w!J9Bn*zO4WkubSHNS~JzL8OlkkJcA3>ktuVd;~#KsSn7<%qI?osT>W1pv;Y! zqkkjFvoV}C#Zz`|_M#8VuJtV58AfCob$bynUr)uEyQw35#qE(SF!OSKOisCuIl~3B z;bc{gHZ?O`wkGN`;q_TFAXL^q`&0Zg=RWzsU@|8Wo*G%|!zd70*_T6xQGoCSM$M4wv@%%^)Km8DJUF-?#19 z_0aDs^nK;}oE+mrh^&fYu;&UM9NHxXM|q&sM5bQuE7#k~bt9y|k-Q8@&iQ>fnZ0y) zSu`(uQBVGO7Uk$$^%kg1??TS{-~`c<*>&OMfOt4-6K|#4GA5amSD~*7#n*#^aQagp zo?V);=ve3^rJ?M_N0yhBE`_&qH{7yjPy#AFH5JR_P1t z*OoXZT6m#{aeYMeu!Hdj5FU&&Vcu_fPpmb7J-!wdn+#XMrGneM1yQp0^@v)j-Btk! zx5qda{JdQ60}25pc*Vo zq`eD07<`ID^s|^xKQbS12;n_i;zAF?EB>ca1An1ZVgyu&;n{4GM?Xe*5@Yf!%9_0m zVW?f^I*g8PS`dB^1_E3n>x~Ie;)rW}j*~Y_GtTUCAeUh@3krbgn2V^XBI1d2aGMVl zkAcoNGygp(d^>>{xF0^h9z){hcm?9>E}jcL@eyokczvK&#BgBlygm(4C79SCf(ybv zycT);g#vgF;+@%5cn{*e8t+wJ-_km?jHGHLLAKSA^zmBj?U!JVmRQ0Rbfld{mnDKM zDsI#CigEaTK$}`I1;2m7`*{35=Y6(fF@6zQIy^`PtpE=NkwoS1z|kX#iYHZ^QsUx& zhw<%SdER|Lqw^om(TL<#{~9!^6B!das|m080*K-6^Pe|#{+AWrW&!KTNesJmpABph45aDUS5Q1phQ_`)z%UXyOHbE48Ux`v%jSvom{I3NE{zAd6 z216&@5g$aoX5PXhto@S5W0-|YBdESKBna1T(8F$n|h@7D5mtjxt+bB*t zZpEff^w7>vjdPsFs6E8xz|C()S~hlpair9T%4q2a^hxwoX*E`wt^aH{K4bV#VuDCw zEB+|}E!lWOrLzKePVI*b}%x%maD7V#) zhnCo8WG-NGOK9Cl4|F8#T2N$dz82OCCVy8L$Im|WtbYCvq^~&6H?>*<-vwY6yeD)LlhTF07m{2|ZMm-k)X5Pq9y*szo)e&?N zP%(3DRxmV87hY0b-4i~l>B8EJx#l)qC|wIrOdM_fIuG4jL#bo6$NDMBq*1Cy8^+9D zm~kG8{#nAQSdHptUa>VEmO;i<#`5S?8vcUS1yv-xV4d=v*#EQ)nIM93{aIc)M{}eR z?PZ=Ai+Oy=kK|;@Rg4F)$QRJ1ymdKuYI_D*X#FlvB%6VbWIyfjf7iJ|2@iz&67Gc+ z2micYdLsQ*E72c_Pb1L952O}=2BIRYV!{nOO@oH3zajnq<(G*;u=zgh#s?4BA?nF7 z^d8Ghwz)soz;;FlH0_Q&8nS@D^!Y0@%sX#$EO9w%UC-*tS2wK<2`A_YXir>}$BBTK zj1I*dF~hSU5Hs=ut#zaEHp}8286LlgsLYN9ybQD&xtp{nau>uro7S4Sl%3|5_akCb z&hO^^2q~AYH={}^M%HOrlnu1{vxdI^IC4exX-em%znc1>x_$g2Y{nd|h9_0EoqJR2 z`>9W>+sCK5Rqbw&DTJqI6I)rUhgZ^GM#Z=M*blUub3d4--F#_QAJpVXl4~w?_H8mM zcP$+~E1n0BwMDy4M?$wYI(7XGh*PxNUWYghHVrs@4#%=%B;hD@EYI)HJ`_bqthL<0 zF17j4%~{X0Bd^{5466)cBN%;kd@$PU3zlpNmh2MXPiOcU8B*10cU+K~ zt)cm%&RqU4@$qw|pP%dJZ~kn}Nd9O0__@N*&zI-(yseRnxPJ3~`})0h`})%!xqh}r z(WzYTx!=D3Zo7T`Ne@?}sY9A;G;Neiu*tG7b|0eHh9qm_1|4{{rJ)DXV2zCYaE*gmTy|HmJ#^;c)iJZy(#1Mri|B{|IT>5nHsM*Q{(k!YP{b3 zKOe6fjyPVc-u(P{$upllB7@^4&ki3ic{XgkR=t@yUUD}yUUHW?UfOR4)Q|~w7=kwe zMbxFsfb60s1=(%L(pfKAvR)Qv^^u_wh|zApi(ebEH6YuY3E7fi+1EAk=Ta+8yZI6? zi7S2lTwe<3H!J3zM z?lIaJ_>zv=5*)|6gB`s&;hVM7oQbi+=0`hC_iCq&R8=8{7}H}k^~xade2I2i5dJhU z27Wa(#ve>>;b9#Q;bQ}1U}{5Sd^{=TiBFz*HE-US$Zw>^V60%+0fGaS%3B_wEtO=@6eQxi_z?W zB6_tiRFdjUPIzjlGJnK%NUQIdug1wK9Zmrf$@}?#)E=vLk~{hDS-?+UsciY1){8vrmRWJQKANr&cmle+l)M*!7p_?Id^d-@|`j zd?E3JVe1b^%y|AW7bKI_W^>b{fG?IMzz+4ZUoTi|#Aff0%|5swHv6;I*~v|E|6y$Q zr)YX+ACL!JKZwo#M3QR#asPg7_Q&Ku#5=G2FMvXCtz!#U{+9N=JQvEHtCEus>TQS1 z{CaEETw;k6GT*X3oFY=rn>@AVc|r5K^4gLQ`)k|_baT0(wfu##647C)nB0|DmTA#8 zb{4|AyOL($6L$y?-`jpk9&S8x6BWOM=*myL4z2l{b~4WyK9<*cN@5dqaR|c;$(=3j z4Xaj%n^rj##aoOM#+MQLJHjWSO`S)|`eTt&^NqGCFbPqm^Vkf1;?d2!& zq^JgI>7>LsT802)9egp9s_7vIHXlbQl;0JkiGym^bqD(uO4C5p4 zN@TQk7xQoC@8ltjAu$0uxfdA$s`BhyRnuPK>9$%O*Qm;Dn*i0 zt{mb|l|Cvu^%g2u(dT;CQX*NfbS6-ne+^H~0c*5;FZyhfqZ5$+-z0;ajRGWbjhSCb z4(nXr^K90JM#{!7YO>Cv9cKP`-laHMY%6zKnw<@PZBtiu0~9ObH@M+F4X3v+0DL4O0y?zVnR zWi)GaSN0XRW;x`0SOnx)&=-!B<%+7u%wHyD8SXsmFVq#yzma?L+S8)))Ycm(){5fD zshe(Rbl^~A6f6d36IfVJ44Xe;xB%q6R;>sC;c4ruPZWuV-wb#-D>h}X0WW$Yl?7t% zEF0&kY0w3|?Nv2cqYo=yxzgia?T+zl4~9JsG@@7fBiDsoZ5R?)O91VXQ2iBHVqD^x z8Fv#xs6DI)Onoe3URnI5Xfd{4R6ll1(6!sBeEAj@IBK}=TP#ub9IeNLN%SIHrAub13kmW&5a2ceUnjT4T;1C(Fwx_fBtznPWs%F(pq!BjIx9W?=4H} z6%FpNR$JfTwyu90-ZwrrCoux`Ux1TO43 z*A8D%u>yz8ib{>(G!92a<;q;Lc?=gd_4T_N!)NRLBfQ~B$Y}D>tjmP5L0ri~6(rSs zCS}waq+gPRcm{VTu0t*m#xlHC5RcY8CY{BjvW!k#NR7_$ML}~e8EB_OyHIt!O`^7b zI!d|iR&if4iAUR5kJj=(^1k8%t@)>tFh>XDmwBvv-=#~j5xqi@>lLdD!&nbSo(sbWaaPxqV8yCpfg^tAY6q-ROBWj zemS5$tJwN4z?L{s71tHA&CHg=TkEd_fcNSc`v@J&9w)Zs*4f37A*F-G&dV%z{7|u> z0w0}9Gcz{G48gB;;~Da9(4OIl?VsmPbwD?l0BdJk9`OpFWYbZth`zRiko?Vmm<+;=G#~Y z4gIxfOb7SS|GZC6|66^^{#>8B{;vAu{onNI=-0lmPsBROm>$&Pdr^xQ3pz5h_g)Oj zQfhIg=ubjs%7mG}euxzDf#fK@g^1vd*xW|U$JO9|?LJ%-(8tV&ve<83HBrnE`k?Z( zJ1;>xS~){7C5fg=VaK$VEz}fUQRvoMo+f2h4=N(GJAT6hPUI@Z%}7L^);<(H#82_T z@7?d>euvzf^L$pPO3W;mui~@ZfNGqx46LnhB$M`MA}7fwB83^%FPFoKDGX&+@faO599HmrW=haz<*yIL@ z`4oz~+YrRK*}+2&Z>;vw1yrDoskvXT?9}d_sOG%p{*+aScDK+TA#>G3VuY*d)RT6N1&(+(vYn^V$Fou62yeebOAvWA7&?DLIAew z+HD_GCll%mkG4ihx9Ts(sk|dH!JJXlVP!q!)S3lhrOeF6yp&7=MaqkAFhff|!>+0r zV|6QZw9}}cK`qLXNgYJ|Lu|>VT%4*x@!D2#-5`3Fxy`~SBiW`-tjDl8H3WME@riXB zIL{DV=V#>0`7fn}bddG3m|ngKd?ltv*W@{to!6+2yJzKzki{M;8B_9=6ZA}mh=@)B zDlC>ER)f@#%|fb_s36e>G^00Rb%KM$Hf!Z(9yL897-a~X5^m^s=*hNP3j`*ZY-<8+ zFMQya&IIGgeT>z+&H5Hx={D={khAE6eb!$j!9*;?O0?Kore4Zk1Zu{fWf&g&Rgowm zKxM58th4iHrcoJS_J=+hIdP(U(4$_1!Y(apz@H7|6^h+>Ke$WbFrwF4a|qoWU2VWs zhmWT!6iRZh}uXs}ATcKH?09A)9&Ih*_{$^?M| z7oMI>hEEIDUk3ScS%%?+Gi74s%rvnQg1B-(i?ePA(dIL>-$t7oWP&o$=EFQlq0JwW zv>t*aPod4lg6r;+dqJCbtHdDMTv%*O-G!zPxHtYN+_! zKDAuqwGSycg%b>zUDmJmDwO$d74xTC+7koVpvx;DSM0w z^h1FOqGVNO;7WxU!Id(~bWL!jLXntc)O0H&NQEa=Y)0#^{nE-+jkOXeFx;BGzxtDqTalc|4|FKsdPPxA?Kpgv!+Lu$57ric+HAGy2; zoVT#Dwq3jJC~!A?v_CvsPGo|F|NS0?i4~uls1op6c5dUJWOTrR-{IFD0R>yQ&oNXC z1~~9VL7$A6-TycMX_X5%q);HcQtc8!fw#8vsOcHOL`Oh@^#TfDaqA=?iD5hWbcF(2 zt=n0S+pM+o1O>h(EVQ7&mxQ~Bu~-|_^K&N(_OoR>gEsY<^mcq9fwbOkrwdILtUBlb zOpXU&gu?%2#i`J*y@18urNhrP~rf52PZLeuLJG ze}}`m99BMHKKLlF1LmKE6|iCFN`alfO|fC;Y~l9>b^Q=?b(8c*|0sg@)pi!4S;7#eEGL&W$ zcv+3f4A}%4Q;m95Hi120VCJ-)Pd^ILy3YEItmV`L^BViv_jpEF3XVdMIFWZs4sIj+ zqpNn}T4cTQqCm{tozTnS<1s55ZEaCc2=|x)Ll^hgZ1YEghmWEHA4YK)1U1U&q#y`% zorWUlT6>5mL#-(yk&$>|g6!RO8N|rQ6frU~lNjLuSx~7z!;15ZvSnCt9x)p=`NZT~ zYBh89m{A1&o}cUp#{3?T_58}(hqT)k0?}a7V!@+s39K78TxndMoCoI!$egf9{htuAWYI3K8~bYl5YGnnn&OYnG?=dPO3zgNS!8ct7Qh=V_{njQE@1<_#qv^ z7mlANC3UX>8THP@5C1qQ=kvLNBN3Sq^2C-IafofN<@S4Rh@ z-Fd#`tDH#*CC@f5E>6IIqYzMmC$4*zZRvn&O`an%E!}G2mv0#xUEy

GpxG*)0{X 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

&joN;x2d1Y$5mQ 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 nr>$ +#include +#include +#include + + +#define PY_SSIZE_T_CLEAN +#include +#include "structmember.h" // PyMemberDef + +#include "greenlet_internal.hpp" +// Code after this point can assume access to things declared in stdint.h, +// including the fixed-width types. This goes for the platform-specific switch functions +// as well. +#include "greenlet_refs.hpp" +#include "greenlet_slp_switch.hpp" +#include "greenlet_thread_state.hpp" +#include "greenlet_thread_support.hpp" +#include "greenlet_greenlet.hpp" + +#include "TGreenletGlobals.cpp" +#include "TThreadStateDestroy.cpp" +#include "TGreenlet.cpp" +#include "TMainGreenlet.cpp" +#include "TUserGreenlet.cpp" +#include "TBrokenGreenlet.cpp" +#include "TExceptionState.cpp" +#include "TPythonState.cpp" +#include "TStackState.cpp" + + +using greenlet::LockGuard; +using greenlet::LockInitError; +using greenlet::PyErrOccurred; +using greenlet::Require; + +using greenlet::g_handle_exit; +using greenlet::single_result; + +using greenlet::Greenlet; +using greenlet::UserGreenlet; +using greenlet::MainGreenlet; +using greenlet::BrokenGreenlet; +using greenlet::ThreadState; +using greenlet::PythonState; + + + +// ******* Implementation of things from included files +template +greenlet::refs::_BorrowedGreenlet& greenlet::refs::_BorrowedGreenlet::operator=(const greenlet::refs::BorrowedObject& other) +{ + this->_set_raw_pointer(static_cast(other)); + return *this; +} + +template +inline greenlet::refs::_BorrowedGreenlet::operator Greenlet*() const noexcept +{ + if (!this->p) { + return nullptr; + } + return reinterpret_cast(this->p)->pimpl; +} + +template +greenlet::refs::_BorrowedGreenlet::_BorrowedGreenlet(const BorrowedObject& p) + : BorrowedReference(nullptr) +{ + + this->_set_raw_pointer(p.borrow()); +} + +template +inline greenlet::refs::_OwnedGreenlet::operator Greenlet*() const noexcept +{ + if (!this->p) { + return nullptr; + } + return reinterpret_cast(this->p)->pimpl; +} + + + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wmissing-field-initializers" +# pragma clang diagnostic ignored "-Wwritable-strings" +#elif defined(__GNUC__) +# pragma GCC diagnostic push +// warning: ISO C++ forbids converting a string constant to ‘char*’ +// (The python APIs aren't const correct and accept writable char*) +# pragma GCC diagnostic ignored "-Wwrite-strings" +#endif + + +/*********************************************************** + +A PyGreenlet is a range of C stack addresses that must be +saved and restored in such a way that the full range of the +stack contains valid data when we switch to it. + +Stack layout for a greenlet: + + | ^^^ | + | older data | + | | + stack_stop . |_______________| + . | | + . | greenlet data | + . | in stack | + . * |_______________| . . _____________ stack_copy + stack_saved + . | | | | + . | data | |greenlet data| + . | unrelated | | saved | + . | to | | in heap | + stack_start . | this | . . |_____________| stack_copy + | greenlet | + | | + | newer data | + | vvv | + + +Note that a greenlet's stack data is typically partly at its correct +place in the stack, and partly saved away in the heap, but always in +the above configuration: two blocks, the more recent one in the heap +and the older one still in the stack (either block may be empty). + +Greenlets are chained: each points to the previous greenlet, which is +the one that owns the data currently in the C stack above my +stack_stop. The currently running greenlet is the first element of +this chain. The main (initial) greenlet is the last one. Greenlets +whose stack is entirely in the heap can be skipped from the chain. + +The chain is not related to execution order, but only to the order +in which bits of C stack happen to belong to greenlets at a particular +point in time. + +The main greenlet doesn't have a stack_stop: it is responsible for the +complete rest of the C stack, and we don't know where it begins. We +use (char*) -1, the largest possible address. + +States: + stack_stop == NULL && stack_start == NULL: did not start yet + stack_stop != NULL && stack_start == NULL: already finished + stack_stop != NULL && stack_start != NULL: active + +The running greenlet's stack_start is undefined but not NULL. + + ***********************************************************/ + +static PyGreenlet* +green_create_main(ThreadState* state) +{ + PyGreenlet* gmain; + + /* create the main greenlet for this thread */ + gmain = (PyGreenlet*)PyType_GenericAlloc(&PyGreenlet_Type, 0); + if (gmain == NULL) { + Py_FatalError("green_create_main failed to alloc"); + return NULL; + } + new MainGreenlet(gmain, state); + + assert(Py_REFCNT(gmain) == 1); + return gmain; +} + + + +/***********************************************************/ + +/* Some functions must not be inlined: + * slp_restore_state, when inlined into slp_switch might cause + it to restore stack over its own local variables + * slp_save_state, when inlined would add its own local + variables to the saved stack, wasting space + * slp_switch, cannot be inlined for obvious reasons + * g_initialstub, when inlined would receive a pointer into its + own stack frame, leading to incomplete stack save/restore + +g_initialstub is a member function and declared virtual so that the +compiler always calls it through a vtable. + +slp_save_state and slp_restore_state are also member functions. They +are called from trampoline functions that themselves are declared as +not eligible for inlining. +*/ + +extern "C" { +static int GREENLET_NOINLINE(slp_save_state_trampoline)(char* stackref) +{ + return switching_thread_state->slp_save_state(stackref); +} +static void GREENLET_NOINLINE(slp_restore_state_trampoline)() +{ + switching_thread_state->slp_restore_state(); +} +} + + +/***********************************************************/ + +static PyGreenlet* +green_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds)) +{ + PyGreenlet* o = + (PyGreenlet*)PyBaseObject_Type.tp_new(type, mod_globs->empty_tuple, mod_globs->empty_dict); + if (o) { + new UserGreenlet(o, GET_THREAD_STATE().state().borrow_current()); + assert(Py_REFCNT(o) == 1); + } + return o; +} + +static PyGreenlet* +green_unswitchable_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds)) +{ + PyGreenlet* o = + (PyGreenlet*)PyBaseObject_Type.tp_new(type, mod_globs->empty_tuple, mod_globs->empty_dict); + if (o) { + new BrokenGreenlet(o, GET_THREAD_STATE().state().borrow_current()); + assert(Py_REFCNT(o) == 1); + } + return o; +} + +static int +green_setrun(BorrowedGreenlet self, BorrowedObject nrun, void* c); +static int +green_setparent(BorrowedGreenlet self, BorrowedObject nparent, void* c); + +static int +green_init(BorrowedGreenlet self, BorrowedObject args, BorrowedObject kwargs) +{ + PyArgParseParam run; + PyArgParseParam nparent; + static const char* const kwlist[] = { + "run", + "parent", + NULL + }; + + // recall: The O specifier does NOT increase the reference count. + if (!PyArg_ParseTupleAndKeywords( + args, kwargs, "|OO:green", (char**)kwlist, &run, &nparent)) { + return -1; + } + + if (run) { + if (green_setrun(self, run, NULL)) { + return -1; + } + } + if (nparent && !nparent.is_None()) { + return green_setparent(self, nparent, NULL); + } + return 0; +} + + + +static int +green_traverse(PyGreenlet* self, visitproc visit, void* arg) +{ + // We must only visit referenced objects, i.e. only objects + // Py_INCREF'ed by this greenlet (directly or indirectly): + // + // - stack_prev is not visited: holds previous stack pointer, but it's not + // referenced + // - frames are not visited as we don't strongly reference them; + // alive greenlets are not garbage collected + // anyway. This can be a problem, however, if this greenlet is + // never allowed to finish, and is referenced from the frame: we + // have an uncollectible cycle in that case. Note that the + // frame object itself is also frequently not even tracked by the GC + // starting with Python 3.7 (frames are allocated by the + // interpreter untracked, and only become tracked when their + // evaluation is finished if they have a refcount > 1). All of + // this is to say that we should probably strongly reference + // the frame object. Doing so, while always allowing GC on a + // greenlet, solves several leaks for us. + + Py_VISIT(self->dict); + if (!self->pimpl) { + // Hmm. I have seen this at interpreter shutdown time, + // I think. That's very odd because this doesn't go away until + // we're ``green_dealloc()``, at which point we shouldn't be + // traversed anymore. + return 0; + } + + return self->pimpl->tp_traverse(visit, arg); +} + +static int +green_is_gc(BorrowedGreenlet self) +{ + int result = 0; + /* Main greenlet can be garbage collected since it can only + become unreachable if the underlying thread exited. + Active greenlets --- including those that are suspended --- + cannot be garbage collected, however. + */ + if (self->main() || !self->active()) { + result = 1; + } + // The main greenlet pointer will eventually go away after the thread dies. + if (self->was_running_in_dead_thread()) { + // Our thread is dead! We can never run again. Might as well + // GC us. Note that if a tuple containing only us and other + // immutable objects had been scanned before this, when we + // would have returned 0, the tuple will take itself out of GC + // tracking and never be investigated again. So that could + // result in both us and the tuple leaking due to an + // unreachable/uncollectible reference. The same goes for + // dictionaries. + // + // It's not a great idea to be changing our GC state on the + // fly. + result = 1; + } + return result; +} + + +static int +green_clear(PyGreenlet* self) +{ + /* Greenlet is only cleared if it is about to be collected. + Since active greenlets are not garbage collectable, we can + be sure that, even if they are deallocated during clear, + nothing they reference is in unreachable or finalizers, + so even if it switches we are relatively safe. */ + // XXX: Are we responsible for clearing weakrefs here? + Py_CLEAR(self->dict); + return self->pimpl->tp_clear(); +} + +/** + * Returns 0 on failure (the object was resurrected) or 1 on success. + **/ +static int +_green_dealloc_kill_started_non_main_greenlet(BorrowedGreenlet self) +{ + /* Hacks hacks hacks copied from instance_dealloc() */ + /* Temporarily resurrect the greenlet. */ + assert(self.REFCNT() == 0); + Py_SET_REFCNT(self.borrow(), 1); + /* Save the current exception, if any. */ + PyErrPieces saved_err; + try { + // BY THE TIME WE GET HERE, the state may actually be going + // away + // if we're shutting down the interpreter and freeing thread + // entries, + // this could result in freeing greenlets that were leaked. So + // we can't try to read the state. + self->deallocing_greenlet_in_thread( + self->thread_state() + ? static_cast(GET_THREAD_STATE()) + : nullptr); + } + catch (const PyErrOccurred&) { + PyErr_WriteUnraisable(self.borrow_o()); + /* XXX what else should we do? */ + } + /* Check for no resurrection must be done while we keep + * our internal reference, otherwise PyFile_WriteObject + * causes recursion if using Py_INCREF/Py_DECREF + */ + if (self.REFCNT() == 1 && self->active()) { + /* Not resurrected, but still not dead! + XXX what else should we do? we complain. */ + PyObject* f = PySys_GetObject("stderr"); + Py_INCREF(self.borrow_o()); /* leak! */ + if (f != NULL) { + PyFile_WriteString("GreenletExit did not kill ", f); + PyFile_WriteObject(self.borrow_o(), f, 0); + PyFile_WriteString("\n", f); + } + } + /* Restore the saved exception. */ + saved_err.PyErrRestore(); + /* Undo the temporary resurrection; can't use DECREF here, + * it would cause a recursive call. + */ + assert(self.REFCNT() > 0); + + Py_ssize_t refcnt = self.REFCNT() - 1; + Py_SET_REFCNT(self.borrow_o(), refcnt); + if (refcnt != 0) { + /* Resurrected! */ + _Py_NewReference(self.borrow_o()); + Py_SET_REFCNT(self.borrow_o(), refcnt); + /* Better to use tp_finalizer slot (PEP 442) + * and call ``PyObject_CallFinalizerFromDealloc``, + * but that's only supported in Python 3.4+; see + * Modules/_io/iobase.c for an example. + * + * The following approach is copied from iobase.c in CPython 2.7. + * (along with much of this function in general). Here's their + * comment: + * + * When called from a heap type's dealloc, the type will be + * decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */ + if (PyType_HasFeature(self.TYPE(), Py_TPFLAGS_HEAPTYPE)) { + Py_INCREF(self.TYPE()); + } + + PyObject_GC_Track((PyObject*)self); + + _Py_DEC_REFTOTAL; +#ifdef COUNT_ALLOCS + --Py_TYPE(self)->tp_frees; + --Py_TYPE(self)->tp_allocs; +#endif /* COUNT_ALLOCS */ + return 0; + } + return 1; +} + + +static void +green_dealloc(PyGreenlet* self) +{ + PyObject_GC_UnTrack(self); + BorrowedGreenlet me(self); + if (me->active() + && me->started() + && !me->main()) { + if (!_green_dealloc_kill_started_non_main_greenlet(me)) { + return; + } + } + + if (self->weakreflist != NULL) { + PyObject_ClearWeakRefs((PyObject*)self); + } + Py_CLEAR(self->dict); + + if (self->pimpl) { + // In case deleting this, which frees some memory, + // somehow winds up calling back into us. That's usually a + //bug in our code. + Greenlet* p = self->pimpl; + self->pimpl = nullptr; + delete p; + } + // and finally we're done. self is now invalid. + Py_TYPE(self)->tp_free((PyObject*)self); +} + + + +static OwnedObject +throw_greenlet(BorrowedGreenlet self, PyErrPieces& err_pieces) +{ + PyObject* result = nullptr; + err_pieces.PyErrRestore(); + assert(PyErr_Occurred()); + if (self->started() && !self->active()) { + /* dead greenlet: turn GreenletExit into a regular return */ + result = g_handle_exit(OwnedObject()).relinquish_ownership(); + } + self->args() <<= result; + + return single_result(self->g_switch()); +} + + + +PyDoc_STRVAR( + green_switch_doc, + "switch(*args, **kwargs)\n" + "\n" + "Switch execution to this greenlet.\n" + "\n" + "If this greenlet has never been run, then this greenlet\n" + "will be switched to using the body of ``self.run(*args, **kwargs)``.\n" + "\n" + "If the greenlet is active (has been run, but was switch()'ed\n" + "out before leaving its run function), then this greenlet will\n" + "be resumed and the return value to its switch call will be\n" + "None if no arguments are given, the given argument if one\n" + "argument is given, or the args tuple and keyword args dict if\n" + "multiple arguments are given.\n" + "\n" + "If the greenlet is dead, or is the current greenlet then this\n" + "function will simply return the arguments using the same rules as\n" + "above.\n"); + +static PyObject* +green_switch(PyGreenlet* self, PyObject* args, PyObject* kwargs) +{ + using greenlet::SwitchingArgs; + SwitchingArgs switch_args(OwnedObject::owning(args), OwnedObject::owning(kwargs)); + self->pimpl->may_switch_away(); + self->pimpl->args() <<= switch_args; + + // If we're switching out of a greenlet, and that switch is the + // last thing the greenlet does, the greenlet ought to be able to + // go ahead and die at that point. Currently, someone else must + // manually switch back to the greenlet so that we "fall off the + // end" and can perform cleanup. You'd think we'd be able to + // figure out that this is happening using the frame's ``f_lasti`` + // member, which is supposed to be an index into + // ``frame->f_code->co_code``, the bytecode string. However, in + // recent interpreters, ``f_lasti`` tends not to be updated thanks + // to things like the PREDICT() macros in ceval.c. So it doesn't + // really work to do that in many cases. For example, the Python + // code: + // def run(): + // greenlet.getcurrent().parent.switch() + // produces bytecode of len 16, with the actual call to switch() + // being at index 10 (in Python 3.10). However, the reported + // ``f_lasti`` we actually see is...5! (Which happens to be the + // second byte of the CALL_METHOD op for ``getcurrent()``). + + try { + //OwnedObject result = single_result(self->pimpl->g_switch()); + OwnedObject result(single_result(self->pimpl->g_switch())); +#ifndef NDEBUG + // Note that the current greenlet isn't necessarily self. If self + // finished, we went to one of its parents. + assert(!self->pimpl->args()); + + const BorrowedGreenlet& current = GET_THREAD_STATE().state().borrow_current(); + // It's possible it's never been switched to. + assert(!current->args()); +#endif + PyObject* p = result.relinquish_ownership(); + + if (!p && !PyErr_Occurred()) { + // This shouldn't be happening anymore, so the asserts + // are there for debug builds. Non-debug builds + // crash "gracefully" in this case, although there is an + // argument to be made for killing the process in all + // cases --- for this to be the case, our switches + // probably nested in an incorrect way, so the state is + // suspicious. Nothing should be corrupt though, just + // confused at the Python level. Letting this propagate is + // probably good enough. + assert(p || PyErr_Occurred()); + throw PyErrOccurred( + mod_globs->PyExc_GreenletError, + "Greenlet.switch() returned NULL without an exception set." + ); + } + return p; + } + catch(const PyErrOccurred&) { + return nullptr; + } +} + +PyDoc_STRVAR( + green_throw_doc, + "Switches execution to this greenlet, but immediately raises the\n" + "given exception in this greenlet. If no argument is provided, the " + "exception\n" + "defaults to `greenlet.GreenletExit`. The normal exception\n" + "propagation rules apply, as described for `switch`. Note that calling " + "this\n" + "method is almost equivalent to the following::\n" + "\n" + " def raiser():\n" + " raise typ, val, tb\n" + " g_raiser = greenlet(raiser, parent=g)\n" + " g_raiser.switch()\n" + "\n" + "except that this trick does not work for the\n" + "`greenlet.GreenletExit` exception, which would not propagate\n" + "from ``g_raiser`` to ``g``.\n"); + +static PyObject* +green_throw(PyGreenlet* self, PyObject* args) +{ + PyArgParseParam typ(mod_globs->PyExc_GreenletExit); + PyArgParseParam val; + PyArgParseParam tb; + + if (!PyArg_ParseTuple(args, "|OOO:throw", &typ, &val, &tb)) { + return nullptr; + } + + assert(typ.borrow() || val.borrow()); + + self->pimpl->may_switch_away(); + try { + // Both normalizing the error and the actual throw_greenlet + // could throw PyErrOccurred. + PyErrPieces err_pieces(typ.borrow(), val.borrow(), tb.borrow()); + + return throw_greenlet(self, err_pieces).relinquish_ownership(); + } + catch (const PyErrOccurred&) { + return nullptr; + } +} + +static int +green_bool(PyGreenlet* self) +{ + return self->pimpl->active(); +} + +/** + * CAUTION: Allocates memory, may run GC and arbitrary Python code. + */ +static PyObject* +green_getdict(PyGreenlet* self, void* UNUSED(context)) +{ + if (self->dict == NULL) { + self->dict = PyDict_New(); + if (self->dict == NULL) { + return NULL; + } + } + Py_INCREF(self->dict); + return self->dict; +} + +static int +green_setdict(PyGreenlet* self, PyObject* val, void* UNUSED(context)) +{ + PyObject* tmp; + + if (val == NULL) { + PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted"); + return -1; + } + if (!PyDict_Check(val)) { + PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary"); + return -1; + } + tmp = self->dict; + Py_INCREF(val); + self->dict = val; + Py_XDECREF(tmp); + return 0; +} + +static bool +_green_not_dead(BorrowedGreenlet self) +{ + // XXX: Where else should we do this? + // Probably on entry to most Python-facing functions? + if (self->was_running_in_dead_thread()) { + self->deactivate_and_free(); + return false; + } + return self->active() || !self->started(); +} + + +static PyObject* +green_getdead(BorrowedGreenlet self, void* UNUSED(context)) +{ + if (_green_not_dead(self)) { + Py_RETURN_FALSE; + } + else { + Py_RETURN_TRUE; + } +} + +static PyObject* +green_get_stack_saved(PyGreenlet* self, void* UNUSED(context)) +{ + return PyLong_FromSsize_t(self->pimpl->stack_saved()); +} + + +static PyObject* +green_getrun(BorrowedGreenlet self, void* UNUSED(context)) +{ + try { + OwnedObject result(self->run()); + return result.relinquish_ownership(); + } + catch(const PyErrOccurred&) { + return nullptr; + } +} + + + + + +static int +green_setrun(BorrowedGreenlet self, BorrowedObject nrun, void* UNUSED(context)) +{ + try { + self->run(nrun); + return 0; + } + catch(const PyErrOccurred&) { + return -1; + } +} + +static PyObject* +green_getparent(BorrowedGreenlet self, void* UNUSED(context)) +{ + return self->parent().acquire_or_None(); +} + + + +static int +green_setparent(BorrowedGreenlet self, BorrowedObject nparent, void* UNUSED(context)) +{ + try { + self->parent(nparent); + } + catch(const PyErrOccurred&) { + return -1; + } + return 0; +} + + +static PyObject* +green_getcontext(const PyGreenlet* self, void* UNUSED(context)) +{ + const Greenlet *const g = self->pimpl; + try { + OwnedObject result(g->context()); + return result.relinquish_ownership(); + } + catch(const PyErrOccurred&) { + return nullptr; + } +} + +static int +green_setcontext(BorrowedGreenlet self, PyObject* nctx, void* UNUSED(context)) +{ + try { + self->context(nctx); + return 0; + } + catch(const PyErrOccurred&) { + return -1; + } +} + + +static PyObject* +green_getframe(BorrowedGreenlet self, void* UNUSED(context)) +{ + const PythonState::OwnedFrame& top_frame = self->top_frame(); + return top_frame.acquire_or_None(); +} + +static PyObject* +green_getstate(PyGreenlet* self) +{ + PyErr_Format(PyExc_TypeError, + "cannot serialize '%s' object", + Py_TYPE(self)->tp_name); + return nullptr; +} + +static PyObject* +green_repr(BorrowedGreenlet self) +{ + /* + Return a string like + + + The handling of greenlets across threads is not super good. + We mostly use the internal definitions of these terms, but they + generally should make sense to users as well. + */ + PyObject* result; + int never_started = !self->started() && !self->active(); + + const char* const tp_name = Py_TYPE(self)->tp_name; + + if (_green_not_dead(self)) { + /* XXX: The otid= is almost useless because you can't correlate it to + any thread identifier exposed to Python. We could use + PyThreadState_GET()->thread_id, but we'd need to save that in the + greenlet, or save the whole PyThreadState object itself. + + As it stands, its only useful for identifying greenlets from the same thread. + */ + const char* state_in_thread; + if (self->was_running_in_dead_thread()) { + // The thread it was running in is dead! + // This can happen, especially at interpreter shut down. + // It complicates debugging output because it may be + // impossible to access the current thread state at that + // time. Thus, don't access the current thread state. + state_in_thread = " (thread exited)"; + } + else { + state_in_thread = GET_THREAD_STATE().state().is_current(self) + ? " current" + : (self->started() ? " suspended" : ""); + } + result = PyUnicode_FromFormat( + "<%s object at %p (otid=%p)%s%s%s%s>", + tp_name, + self.borrow_o(), + self->thread_state(), + state_in_thread, + self->active() ? " active" : "", + never_started ? " pending" : " started", + self->main() ? " main" : "" + ); + } + else { + result = PyUnicode_FromFormat( + "<%s object at %p (otid=%p) %sdead>", + tp_name, + self.borrow_o(), + self->thread_state(), + self->was_running_in_dead_thread() + ? "(thread exited) " + : "" + ); + } + + return result; +} + +/***************************************************************************** + * C interface + * + * These are exported using the CObject API + */ +extern "C" { +static PyGreenlet* +PyGreenlet_GetCurrent(void) +{ + return GET_THREAD_STATE().state().get_current().relinquish_ownership(); +} + +static int +PyGreenlet_SetParent(PyGreenlet* g, PyGreenlet* nparent) +{ + return green_setparent((PyGreenlet*)g, (PyObject*)nparent, NULL); +} + +static PyGreenlet* +PyGreenlet_New(PyObject* run, PyGreenlet* parent) +{ + using greenlet::refs::NewDictReference; + // In the past, we didn't use green_new and green_init, but that + // was a maintenance issue because we duplicated code. This way is + // much safer, but slightly slower. If that's a problem, we could + // refactor green_init to separate argument parsing from initialization. + OwnedGreenlet g = OwnedGreenlet::consuming(green_new(&PyGreenlet_Type, nullptr, nullptr)); + if (!g) { + return NULL; + } + + try { + NewDictReference kwargs; + if (run) { + kwargs.SetItem(mod_globs->str_run, run); + } + if (parent) { + kwargs.SetItem("parent", (PyObject*)parent); + } + + Require(green_init(g, mod_globs->empty_tuple, kwargs)); + } + catch (const PyErrOccurred&) { + return nullptr; + } + + return g.relinquish_ownership(); +} + +static PyObject* +PyGreenlet_Switch(PyGreenlet* self, PyObject* args, PyObject* kwargs) +{ + if (!PyGreenlet_Check(self)) { + PyErr_BadArgument(); + return NULL; + } + + if (args == NULL) { + args = mod_globs->empty_tuple; + } + + if (kwargs == NULL || !PyDict_Check(kwargs)) { + kwargs = NULL; + } + + return green_switch(self, args, kwargs); +} + +static PyObject* +PyGreenlet_Throw(PyGreenlet* self, PyObject* typ, PyObject* val, PyObject* tb) +{ + if (!PyGreenlet_Check(self)) { + PyErr_BadArgument(); + return nullptr; + } + try { + PyErrPieces err_pieces(typ, val, tb); + return throw_greenlet(self, err_pieces).relinquish_ownership(); + } + catch (const PyErrOccurred&) { + return nullptr; + } +} + +static int +Extern_PyGreenlet_MAIN(PyGreenlet* self) +{ + if (!PyGreenlet_Check(self)) { + PyErr_BadArgument(); + return -1; + } + return self->pimpl->main(); +} + +static int +Extern_PyGreenlet_ACTIVE(PyGreenlet* self) +{ + if (!PyGreenlet_Check(self)) { + PyErr_BadArgument(); + return -1; + } + return self->pimpl->active(); +} + +static int +Extern_PyGreenlet_STARTED(PyGreenlet* self) +{ + if (!PyGreenlet_Check(self)) { + PyErr_BadArgument(); + return -1; + } + return self->pimpl->started(); +} + +static PyGreenlet* +Extern_PyGreenlet_GET_PARENT(PyGreenlet* self) +{ + if (!PyGreenlet_Check(self)) { + PyErr_BadArgument(); + return NULL; + } + // This can return NULL even if there is no exception + return self->pimpl->parent().acquire(); +} +} // extern C. + +/** End C API ****************************************************************/ + +static PyMethodDef green_methods[] = { + {"switch", + reinterpret_cast(green_switch), + METH_VARARGS | METH_KEYWORDS, + green_switch_doc}, + {"throw", (PyCFunction)green_throw, METH_VARARGS, green_throw_doc}, + {"__getstate__", (PyCFunction)green_getstate, METH_NOARGS, NULL}, + {NULL, NULL} /* sentinel */ +}; + +static PyGetSetDef green_getsets[] = { + /* name, getter, setter, doc, context pointer */ + {"__dict__", (getter)green_getdict, (setter)green_setdict, /*XXX*/ NULL}, + {"run", (getter)green_getrun, (setter)green_setrun, /*XXX*/ NULL}, + {"parent", (getter)green_getparent, (setter)green_setparent, /*XXX*/ NULL}, + {"gr_frame", (getter)green_getframe, NULL, /*XXX*/ NULL}, + {"gr_context", + (getter)green_getcontext, + (setter)green_setcontext, + /*XXX*/ NULL}, + {"dead", (getter)green_getdead, NULL, /*XXX*/ NULL}, + {"_stack_saved", (getter)green_get_stack_saved, NULL, /*XXX*/ NULL}, + {NULL} +}; + +static PyMemberDef green_members[] = { + {NULL} +}; + +static PyNumberMethods green_as_number = { + NULL, /* nb_add */ + NULL, /* nb_subtract */ + NULL, /* nb_multiply */ + NULL, /* nb_remainder */ + NULL, /* nb_divmod */ + NULL, /* nb_power */ + NULL, /* nb_negative */ + NULL, /* nb_positive */ + NULL, /* nb_absolute */ + (inquiry)green_bool, /* nb_bool */ +}; + + +PyTypeObject PyGreenlet_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "greenlet.greenlet", /* tp_name */ + sizeof(PyGreenlet), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)green_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc)green_repr, /* tp_repr */ + &green_as_number, /* tp_as _number*/ + 0, /* tp_as _sequence*/ + 0, /* tp_as _mapping*/ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer*/ + G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + "greenlet(run=None, parent=None) -> greenlet\n\n" + "Creates a new greenlet object (without running it).\n\n" + " - *run* -- The callable to invoke.\n" + " - *parent* -- The parent greenlet. The default is the current " + "greenlet.", /* tp_doc */ + (traverseproc)green_traverse, /* tp_traverse */ + (inquiry)green_clear, /* tp_clear */ + 0, /* tp_richcompare */ + offsetof(PyGreenlet, weakreflist), /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + green_methods, /* tp_methods */ + green_members, /* tp_members */ + green_getsets, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + offsetof(PyGreenlet, dict), /* tp_dictoffset */ + (initproc)green_init, /* tp_init */ + PyType_GenericAlloc, /* tp_alloc */ + (newfunc)green_new, /* tp_new */ + PyObject_GC_Del, /* tp_free */ + (inquiry)green_is_gc, /* tp_is_gc */ +}; + + + +static PyObject* +green_unswitchable_getforce(PyGreenlet* self, void* UNUSED(context)) +{ + BrokenGreenlet* broken = dynamic_cast(self->pimpl); + return PyBool_FromLong(broken->_force_switch_error); +} + +static int +green_unswitchable_setforce(PyGreenlet* self, BorrowedObject nforce, void* UNUSED(context)) +{ + if (!nforce) { + PyErr_SetString( + PyExc_AttributeError, + "Cannot delete force_switch_error" + ); + return -1; + } + BrokenGreenlet* broken = dynamic_cast(self->pimpl); + int is_true = PyObject_IsTrue(nforce); + if (is_true == -1) { + return -1; + } + broken->_force_switch_error = is_true; + return 0; +} + +static PyObject* +green_unswitchable_getforceslp(PyGreenlet* self, void* UNUSED(context)) +{ + BrokenGreenlet* broken = dynamic_cast(self->pimpl); + return PyBool_FromLong(broken->_force_slp_switch_error); +} + +static int +green_unswitchable_setforceslp(PyGreenlet* self, BorrowedObject nforce, void* UNUSED(context)) +{ + if (!nforce) { + PyErr_SetString( + PyExc_AttributeError, + "Cannot delete force_slp_switch_error" + ); + return -1; + } + BrokenGreenlet* broken = dynamic_cast(self->pimpl); + int is_true = PyObject_IsTrue(nforce); + if (is_true == -1) { + return -1; + } + broken->_force_slp_switch_error = is_true; + return 0; +} + +static PyGetSetDef green_unswitchable_getsets[] = { + /* name, getter, setter, doc, context pointer */ + {"force_switch_error", + (getter)green_unswitchable_getforce, + (setter)green_unswitchable_setforce, + /*XXX*/ NULL}, + {"force_slp_switch_error", + (getter)green_unswitchable_getforceslp, + (setter)green_unswitchable_setforceslp, + /*XXX*/ NULL}, + + {NULL} +}; + +PyTypeObject PyGreenletUnswitchable_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "greenlet._greenlet.UnswitchableGreenlet", + 0, /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)green_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as _number*/ + 0, /* tp_as _sequence*/ + 0, /* tp_as _mapping*/ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer*/ + G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + "Undocumented internal class", /* tp_doc */ + (traverseproc)green_traverse, /* tp_traverse */ + (inquiry)green_clear, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + green_unswitchable_getsets, /* tp_getset */ + &PyGreenlet_Type, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)green_init, /* tp_init */ + PyType_GenericAlloc, /* tp_alloc */ + (newfunc)green_unswitchable_new, /* tp_new */ + PyObject_GC_Del, /* tp_free */ + (inquiry)green_is_gc, /* tp_is_gc */ +}; + + +PyDoc_STRVAR(mod_getcurrent_doc, + "getcurrent() -> greenlet\n" + "\n" + "Returns the current greenlet (i.e. the one which called this " + "function).\n"); + +static PyObject* +mod_getcurrent(PyObject* UNUSED(module)) +{ + return GET_THREAD_STATE().state().get_current().relinquish_ownership_o(); +} + +PyDoc_STRVAR(mod_settrace_doc, + "settrace(callback) -> object\n" + "\n" + "Sets a new tracing function and returns the previous one.\n"); +static PyObject* +mod_settrace(PyObject* UNUSED(module), PyObject* args) +{ + PyArgParseParam tracefunc; + if (!PyArg_ParseTuple(args, "O", &tracefunc)) { + return NULL; + } + ThreadState& state = GET_THREAD_STATE(); + OwnedObject previous = state.get_tracefunc(); + if (!previous) { + previous = Py_None; + } + + state.set_tracefunc(tracefunc); + + return previous.relinquish_ownership(); +} + +PyDoc_STRVAR(mod_gettrace_doc, + "gettrace() -> object\n" + "\n" + "Returns the currently set tracing function, or None.\n"); + +static PyObject* +mod_gettrace(PyObject* UNUSED(module)) +{ + OwnedObject tracefunc = GET_THREAD_STATE().state().get_tracefunc(); + if (!tracefunc) { + tracefunc = Py_None; + } + return tracefunc.relinquish_ownership(); +} + +PyDoc_STRVAR(mod_set_thread_local_doc, + "set_thread_local(key, value) -> None\n" + "\n" + "Set a value in the current thread-local dictionary. Debbuging only.\n"); + +static PyObject* +mod_set_thread_local(PyObject* UNUSED(module), PyObject* args) +{ + PyArgParseParam key; + PyArgParseParam value; + PyObject* result = NULL; + + if (PyArg_UnpackTuple(args, "set_thread_local", 2, 2, &key, &value)) { + if(PyDict_SetItem( + PyThreadState_GetDict(), // borrow + key, + value) == 0 ) { + // success + Py_INCREF(Py_None); + result = Py_None; + } + } + return result; +} + +PyDoc_STRVAR(mod_get_pending_cleanup_count_doc, + "get_pending_cleanup_count() -> Integer\n" + "\n" + "Get the number of greenlet cleanup operations pending. Testing only.\n"); + + +static PyObject* +mod_get_pending_cleanup_count(PyObject* UNUSED(module)) +{ + LockGuard cleanup_lock(*mod_globs->thread_states_to_destroy_lock); + return PyLong_FromSize_t(mod_globs->thread_states_to_destroy.size()); +} + +PyDoc_STRVAR(mod_get_total_main_greenlets_doc, + "get_total_main_greenlets() -> Integer\n" + "\n" + "Quickly return the number of main greenlets that exist. Testing only.\n"); + +static PyObject* +mod_get_total_main_greenlets(PyObject* UNUSED(module)) +{ + return PyLong_FromSize_t(G_TOTAL_MAIN_GREENLETS); +} + +PyDoc_STRVAR(mod_get_clocks_used_doing_optional_cleanup_doc, + "get_clocks_used_doing_optional_cleanup() -> Integer\n" + "\n" + "Get the number of clock ticks the program has used doing optional " + "greenlet cleanup.\n" + "Beginning in greenlet 2.0, greenlet tries to find and dispose of greenlets\n" + "that leaked after a thread exited. This requires invoking Python's garbage collector,\n" + "which may have a performance cost proportional to the number of live objects.\n" + "This function returns the amount of processor time\n" + "greenlet has used to do this. In programs that run with very large amounts of live\n" + "objects, this metric can be used to decide whether the cost of doing this cleanup\n" + "is worth the memory leak being corrected. If not, you can disable the cleanup\n" + "using ``enable_optional_cleanup(False)``.\n" + "The units are arbitrary and can only be compared to themselves (similarly to ``time.clock()``);\n" + "for example, to see how it scales with your heap. You can attempt to convert them into seconds\n" + "by dividing by the value of CLOCKS_PER_SEC." + "If cleanup has been disabled, returns None." + "\n" + "This is an implementation specific, provisional API. It may be changed or removed\n" + "in the future.\n" + ".. versionadded:: 2.0" + ); +static PyObject* +mod_get_clocks_used_doing_optional_cleanup(PyObject* UNUSED(module)) +{ + std::clock_t& clocks = ThreadState::clocks_used_doing_gc(); + + if (clocks == std::clock_t(-1)) { + Py_RETURN_NONE; + } + // This might not actually work on some implementations; clock_t + // is an opaque type. + return PyLong_FromSsize_t(clocks); +} + +PyDoc_STRVAR(mod_enable_optional_cleanup_doc, + "mod_enable_optional_cleanup(bool) -> None\n" + "\n" + "Enable or disable optional cleanup operations.\n" + "See ``get_clocks_used_doing_optional_cleanup()`` for details.\n" + ); +static PyObject* +mod_enable_optional_cleanup(PyObject* UNUSED(module), PyObject* flag) +{ + int is_true = PyObject_IsTrue(flag); + if (is_true == -1) { + return nullptr; + } + + std::clock_t& clocks = ThreadState::clocks_used_doing_gc(); + if (is_true) { + // If we already have a value, we don't want to lose it. + if (clocks == std::clock_t(-1)) { + clocks = 0; + } + } + else { + clocks = std::clock_t(-1); + } + Py_RETURN_NONE; +} + +PyDoc_STRVAR(mod_get_tstate_trash_delete_nesting_doc, + "get_tstate_trash_delete_nesting() -> Integer\n" + "\n" + "Return the 'trash can' nesting level. Testing only.\n"); +static PyObject* +mod_get_tstate_trash_delete_nesting(PyObject* UNUSED(module)) +{ + PyThreadState* tstate = PyThreadState_GET(); + +#if GREENLET_PY312 + return PyLong_FromLong(tstate->trash.delete_nesting); +#else + return PyLong_FromLong(tstate->trash_delete_nesting); +#endif +} + +static PyMethodDef GreenMethods[] = { + {"getcurrent", + (PyCFunction)mod_getcurrent, + METH_NOARGS, + mod_getcurrent_doc}, + {"settrace", (PyCFunction)mod_settrace, METH_VARARGS, mod_settrace_doc}, + {"gettrace", (PyCFunction)mod_gettrace, METH_NOARGS, mod_gettrace_doc}, + {"set_thread_local", (PyCFunction)mod_set_thread_local, METH_VARARGS, mod_set_thread_local_doc}, + {"get_pending_cleanup_count", (PyCFunction)mod_get_pending_cleanup_count, METH_NOARGS, mod_get_pending_cleanup_count_doc}, + {"get_total_main_greenlets", (PyCFunction)mod_get_total_main_greenlets, METH_NOARGS, mod_get_total_main_greenlets_doc}, + {"get_clocks_used_doing_optional_cleanup", (PyCFunction)mod_get_clocks_used_doing_optional_cleanup, METH_NOARGS, mod_get_clocks_used_doing_optional_cleanup_doc}, + {"enable_optional_cleanup", (PyCFunction)mod_enable_optional_cleanup, METH_O, mod_enable_optional_cleanup_doc}, + {"get_tstate_trash_delete_nesting", (PyCFunction)mod_get_tstate_trash_delete_nesting, METH_NOARGS, mod_get_tstate_trash_delete_nesting_doc}, + {NULL, NULL} /* Sentinel */ +}; + +static const char* const copy_on_greentype[] = { + "getcurrent", + "error", + "GreenletExit", + "settrace", + "gettrace", + NULL +}; + +static struct PyModuleDef greenlet_module_def = { + PyModuleDef_HEAD_INIT, + "greenlet._greenlet", + NULL, + -1, + GreenMethods, +}; + + + +static PyObject* +greenlet_internal_mod_init() noexcept +{ + static void* _PyGreenlet_API[PyGreenlet_API_pointers]; + + try { + CreatedModule m(greenlet_module_def); + + Require(PyType_Ready(&PyGreenlet_Type)); + Require(PyType_Ready(&PyGreenletUnswitchable_Type)); + + mod_globs = new greenlet::GreenletGlobals; + ThreadState::init(); + + m.PyAddObject("greenlet", PyGreenlet_Type); + m.PyAddObject("UnswitchableGreenlet", PyGreenletUnswitchable_Type); + m.PyAddObject("error", mod_globs->PyExc_GreenletError); + m.PyAddObject("GreenletExit", mod_globs->PyExc_GreenletExit); + + m.PyAddObject("GREENLET_USE_GC", 1); + m.PyAddObject("GREENLET_USE_TRACING", 1); + m.PyAddObject("GREENLET_USE_CONTEXT_VARS", 1L); + m.PyAddObject("GREENLET_USE_STANDARD_THREADING", 1L); + + OwnedObject clocks_per_sec = OwnedObject::consuming(PyLong_FromSsize_t(CLOCKS_PER_SEC)); + m.PyAddObject("CLOCKS_PER_SEC", clocks_per_sec); + + /* also publish module-level data as attributes of the greentype. */ + // XXX: This is weird, and enables a strange pattern of + // confusing the class greenlet with the module greenlet; with + // the exception of (possibly) ``getcurrent()``, this + // shouldn't be encouraged so don't add new items here. + for (const char* const* p = copy_on_greentype; *p; p++) { + OwnedObject o = m.PyRequireAttr(*p); + PyDict_SetItemString(PyGreenlet_Type.tp_dict, *p, o.borrow()); + } + + /* + * Expose C API + */ + + /* types */ + _PyGreenlet_API[PyGreenlet_Type_NUM] = (void*)&PyGreenlet_Type; + + /* exceptions */ + _PyGreenlet_API[PyExc_GreenletError_NUM] = (void*)mod_globs->PyExc_GreenletError; + _PyGreenlet_API[PyExc_GreenletExit_NUM] = (void*)mod_globs->PyExc_GreenletExit; + + /* methods */ + _PyGreenlet_API[PyGreenlet_New_NUM] = (void*)PyGreenlet_New; + _PyGreenlet_API[PyGreenlet_GetCurrent_NUM] = (void*)PyGreenlet_GetCurrent; + _PyGreenlet_API[PyGreenlet_Throw_NUM] = (void*)PyGreenlet_Throw; + _PyGreenlet_API[PyGreenlet_Switch_NUM] = (void*)PyGreenlet_Switch; + _PyGreenlet_API[PyGreenlet_SetParent_NUM] = (void*)PyGreenlet_SetParent; + + /* Previously macros, but now need to be functions externally. */ + _PyGreenlet_API[PyGreenlet_MAIN_NUM] = (void*)Extern_PyGreenlet_MAIN; + _PyGreenlet_API[PyGreenlet_STARTED_NUM] = (void*)Extern_PyGreenlet_STARTED; + _PyGreenlet_API[PyGreenlet_ACTIVE_NUM] = (void*)Extern_PyGreenlet_ACTIVE; + _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM] = (void*)Extern_PyGreenlet_GET_PARENT; + + /* XXX: Note that our module name is ``greenlet._greenlet``, but for + backwards compatibility with existing C code, we need the _C_API to + be directly in greenlet. + */ + const NewReference c_api_object(Require( + PyCapsule_New( + (void*)_PyGreenlet_API, + "greenlet._C_API", + NULL))); + m.PyAddObject("_C_API", c_api_object); + assert(c_api_object.REFCNT() == 2); + + // cerr << "Sizes:" + // << "\n\tGreenlet : " << sizeof(Greenlet) + // << "\n\tUserGreenlet : " << sizeof(UserGreenlet) + // << "\n\tMainGreenlet : " << sizeof(MainGreenlet) + // << "\n\tExceptionState : " << sizeof(greenlet::ExceptionState) + // << "\n\tPythonState : " << sizeof(greenlet::PythonState) + // << "\n\tStackState : " << sizeof(greenlet::StackState) + // << "\n\tSwitchingArgs : " << sizeof(greenlet::SwitchingArgs) + // << "\n\tOwnedObject : " << sizeof(greenlet::refs::OwnedObject) + // << "\n\tBorrowedObject : " << sizeof(greenlet::refs::BorrowedObject) + // << "\n\tPyGreenlet : " << sizeof(PyGreenlet) + // << endl; + + return m.borrow(); // But really it's the main reference. + } + catch (const LockInitError& e) { + PyErr_SetString(PyExc_MemoryError, e.what()); + return NULL; + } + catch (const PyErrOccurred&) { + return NULL; + } + +} + +extern "C" { + +PyMODINIT_FUNC +PyInit__greenlet(void) +{ + return greenlet_internal_mod_init(); +} + +}; // extern C + +#ifdef __clang__ +# pragma clang diagnostic pop +#elif defined(__GNUC__) +# pragma GCC diagnostic pop +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet.h b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet.h new file mode 100644 index 00000000..d02a16e4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet.h @@ -0,0 +1,164 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is deprecated and undocumented. It does not change. */ +#define GREENLET_VERSION "1.0.0" + +#ifndef GREENLET_MODULE +#define implementation_ptr_t void* +#endif + +typedef struct _greenlet { + PyObject_HEAD + PyObject* weakreflist; + PyObject* dict; + implementation_ptr_t pimpl; +} PyGreenlet; + +#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) + + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 12 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#define PyGreenlet_MAIN_NUM 8 +#define PyGreenlet_STARTED_NUM 9 +#define PyGreenlet_ACTIVE_NUM 10 +#define PyGreenlet_GET_PARENT_NUM 11 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void** _PyGreenlet_API = NULL; + +# define PyGreenlet_Type \ + (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) + +# define PyExc_GreenletError \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) + +# define PyExc_GreenletExit \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +# define PyGreenlet_New \ + (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +# define PyGreenlet_GetCurrent \ + (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +# define PyGreenlet_Throw \ + (*(PyObject * (*)(PyGreenlet * self, \ + PyObject * typ, \ + PyObject * val, \ + PyObject * tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +# define PyGreenlet_Switch \ + (*(PyObject * \ + (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +# define PyGreenlet_SetParent \ + (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* + * PyGreenlet_GetParent(PyObject* greenlet) + * + * return greenlet.parent; + * + * This could return NULL even if there is no exception active. + * If it does not return NULL, you are responsible for decrementing the + * reference count. + */ +# define PyGreenlet_GetParent \ + (*(PyGreenlet* (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) + +/* + * deprecated, undocumented alias. + */ +# define PyGreenlet_GET_PARENT PyGreenlet_GetParent + +# define PyGreenlet_MAIN \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_MAIN_NUM]) + +# define PyGreenlet_STARTED \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_STARTED_NUM]) + +# define PyGreenlet_ACTIVE \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) + + + + +/* Macro that imports greenlet and initializes C API */ +/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we + keep the older definition to be sure older code that might have a copy of + the header still works. */ +# define PyGreenlet_Import() \ + { \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ + } + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_allocator.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_allocator.hpp new file mode 100644 index 00000000..b452f544 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_allocator.hpp @@ -0,0 +1,63 @@ +#ifndef GREENLET_ALLOCATOR_HPP +#define GREENLET_ALLOCATOR_HPP + +#define PY_SSIZE_T_CLEAN +#include +#include +#include "greenlet_compiler_compat.hpp" + + +namespace greenlet +{ + // This allocator is stateless; all instances are identical. + // It can *ONLY* be used when we're sure we're holding the GIL + // (Python's allocators require the GIL). + template + struct PythonAllocator : public std::allocator { + + PythonAllocator(const PythonAllocator& UNUSED(other)) + : std::allocator() + { + } + + PythonAllocator(const std::allocator other) + : std::allocator(other) + {} + + template + PythonAllocator(const std::allocator& other) + : std::allocator(other) + { + } + + PythonAllocator() : std::allocator() {} + + T* allocate(size_t number_objects, const void* UNUSED(hint)=0) + { + void* p; + if (number_objects == 1) + p = PyObject_Malloc(sizeof(T)); + else + p = PyMem_Malloc(sizeof(T) * number_objects); + return static_cast(p); + } + + void deallocate(T* t, size_t n) + { + void* p = t; + if (n == 1) { + PyObject_Free(p); + } + else + PyMem_Free(p); + } + // This member is deprecated in C++17 and removed in C++20 + template< class U > + struct rebind { + typedef PythonAllocator other; + }; + + }; +} + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_compiler_compat.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_compiler_compat.hpp new file mode 100644 index 00000000..ee5bbdd2 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_compiler_compat.hpp @@ -0,0 +1,95 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +#ifndef GREENLET_COMPILER_COMPAT_HPP +#define GREENLET_COMPILER_COMPAT_HPP + +/** + * Definitions to aid with compatibility with different compilers. + * + * .. caution:: Use extreme care with noexcept. + * Some compilers and runtimes, specifically gcc/libgcc/libstdc++ on + * Linux, implement stack unwinding by throwing an uncatchable + * exception, one that specifically does not appear to be an active + * exception to the rest of the runtime. If this happens while we're in a noexcept function, + * we have violated our dynamic exception contract, and so the runtime + * will call std::terminate(), which kills the process with the + * unhelpful message "terminate called without an active exception". + * + * This has happened in this scenario: A background thread is running + * a greenlet that has made a native call and released the GIL. + * Meanwhile, the main thread finishes and starts shutting down the + * interpreter. When the background thread is scheduled again and + * attempts to obtain the GIL, it notices that the interpreter is + * exiting and calls ``pthread_exit()``. This in turn starts to unwind + * the stack by throwing that exception. But we had the ``PyCall`` + * functions annotated as noexcept, so the runtime terminated us. + * + * #2 0x00007fab26fec2b7 in std::terminate() () from /lib/x86_64-linux-gnu/libstdc++.so.6 + * #3 0x00007fab26febb3c in __gxx_personality_v0 () from /lib/x86_64-linux-gnu/libstdc++.so.6 + * #4 0x00007fab26f34de6 in ?? () from /lib/x86_64-linux-gnu/libgcc_s.so.1 + * #6 0x00007fab276a34c6 in __GI___pthread_unwind at ./nptl/unwind.c:130 + * #7 0x00007fab2769bd3a in __do_cancel () at ../sysdeps/nptl/pthreadP.h:280 + * #8 __GI___pthread_exit (value=value@entry=0x0) at ./nptl/pthread_exit.c:36 + * #9 0x000000000052e567 in PyThread_exit_thread () at ../Python/thread_pthread.h:370 + * #10 0x00000000004d60b5 in take_gil at ../Python/ceval_gil.h:224 + * #11 0x00000000004d65f9 in PyEval_RestoreThread at ../Python/ceval.c:467 + * #12 0x000000000060cce3 in setipaddr at ../Modules/socketmodule.c:1203 + * #13 0x00000000006101cd in socket_gethostbyname + */ + +#include + +# if defined(__clang__) +# define G_FP_TMPL_STATIC static +# else +// GCC has no problem allowing static function pointers, but emits +// tons of warnings about "whose type uses the anonymous namespace [-Wsubobject-linkage]" +# define G_FP_TMPL_STATIC +# endif + +# define G_NO_COPIES_OF_CLS(Cls) private: \ + Cls(const Cls& other) = delete; \ + Cls& operator=(const Cls& other) = delete + +# define G_NO_ASSIGNMENT_OF_CLS(Cls) private: \ + Cls& operator=(const Cls& other) = delete + +# define G_NO_COPY_CONSTRUCTOR_OF_CLS(Cls) private: \ + Cls(const Cls& other) = delete; + + +// CAUTION: MSVC is stupidly picky: +// +// "The compiler ignores, without warning, any __declspec keywords +// placed after * or & and in front of the variable identifier in a +// declaration." +// (https://docs.microsoft.com/en-us/cpp/cpp/declspec?view=msvc-160) +// +// So pointer return types must be handled differently (because of the +// trailing *), or you get inscrutable compiler warnings like "error +// C2059: syntax error: ''" +// +// In C++ 11, there is a standard syntax for attributes, and +// GCC defines an attribute to use with this: [[gnu:noinline]]. +// In the future, this is expected to become standard. + +#if defined(__GNUC__) || defined(__clang__) +/* We used to check for GCC 4+ or 3.4+, but those compilers are + laughably out of date. Just assume they support it. */ +# define GREENLET_NOINLINE(name) __attribute__((noinline)) name +# define GREENLET_NOINLINE_P(rtype, name) rtype __attribute__((noinline)) name +# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) +#elif defined(_MSC_VER) +/* We used to check for && (_MSC_VER >= 1300) but that's also out of date. */ +# define GREENLET_NOINLINE(name) __declspec(noinline) name +# define GREENLET_NOINLINE_P(rtype, name) __declspec(noinline) rtype name +# define UNUSED(x) UNUSED_ ## x +#endif + +#if defined(_MSC_VER) +# define G_NOEXCEPT_WIN32 noexcept +#else +# define G_NOEXCEPT_WIN32 +#endif + + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_cpython_add_pending.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_cpython_add_pending.hpp new file mode 100644 index 00000000..0d28efd3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_cpython_add_pending.hpp @@ -0,0 +1,172 @@ +#ifndef GREENLET_CPYTHON_ADD_PENDING_HPP +#define GREENLET_CPYTHON_ADD_PENDING_HPP + +#if (PY_VERSION_HEX >= 0x30800A0 && PY_VERSION_HEX < 0x3090000) && !(defined(_WIN32) || defined(WIN32)) +// XXX: From Python 3.8a3 [1] up until Python 3.9a6 [2][3], +// ``Py_AddPendingCall`` would try to produce a Python exception if +// the interpreter was in the beginning of shutting down when this +// function is called. However, ``Py_AddPendingCall`` doesn't require +// the GIL, and we are absolutely not holding it when we make that +// call. That means that trying to create the Python exception is +// using the C API in an undefined state; here the C API detects this +// and aborts the process with an error ("Fatal Python error: Python +// memory allocator called without holding the GIL": Add -> +// PyErr_SetString -> PyUnicode_New -> PyObject_Malloc). This arises +// (obviously) in multi-threaded programs and happens if one thread is +// exiting and cleaning up its thread-local data while the other +// thread is trying to shut down the interpreter. A crash on shutdown +// is still a crash and could result in data loss (e.g., daemon +// threads are still running, pending signal handlers may be present, +// buffers may not be flushed, there may be __del__ that need run, +// etc), so we have to work around it. +// +// Of course, we can (and do) check for whether the interpreter is +// shutting down before calling ``Py_AddPendingCall``, but that's a +// race condition since we don't hold the GIL, and so we may not +// actually get the right answer. Plus, ``Py_FinalizeEx`` actually +// calls ``_Py_FinishPendingCalls`` (which sets the pending->finishing +// flag, which is used to gate creating the exceptioen) *before* +// publishing any other data that would let us detect the shutdown +// (such as runtime->finalizing). So that point is moot. +// +// Our solution for those versions is to inline the same code, without +// the problematic bit that sets the exception. Unfortunately, all of +// the structure definitions are private/opaque, *and* we can't +// actually count on being able to include their definitions from +// ``internal/pycore_*``, because on some platforms those header files +// are incomplete (i.e., on macOS with macports 3.8, the includes are +// fine, but on Ubuntu jammy with 3.8 from ppa:deadsnakes or GitHub +// Actions 3.8 (I think it's Ubuntu 18.04), they con't be used; at +// least, I couldn't get them to work). So we need to define the +// structures and _PyRuntime data member ourself. Yet more +// unfortunately, _PyRuntime won't link on Windows, so we can only do +// this on other platforms. +// +// [1] https://github.com/python/cpython/commit/842a2f07f2f08a935ef470bfdaeef40f87490cfc +// [2] https://github.com/python/cpython/commit/cfc3c2f8b34d3864717ab584c5b6c260014ba55a +// [3] https://github.com/python/cpython/issues/81308 +# define GREENLET_BROKEN_PY_ADD_PENDING 1 + +// When defining these structures, the important thing is to get +// binary compatibility, i.e., structure layout. For that, we only +// need to define fields up to the ones we use; after that they're +// irrelevant UNLESS the structure is included in another structure +// *before* the structure we're interested in --- in that case, it +// must be complete. Ellipsis indicate elided trailing members. +// Pointer types are changed to void* to keep from having to define +// more structures. + +// From "internal/pycore_atomic.h" + +// There are several different definitions of this, including the +// plain ``int`` version, a ``volatile int`` and an ``_Atomic int`` +// I don't think any of those change the size/layout. +typedef struct _Py_atomic_int { + volatile int _value; +} _Py_atomic_int; + +// This needs too much infrastructure, so we just do a regular store. +#define _Py_atomic_store_relaxed(ATOMIC_VAL, NEW_VAL) \ + (ATOMIC_VAL)->_value = NEW_VAL + + + +// From "internal/pycore_pymem.h" +#define NUM_GENERATIONS 3 + + +struct gc_generation { + PyGC_Head head; // We already have this defined. + int threshold; + int count; +}; +struct gc_generation_stats { + Py_ssize_t collections; + Py_ssize_t collected; + Py_ssize_t uncollectable; +}; + +struct _gc_runtime_state { + void *trash_delete_later; + int trash_delete_nesting; + int enabled; + int debug; + struct gc_generation generations[NUM_GENERATIONS]; + void *generation0; + struct gc_generation permanent_generation; + struct gc_generation_stats generation_stats[NUM_GENERATIONS]; + int collecting; + void *garbage; + void *callbacks; + Py_ssize_t long_lived_total; + Py_ssize_t long_lived_pending; +}; + +// From "internal/pycore_pystate.h" +struct _pending_calls { + int finishing; + PyThread_type_lock lock; + _Py_atomic_int calls_to_do; + int async_exc; +#define NPENDINGCALLS 32 + struct { + int (*func)(void *); + void *arg; + } calls[NPENDINGCALLS]; + int first; + int last; +}; + +struct _ceval_runtime_state { + int recursion_limit; + int tracing_possible; + _Py_atomic_int eval_breaker; + _Py_atomic_int gil_drop_request; + struct _pending_calls pending; + // ... +}; + +typedef struct pyruntimestate { + int preinitializing; + int preinitialized; + int core_initialized; + int initialized; + void *finalizing; + + struct pyinterpreters { + PyThread_type_lock mutex; + void *head; + void *main; + int64_t next_id; + } interpreters; + // XXX Remove this field once we have a tp_* slot. + struct _xidregistry { + PyThread_type_lock mutex; + void *head; + } xidregistry; + + unsigned long main_thread; + +#define NEXITFUNCS 32 + void (*exitfuncs[NEXITFUNCS])(void); + int nexitfuncs; + + struct _gc_runtime_state gc; + struct _ceval_runtime_state ceval; + // ... +} _PyRuntimeState; + +#define SIGNAL_PENDING_CALLS(ceval) \ + do { \ + _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \ + _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ + } while (0) + +extern _PyRuntimeState _PyRuntime; + +#else +# define GREENLET_BROKEN_PY_ADD_PENDING 0 +#endif + + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_cpython_compat.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_cpython_compat.hpp new file mode 100644 index 00000000..cdc1617f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_cpython_compat.hpp @@ -0,0 +1,127 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +#ifndef GREENLET_CPYTHON_COMPAT_H +#define GREENLET_CPYTHON_COMPAT_H + +/** + * Helpers for compatibility with multiple versions of CPython. + */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" + + +#if PY_VERSION_HEX >= 0x30A00B1 +# define GREENLET_PY310 1 +/* +Python 3.10 beta 1 changed tstate->use_tracing to a nested cframe member. +See https://github.com/python/cpython/pull/25276 +We have to save and restore this as well. +*/ +# define GREENLET_USE_CFRAME 1 +#else +# define GREENLET_USE_CFRAME 0 +# define GREENLET_PY310 0 +#endif + + + +#if PY_VERSION_HEX >= 0x30B00A4 +/* +Greenlet won't compile on anything older than Python 3.11 alpha 4 (see +https://bugs.python.org/issue46090). Summary of breaking internal changes: +- Python 3.11 alpha 1 changed how frame objects are represented internally. + - https://github.com/python/cpython/pull/30122 +- Python 3.11 alpha 3 changed how recursion limits are stored. + - https://github.com/python/cpython/pull/29524 +- Python 3.11 alpha 4 changed how exception state is stored. It also includes a + change to help greenlet save and restore the interpreter frame "data stack". + - https://github.com/python/cpython/pull/30122 + - https://github.com/python/cpython/pull/30234 +*/ +# define GREENLET_PY311 1 +#else +# define GREENLET_PY311 0 +#endif + + +#if PY_VERSION_HEX >= 0x30C0000 +# define GREENLET_PY312 1 +#else +# define GREENLET_PY312 0 +#endif + +#ifndef Py_SET_REFCNT +/* Py_REFCNT and Py_SIZE macros are converted to functions +https://bugs.python.org/issue39573 */ +# define Py_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) +#endif + +#ifndef _Py_DEC_REFTOTAL +/* _Py_DEC_REFTOTAL macro has been removed from Python 3.9 by: + https://github.com/python/cpython/commit/49932fec62c616ec88da52642339d83ae719e924 + + The symbol we use to replace it was removed by at least 3.12. +*/ +# ifdef Py_REF_DEBUG +# if GREENLET_PY312 +# define _Py_DEC_REFTOTAL +# else +# define _Py_DEC_REFTOTAL _Py_RefTotal-- +# endif +# else +# define _Py_DEC_REFTOTAL +# endif +#endif +// Define these flags like Cython does if we're on an old version. +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif + +#ifndef Py_TPFLAGS_HAVE_VERSION_TAG + #define Py_TPFLAGS_HAVE_VERSION_TAG 0 +#endif + +#define G_TPFLAGS_DEFAULT Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_VERSION_TAG | Py_TPFLAGS_CHECKTYPES | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_HAVE_GC + + +#if PY_VERSION_HEX < 0x03090000 +// The official version only became available in 3.9 +# define PyObject_GC_IsTracked(o) _PyObject_GC_IS_TRACKED(o) +#endif + + +// bpo-43760 added PyThreadState_EnterTracing() to Python 3.11.0a2 +#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION) +static inline void PyThreadState_EnterTracing(PyThreadState *tstate) +{ + tstate->tracing++; +#if PY_VERSION_HEX >= 0x030A00A1 + tstate->cframe->use_tracing = 0; +#else + tstate->use_tracing = 0; +#endif +} +#endif + +// bpo-43760 added PyThreadState_LeaveTracing() to Python 3.11.0a2 +#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION) +static inline void PyThreadState_LeaveTracing(PyThreadState *tstate) +{ + tstate->tracing--; + int use_tracing = (tstate->c_tracefunc != NULL + || tstate->c_profilefunc != NULL); +#if PY_VERSION_HEX >= 0x030A00A1 + tstate->cframe->use_tracing = use_tracing; +#else + tstate->use_tracing = use_tracing; +#endif +} +#endif + +#endif /* GREENLET_CPYTHON_COMPAT_H */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_exceptions.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_exceptions.hpp new file mode 100644 index 00000000..3807018b --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_exceptions.hpp @@ -0,0 +1,150 @@ +#ifndef GREENLET_EXCEPTIONS_HPP +#define GREENLET_EXCEPTIONS_HPP + +#define PY_SSIZE_T_CLEAN +#include +#include +#include + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wunused-function" +#endif + +namespace greenlet { + + class PyErrOccurred : public std::runtime_error + { + public: + + // CAUTION: In debug builds, may run arbitrary Python code. + static const PyErrOccurred + from_current() + { + assert(PyErr_Occurred()); +#ifndef NDEBUG + // This is not exception safe, and + // not necessarily safe in general (what if it switches?) + // But we only do this in debug mode, where we are in + // tight control of what exceptions are getting raised and + // can prevent those issues. + + // You can't call PyObject_Str with a pending exception. + PyObject* typ; + PyObject* val; + PyObject* tb; + + PyErr_Fetch(&typ, &val, &tb); + PyObject* typs = PyObject_Str(typ); + PyObject* vals = PyObject_Str(val ? val : typ); + const char* typ_msg = PyUnicode_AsUTF8(typs); + const char* val_msg = PyUnicode_AsUTF8(vals); + PyErr_Restore(typ, val, tb); + + std::string msg(typ_msg); + msg += ": "; + msg += val_msg; + PyErrOccurred ex(msg); + Py_XDECREF(typs); + Py_XDECREF(vals); + + return ex; +#else + return PyErrOccurred(); +#endif + } + + PyErrOccurred() : std::runtime_error("") + { + assert(PyErr_Occurred()); + } + + PyErrOccurred(const std::string& msg) : std::runtime_error(msg) + { + assert(PyErr_Occurred()); + } + + PyErrOccurred(PyObject* exc_kind, const char* const msg) + : std::runtime_error(msg) + { + PyErr_SetString(exc_kind, msg); + } + + PyErrOccurred(PyObject* exc_kind, const std::string msg) + : std::runtime_error(msg) + { + // This copies the c_str, so we don't have any lifetime + // issues to worry about. + PyErr_SetString(exc_kind, msg.c_str()); + } + }; + + class TypeError : public PyErrOccurred + { + public: + TypeError(const char* const what) + : PyErrOccurred(PyExc_TypeError, what) + { + } + TypeError(const std::string what) + : PyErrOccurred(PyExc_TypeError, what) + { + } + }; + + class ValueError : public PyErrOccurred + { + public: + ValueError(const char* const what) + : PyErrOccurred(PyExc_ValueError, what) + { + } + }; + + class AttributeError : public PyErrOccurred + { + public: + AttributeError(const char* const what) + : PyErrOccurred(PyExc_AttributeError, what) + { + } + }; + + /** + * Calls `Py_FatalError` when constructed, so you can't actually + * throw this. It just makes static analysis easier. + */ + class PyFatalError : public std::runtime_error + { + public: + PyFatalError(const char* const msg) + : std::runtime_error(msg) + { + Py_FatalError(msg); + } + }; + + static inline PyObject* + Require(PyObject* p, const std::string& msg="") + { + if (!p) { + throw PyErrOccurred(msg); + } + return p; + }; + + static inline void + Require(const int retval) + { + if (retval < 0) { + throw PyErrOccurred(); + } + }; + + +}; +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_greenlet.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_greenlet.hpp new file mode 100644 index 00000000..2c44130d --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_greenlet.hpp @@ -0,0 +1,774 @@ +#ifndef GREENLET_GREENLET_HPP +#define GREENLET_GREENLET_HPP +/* + * Declarations of the core data structures. +*/ + +#define PY_SSIZE_T_CLEAN +#include + +#include "greenlet_compiler_compat.hpp" +#include "greenlet_refs.hpp" +#include "greenlet_cpython_compat.hpp" +#include "greenlet_allocator.hpp" + +using greenlet::refs::OwnedObject; +using greenlet::refs::OwnedGreenlet; +using greenlet::refs::OwnedMainGreenlet; +using greenlet::refs::BorrowedGreenlet; + +#if PY_VERSION_HEX < 0x30B00A6 +# define _PyCFrame CFrame +# define _PyInterpreterFrame _interpreter_frame +#endif + +#if GREENLET_PY312 +# include "internal/pycore_frame.h" +#endif + +// XXX: TODO: Work to remove all virtual functions +// for speed of calling and size of objects (no vtable). +// One pattern is the Curiously Recurring Template +namespace greenlet +{ + class ExceptionState + { + private: + G_NO_COPIES_OF_CLS(ExceptionState); + + // Even though these are borrowed objects, we actually own + // them, when they're not null. + // XXX: Express that in the API. + private: + _PyErr_StackItem* exc_info; + _PyErr_StackItem exc_state; + public: + ExceptionState(); + void operator<<(const PyThreadState *const tstate) noexcept; + void operator>>(PyThreadState* tstate) noexcept; + void clear() noexcept; + + int tp_traverse(visitproc visit, void* arg) noexcept; + void tp_clear() noexcept; + }; + + template + void operator<<(const PyThreadState *const tstate, T& exc); + + class PythonStateContext + { + protected: + greenlet::refs::OwnedContext _context; + public: + inline const greenlet::refs::OwnedContext& context() const + { + return this->_context; + } + inline greenlet::refs::OwnedContext& context() + { + return this->_context; + } + + inline void tp_clear() + { + this->_context.CLEAR(); + } + + template + inline static PyObject* context(T* tstate) + { + return tstate->context; + } + + template + inline static void context(T* tstate, PyObject* new_context) + { + tstate->context = new_context; + tstate->context_ver++; + } + }; + class SwitchingArgs; + class PythonState : public PythonStateContext + { + public: + typedef greenlet::refs::OwnedReference OwnedFrame; + private: + G_NO_COPIES_OF_CLS(PythonState); + // We own this if we're suspended (although currently we don't + // tp_traverse into it; that's a TODO). If we're running, it's + // empty. If we get deallocated and *still* have a frame, it + // won't be reachable from the place that normally decref's + // it, so we need to do it (hence owning it). + OwnedFrame _top_frame; +#if GREENLET_USE_CFRAME + _PyCFrame* cframe; + int use_tracing; +#endif +#if GREENLET_PY312 + int py_recursion_depth; + int c_recursion_depth; +#else + int recursion_depth; +#endif + int trash_delete_nesting; +#if GREENLET_PY311 + _PyInterpreterFrame* current_frame; + _PyStackChunk* datastack_chunk; + PyObject** datastack_top; + PyObject** datastack_limit; +#endif +#if GREENLET_PY312 + _PyInterpreterFrame* _prev_frame; +#endif + + public: + PythonState(); + // You can use this for testing whether we have a frame + // or not. It returns const so they can't modify it. + const OwnedFrame& top_frame() const noexcept; + + inline void operator<<(const PyThreadState *const tstate) noexcept; + inline void operator>>(PyThreadState* tstate) noexcept; + void clear() noexcept; + + int tp_traverse(visitproc visit, void* arg, bool visit_top_frame) noexcept; + void tp_clear(bool own_top_frame) noexcept; + void set_initial_state(const PyThreadState* const tstate) noexcept; +#if GREENLET_USE_CFRAME + void set_new_cframe(_PyCFrame& frame) noexcept; +#endif + inline void may_switch_away() noexcept; + inline void will_switch_from(PyThreadState *const origin_tstate) noexcept; + void did_finish(PyThreadState* tstate) noexcept; + }; + + class StackState + { + // By having only plain C (POD) members, no virtual functions + // or bases, we get a trivial assignment operator generated + // for us. However, that's not safe since we do manage memory. + // So we declare an assignment operator that only works if we + // don't have any memory allocated. (We don't use + // std::shared_ptr for reference counting just to keep this + // object small) + private: + char* _stack_start; + char* stack_stop; + char* stack_copy; + intptr_t _stack_saved; + StackState* stack_prev; + inline int copy_stack_to_heap_up_to(const char* const stop) noexcept; + inline void free_stack_copy() noexcept; + + public: + /** + * Creates a started, but inactive, state, using *current* + * as the previous. + */ + StackState(void* mark, StackState& current); + /** + * Creates an inactive, unstarted, state. + */ + StackState(); + ~StackState(); + StackState(const StackState& other); + StackState& operator=(const StackState& other); + inline void copy_heap_to_stack(const StackState& current) noexcept; + inline int copy_stack_to_heap(char* const stackref, const StackState& current) noexcept; + inline bool started() const noexcept; + inline bool main() const noexcept; + inline bool active() const noexcept; + inline void set_active() noexcept; + inline void set_inactive() noexcept; + inline intptr_t stack_saved() const noexcept; + inline char* stack_start() const noexcept; + static inline StackState make_main() noexcept; +#ifdef GREENLET_USE_STDIO + friend std::ostream& operator<<(std::ostream& os, const StackState& s); +#endif + }; +#ifdef GREENLET_USE_STDIO + std::ostream& operator<<(std::ostream& os, const StackState& s); +#endif + + class SwitchingArgs + { + private: + G_NO_ASSIGNMENT_OF_CLS(SwitchingArgs); + // If args and kwargs are both false (NULL), this is a *throw*, not a + // switch. PyErr_... must have been called already. + OwnedObject _args; + OwnedObject _kwargs; + public: + + SwitchingArgs() + {} + + SwitchingArgs(const OwnedObject& args, const OwnedObject& kwargs) + : _args(args), + _kwargs(kwargs) + {} + + SwitchingArgs(const SwitchingArgs& other) + : _args(other._args), + _kwargs(other._kwargs) + {} + + const OwnedObject& args() + { + return this->_args; + } + + const OwnedObject& kwargs() + { + return this->_kwargs; + } + + /** + * Moves ownership from the argument to this object. + */ + SwitchingArgs& operator<<=(SwitchingArgs& other) + { + if (this != &other) { + this->_args = other._args; + this->_kwargs = other._kwargs; + other.CLEAR(); + } + return *this; + } + + /** + * Acquires ownership of the argument (consumes the reference). + */ + SwitchingArgs& operator<<=(PyObject* args) + { + this->_args = OwnedObject::consuming(args); + this->_kwargs.CLEAR(); + return *this; + } + + /** + * Acquires ownership of the argument. + * + * Sets the args to be the given value; clears the kwargs. + */ + SwitchingArgs& operator<<=(OwnedObject& args) + { + assert(&args != &this->_args); + this->_args = args; + this->_kwargs.CLEAR(); + args.CLEAR(); + + return *this; + } + + explicit operator bool() const noexcept + { + return this->_args || this->_kwargs; + } + + inline void CLEAR() + { + this->_args.CLEAR(); + this->_kwargs.CLEAR(); + } + + const std::string as_str() const noexcept + { + return PyUnicode_AsUTF8( + OwnedObject::consuming( + PyUnicode_FromFormat( + "SwitchingArgs(args=%R, kwargs=%R)", + this->_args.borrow(), + this->_kwargs.borrow() + ) + ).borrow() + ); + } + }; + + class ThreadState; + + class UserGreenlet; + class MainGreenlet; + + class Greenlet + { + private: + G_NO_COPIES_OF_CLS(Greenlet); + private: + // XXX: Work to remove these. + friend class ThreadState; + friend class UserGreenlet; + friend class MainGreenlet; + protected: + ExceptionState exception_state; + SwitchingArgs switch_args; + StackState stack_state; + PythonState python_state; + Greenlet(PyGreenlet* p, const StackState& initial_state); + public: + Greenlet(PyGreenlet* p); + virtual ~Greenlet(); + + const OwnedObject context() const; + + // You MUST call this _very_ early in the switching process to + // prepare anything that may need prepared. This might perform + // garbage collections or otherwise run arbitrary Python code. + // + // One specific use of it is for Python 3.11+, preventing + // running arbitrary code at unsafe times. See + // PythonState::may_switch_away(). + inline void may_switch_away() + { + this->python_state.may_switch_away(); + } + + inline void context(refs::BorrowedObject new_context); + + inline SwitchingArgs& args() + { + return this->switch_args; + } + + virtual const refs::BorrowedMainGreenlet main_greenlet() const = 0; + + inline intptr_t stack_saved() const noexcept + { + return this->stack_state.stack_saved(); + } + + // This is used by the macro SLP_SAVE_STATE to compute the + // difference in stack sizes. It might be nice to handle the + // computation ourself, but the type of the result + // varies by platform, so doing it in the macro is the + // simplest way. + inline const char* stack_start() const noexcept + { + return this->stack_state.stack_start(); + } + + virtual OwnedObject throw_GreenletExit_during_dealloc(const ThreadState& current_thread_state); + virtual OwnedObject g_switch() = 0; + /** + * Force the greenlet to appear dead. Used when it's not + * possible to throw an exception into a greenlet anymore. + * + * This losses access to the thread state and the main greenlet. + */ + virtual void murder_in_place(); + + /** + * Called when somebody notices we were running in a dead + * thread to allow cleaning up resources (because we can't + * raise GreenletExit into it anymore). + * This is very similar to ``murder_in_place()``, except that + * it DOES NOT lose the main greenlet or thread state. + */ + inline void deactivate_and_free(); + + + // Called when some thread wants to deallocate a greenlet + // object. + // The thread may or may not be the same thread the greenlet + // was running in. + // The thread state will be null if the thread the greenlet + // was running in was known to have exited. + void deallocing_greenlet_in_thread(const ThreadState* current_state); + + // TODO: Figure out how to make these non-public. + inline void slp_restore_state() noexcept; + inline int slp_save_state(char *const stackref) noexcept; + + inline bool is_currently_running_in_some_thread() const; + virtual bool belongs_to_thread(const ThreadState* state) const; + + inline bool started() const + { + return this->stack_state.started(); + } + inline bool active() const + { + return this->stack_state.active(); + } + inline bool main() const + { + return this->stack_state.main(); + } + virtual refs::BorrowedMainGreenlet find_main_greenlet_in_lineage() const = 0; + + virtual const OwnedGreenlet parent() const = 0; + virtual void parent(const refs::BorrowedObject new_parent) = 0; + + inline const PythonState::OwnedFrame& top_frame() + { + return this->python_state.top_frame(); + } + + virtual const OwnedObject& run() const = 0; + virtual void run(const refs::BorrowedObject nrun) = 0; + + + virtual int tp_traverse(visitproc visit, void* arg); + virtual int tp_clear(); + + + // Return the thread state that the greenlet is running in, or + // null if the greenlet is not running or the thread is known + // to have exited. + virtual ThreadState* thread_state() const noexcept = 0; + + // Return true if the greenlet is known to have been running + // (active) in a thread that has now exited. + virtual bool was_running_in_dead_thread() const noexcept = 0; + + // Return a borrowed greenlet that is the Python object + // this object represents. + virtual BorrowedGreenlet self() const noexcept = 0; + + // For testing. If this returns true, we should pretend that + // slp_switch() failed. + virtual bool force_slp_switch_error() const noexcept; + + protected: + inline void release_args(); + + // The functions that must not be inlined are declared virtual. + // We also mark them as protected, not private, so that the + // compiler is forced to call them through a function pointer. + // (A sufficiently smart compiler could directly call a private + // virtual function since it can never be overridden in a + // subclass). + + // Also TODO: Switch away from integer error codes and to enums, + // or throw exceptions when possible. + struct switchstack_result_t + { + int status; + Greenlet* the_new_current_greenlet; + OwnedGreenlet origin_greenlet; + + switchstack_result_t() + : status(0), + the_new_current_greenlet(nullptr) + {} + + switchstack_result_t(int err) + : status(err), + the_new_current_greenlet(nullptr) + {} + + switchstack_result_t(int err, Greenlet* state, OwnedGreenlet& origin) + : status(err), + the_new_current_greenlet(state), + origin_greenlet(origin) + { + } + + switchstack_result_t(int err, Greenlet* state, const BorrowedGreenlet& origin) + : status(err), + the_new_current_greenlet(state), + origin_greenlet(origin) + { + } + + switchstack_result_t(const switchstack_result_t& other) + : status(other.status), + the_new_current_greenlet(other.the_new_current_greenlet), + origin_greenlet(other.origin_greenlet) + {} + + switchstack_result_t& operator=(const switchstack_result_t& other) + { + this->status = other.status; + this->the_new_current_greenlet = other.the_new_current_greenlet; + this->origin_greenlet = other.origin_greenlet; + return *this; + } + }; + + OwnedObject on_switchstack_or_initialstub_failure( + Greenlet* target, + const switchstack_result_t& err, + const bool target_was_me=false, + const bool was_initial_stub=false); + + // Returns the previous greenlet we just switched away from. + virtual OwnedGreenlet g_switchstack_success() noexcept; + + + // Check the preconditions for switching to this greenlet; if they + // aren't met, throws PyErrOccurred. Most callers will want to + // catch this and clear the arguments + inline void check_switch_allowed() const; + class GreenletStartedWhileInPython : public std::runtime_error + { + public: + GreenletStartedWhileInPython() : std::runtime_error("") + {} + }; + + protected: + + + /** + Perform a stack switch into this greenlet. + + This temporarily sets the global variable + ``switching_thread_state`` to this greenlet; as soon as the + call to ``slp_switch`` completes, this is reset to NULL. + Consequently, this depends on the GIL. + + TODO: Adopt the stackman model and pass ``slp_switch`` a + callback function and context pointer; this eliminates the + need for global variables altogether. + + Because the stack switch happens in this function, this + function can't use its own stack (local) variables, set + before the switch, and then accessed after the switch. + + Further, you con't even access ``g_thread_state_global`` + before and after the switch from the global variable. + Because it is thread local some compilers cache it in a + register/on the stack, notably new versions of MSVC; this + breaks with strange crashes sometime later, because writing + to anything in ``g_thread_state_global`` after the switch + is actually writing to random memory. For this reason, we + call a non-inlined function to finish the operation. (XXX: + The ``/GT`` MSVC compiler argument probably fixes that.) + + It is very important that stack switch is 'atomic', i.e. no + calls into other Python code allowed (except very few that + are safe), because global variables are very fragile. (This + should no longer be the case with thread-local variables.) + + */ + // Made virtual to facilitate subclassing UserGreenlet for testing. + virtual switchstack_result_t g_switchstack(void); + +class TracingGuard +{ +private: + PyThreadState* tstate; +public: + TracingGuard() + : tstate(PyThreadState_GET()) + { + PyThreadState_EnterTracing(this->tstate); + } + + ~TracingGuard() + { + PyThreadState_LeaveTracing(this->tstate); + this->tstate = nullptr; + } + + inline void CallTraceFunction(const OwnedObject& tracefunc, + const greenlet::refs::ImmortalEventName& event, + const BorrowedGreenlet& origin, + const BorrowedGreenlet& target) + { + // TODO: This calls tracefunc(event, (origin, target)). Add a shortcut + // function for that that's specialized to avoid the Py_BuildValue + // string parsing, or start with just using "ON" format with PyTuple_Pack(2, + // origin, target). That seems like what the N format is meant + // for. + // XXX: Why does event not automatically cast back to a PyObject? + // It tries to call the "deleted constructor ImmortalEventName + // const" instead. + assert(tracefunc); + assert(event); + assert(origin); + assert(target); + greenlet::refs::NewReference retval( + PyObject_CallFunction( + tracefunc.borrow(), + "O(OO)", + event.borrow(), + origin.borrow(), + target.borrow() + )); + if (!retval) { + throw PyErrOccurred::from_current(); + } + } +}; + + static void + g_calltrace(const OwnedObject& tracefunc, + const greenlet::refs::ImmortalEventName& event, + const greenlet::refs::BorrowedGreenlet& origin, + const BorrowedGreenlet& target); + private: + OwnedObject g_switch_finish(const switchstack_result_t& err); + + }; + + class UserGreenlet : public Greenlet + { + private: + static greenlet::PythonAllocator allocator; + BorrowedGreenlet _self; + OwnedMainGreenlet _main_greenlet; + OwnedObject _run_callable; + OwnedGreenlet _parent; + public: + static void* operator new(size_t UNUSED(count)); + static void operator delete(void* ptr); + + UserGreenlet(PyGreenlet* p, BorrowedGreenlet the_parent); + virtual ~UserGreenlet(); + + virtual refs::BorrowedMainGreenlet find_main_greenlet_in_lineage() const; + virtual bool was_running_in_dead_thread() const noexcept; + virtual ThreadState* thread_state() const noexcept; + virtual OwnedObject g_switch(); + virtual const OwnedObject& run() const + { + if (this->started() || !this->_run_callable) { + throw AttributeError("run"); + } + return this->_run_callable; + } + virtual void run(const refs::BorrowedObject nrun); + + virtual const OwnedGreenlet parent() const; + virtual void parent(const refs::BorrowedObject new_parent); + + virtual const refs::BorrowedMainGreenlet main_greenlet() const; + + virtual BorrowedGreenlet self() const noexcept; + virtual void murder_in_place(); + virtual bool belongs_to_thread(const ThreadState* state) const; + virtual int tp_traverse(visitproc visit, void* arg); + virtual int tp_clear(); + class ParentIsCurrentGuard + { + private: + OwnedGreenlet oldparent; + UserGreenlet* greenlet; + G_NO_COPIES_OF_CLS(ParentIsCurrentGuard); + public: + ParentIsCurrentGuard(UserGreenlet* p, const ThreadState& thread_state); + ~ParentIsCurrentGuard(); + }; + virtual OwnedObject throw_GreenletExit_during_dealloc(const ThreadState& current_thread_state); + protected: + virtual switchstack_result_t g_initialstub(void* mark); + private: + // This function isn't meant to return. + // This accepts raw pointers and the ownership of them at the + // same time. The caller should use ``inner_bootstrap(origin.relinquish_ownership())``. + void inner_bootstrap(PyGreenlet* origin_greenlet, PyObject* run); + }; + + class BrokenGreenlet : public UserGreenlet + { + private: + static greenlet::PythonAllocator allocator; + public: + bool _force_switch_error = false; + bool _force_slp_switch_error = false; + + static void* operator new(size_t UNUSED(count)); + static void operator delete(void* ptr); + BrokenGreenlet(PyGreenlet* p, BorrowedGreenlet the_parent) + : UserGreenlet(p, the_parent) + {} + virtual ~BrokenGreenlet() + {} + + virtual switchstack_result_t g_switchstack(void); + virtual bool force_slp_switch_error() const noexcept; + + }; + + class MainGreenlet : public Greenlet + { + private: + static greenlet::PythonAllocator allocator; + refs::BorrowedMainGreenlet _self; + ThreadState* _thread_state; + G_NO_COPIES_OF_CLS(MainGreenlet); + public: + static void* operator new(size_t UNUSED(count)); + static void operator delete(void* ptr); + + MainGreenlet(refs::BorrowedMainGreenlet::PyType*, ThreadState*); + virtual ~MainGreenlet(); + + + virtual const OwnedObject& run() const; + virtual void run(const refs::BorrowedObject nrun); + + virtual const OwnedGreenlet parent() const; + virtual void parent(const refs::BorrowedObject new_parent); + + virtual const refs::BorrowedMainGreenlet main_greenlet() const; + + virtual refs::BorrowedMainGreenlet find_main_greenlet_in_lineage() const; + virtual bool was_running_in_dead_thread() const noexcept; + virtual ThreadState* thread_state() const noexcept; + void thread_state(ThreadState*) noexcept; + virtual OwnedObject g_switch(); + virtual BorrowedGreenlet self() const noexcept; + virtual int tp_traverse(visitproc visit, void* arg); + }; + + // Instantiate one on the stack to save the GC state, + // and then disable GC. When it goes out of scope, GC will be + // restored to its original state. Sadly, these APIs are only + // available on 3.10+; luckily, we only need them on 3.11+. +#if GREENLET_PY310 + class GCDisabledGuard + { + private: + int was_enabled = 0; + public: + GCDisabledGuard() + : was_enabled(PyGC_IsEnabled()) + { + PyGC_Disable(); + } + + ~GCDisabledGuard() + { + if (this->was_enabled) { + PyGC_Enable(); + } + } + }; +#endif + + OwnedObject& operator<<=(OwnedObject& lhs, greenlet::SwitchingArgs& rhs) noexcept; + + //TODO: Greenlet::g_switch() should call this automatically on its + //return value. As it is, the module code is calling it. + static inline OwnedObject + single_result(const OwnedObject& results) + { + if (results + && PyTuple_Check(results.borrow()) + && PyTuple_GET_SIZE(results.borrow()) == 1) { + PyObject* result = PyTuple_GET_ITEM(results.borrow(), 0); + assert(result); + return OwnedObject::owning(result); + } + return results; + } + + + static OwnedObject + g_handle_exit(const OwnedObject& greenlet_result); + + + template + void operator<<(const PyThreadState *const lhs, T& rhs) + { + rhs.operator<<(lhs); + } + +} // namespace greenlet ; + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_internal.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_internal.hpp new file mode 100644 index 00000000..c8e38494 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_internal.hpp @@ -0,0 +1,106 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ +#ifndef GREENLET_INTERNAL_H +#define GREENLET_INTERNAL_H +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wunused-function" +# pragma clang diagnostic ignored "-Wmissing-field-initializers" +# pragma clang diagnostic ignored "-Wunused-variable" +#endif + +/** + * Implementation helpers. + * + * C++ templates and inline functions should go here. + */ +#define PY_SSIZE_T_CLEAN +#include "greenlet_compiler_compat.hpp" +#include "greenlet_cpython_compat.hpp" +#include "greenlet_exceptions.hpp" +#include "greenlet_greenlet.hpp" +#include "greenlet_allocator.hpp" + +#include +#include + +#define GREENLET_MODULE +struct _greenlet; +typedef struct _greenlet PyGreenlet; +namespace greenlet { + + class ThreadState; + +}; + + +#define implementation_ptr_t greenlet::Greenlet* + + +#include "greenlet.h" + +G_FP_TMPL_STATIC inline void +greenlet::refs::MainGreenletExactChecker(void *p) +{ + if (!p) { + return; + } + // We control the class of the main greenlet exactly. + if (Py_TYPE(p) != &PyGreenlet_Type) { + std::string err("MainGreenlet: Expected exactly a greenlet, not a "); + err += Py_TYPE(p)->tp_name; + throw greenlet::TypeError(err); + } + + // Greenlets from dead threads no longer respond to main() with a + // true value; so in that case we need to perform an additional + // check. + Greenlet* g = ((PyGreenlet*)p)->pimpl; + if (g->main()) { + return; + } + if (!dynamic_cast(g)) { + std::string err("MainGreenlet: Expected exactly a main greenlet, not a "); + err += Py_TYPE(p)->tp_name; + throw greenlet::TypeError(err); + } +} + + + +template +inline greenlet::Greenlet* greenlet::refs::_OwnedGreenlet::operator->() const noexcept +{ + return reinterpret_cast(this->p)->pimpl; +} + +template +inline greenlet::Greenlet* greenlet::refs::_BorrowedGreenlet::operator->() const noexcept +{ + return reinterpret_cast(this->p)->pimpl; +} + +#include +#include + + +extern PyTypeObject PyGreenlet_Type; + + + +/** + * Forward declarations needed in multiple files. + */ +static PyGreenlet* green_create_main(greenlet::ThreadState*); +static PyObject* green_switch(PyGreenlet* self, PyObject* args, PyObject* kwargs); +static int green_is_gc(BorrowedGreenlet self); + +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + + +#endif + +// Local Variables: +// flycheck-clang-include-path: ("../../include" "/opt/local/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10") +// End: diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_refs.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_refs.hpp new file mode 100644 index 00000000..72ee68b4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_refs.hpp @@ -0,0 +1,1100 @@ +#ifndef GREENLET_REFS_HPP +#define GREENLET_REFS_HPP + +#define PY_SSIZE_T_CLEAN +#include +//#include "greenlet_internal.hpp" +#include "greenlet_compiler_compat.hpp" +#include "greenlet_cpython_compat.hpp" +#include "greenlet_exceptions.hpp" + +struct _greenlet; +struct _PyMainGreenlet; + +typedef struct _greenlet PyGreenlet; +extern PyTypeObject PyGreenlet_Type; + + +#ifdef GREENLET_USE_STDIO +#include +using std::cerr; +using std::endl; +#endif + +namespace greenlet +{ + class Greenlet; + + namespace refs + { + // Type checkers throw a TypeError if the argument is not + // null, and isn't of the required Python type. + // (We can't use most of the defined type checkers + // like PyList_Check, etc, directly, because they are + // implemented as macros.) + typedef void (*TypeChecker)(void*); + + G_FP_TMPL_STATIC inline void + NoOpChecker(void*) + { + return; + } + + G_FP_TMPL_STATIC inline void + GreenletChecker(void *p) + { + if (!p) { + return; + } + + PyTypeObject* typ = Py_TYPE(p); + // fast, common path. (PyObject_TypeCheck is a macro or + // static inline function, and it also does a + // direct comparison of the type pointers, but its fast + // path only handles one type) + if (typ == &PyGreenlet_Type) { + return; + } + + if (!PyObject_TypeCheck(p, &PyGreenlet_Type)) { + std::string err("GreenletChecker: Expected any type of greenlet, not "); + err += Py_TYPE(p)->tp_name; + throw TypeError(err); + } + } + + G_FP_TMPL_STATIC inline void + MainGreenletExactChecker(void *p); + + template + class PyObjectPointer; + + template + class OwnedReference; + + + template + class BorrowedReference; + + typedef BorrowedReference BorrowedObject; + typedef OwnedReference OwnedObject; + + class ImmortalObject; + class ImmortalString; + + template + class _OwnedGreenlet; + + typedef _OwnedGreenlet OwnedGreenlet; + typedef _OwnedGreenlet OwnedMainGreenlet; + + template + class _BorrowedGreenlet; + + typedef _BorrowedGreenlet BorrowedGreenlet; + + G_FP_TMPL_STATIC inline void + ContextExactChecker(void *p) + { + if (!p) { + return; + } + if (!PyContext_CheckExact(p)) { + throw TypeError( + "greenlet context must be a contextvars.Context or None" + ); + } + } + + typedef OwnedReference OwnedContext; + } +} + +namespace greenlet { + + + namespace refs { + // A set of classes to make reference counting rules in python + // code explicit. + // + // Rules of use: + // (1) Functions returning a new reference that the caller of the + // function is expected to dispose of should return a + // ``OwnedObject`` object. This object automatically releases its + // reference when it goes out of scope. It works like a ``std::shared_ptr`` + // and can be copied or used as a function parameter (but don't do + // that). Note that constructing a ``OwnedObject`` from a + // PyObject* steals the reference. + // (2) Parameters to functions should be either a + // ``OwnedObject&``, or, more generally, a ``PyObjectPointer&``. + // If the function needs to create its own new reference, it can + // do so by copying to a local ``OwnedObject``. + // (3) Functions returning an existing pointer that is NOT + // incref'd, and which the caller MUST NOT decref, + // should return a ``BorrowedObject``. + + // + // For a class with a single pointer member, whose constructor + // does nothing but copy a pointer parameter into the member, and + // which can then be converted back to the pointer type, compilers + // generate code that's the same as just passing the pointer. + // That is, func(BorrowedObject x) called like ``PyObject* p = + // ...; f(p)`` has 0 overhead. Similarly, they "unpack" to the + // pointer type with 0 overhead. + // + // If there are no virtual functions, no complex inheritance (maybe?) and + // no destructor, these can be directly used as parameters in + // Python callbacks like tp_init: the layout is the same as a + // single pointer. Only subclasses with trivial constructors that + // do nothing but set the single pointer member are safe to use + // that way. + + + // This is the base class for things that can be done with a + // PyObject pointer. It assumes nothing about memory management. + // NOTE: Nothing is virtual, so subclasses shouldn't add new + // storage fields or try to override these methods. + template + class PyObjectPointer + { + public: + typedef T PyType; + protected: + T* p; + public: + explicit PyObjectPointer(T* it=nullptr) : p(it) + { + TC(p); + } + + // We don't allow automatic casting to PyObject* at this + // level, because then we could be passed to Py_DECREF/INCREF, + // but we want nothing to do with memory management. If you + // know better, then you can use the get() method, like on a + // std::shared_ptr. Except we name it borrow() to clarify that + // if this is a reference-tracked object, the pointer you get + // back will go away when the object does. + // TODO: This should probably not exist here, but be moved + // down to relevant sub-types. + + inline T* borrow() const noexcept + { + return this->p; + } + + PyObject* borrow_o() const noexcept + { + return reinterpret_cast(this->p); + } + + inline T* operator->() const noexcept + { + return this->p; + } + + bool is_None() const noexcept + { + return this->p == Py_None; + } + + inline PyObject* acquire_or_None() const noexcept + { + PyObject* result = this->p ? reinterpret_cast(this->p) : Py_None; + Py_INCREF(result); + return result; + } + + explicit operator bool() const noexcept + { + return p != nullptr; + } + + inline Py_ssize_t REFCNT() const noexcept + { + return p ? Py_REFCNT(p) : -42; + } + + inline PyTypeObject* TYPE() const noexcept + { + return p ? Py_TYPE(p) : nullptr; + } + + inline OwnedObject PyStr() const noexcept; + inline const std::string as_str() const noexcept; + inline OwnedObject PyGetAttr(const ImmortalObject& name) const noexcept; + inline OwnedObject PyRequireAttr(const char* const name) const; + inline OwnedObject PyRequireAttr(const ImmortalString& name) const; + inline OwnedObject PyCall(const BorrowedObject& arg) const; + inline OwnedObject PyCall(PyGreenlet* arg) const ; + inline OwnedObject PyCall(PyObject* arg) const ; + // PyObject_Call(this, args, kwargs); + inline OwnedObject PyCall(const BorrowedObject args, + const BorrowedObject kwargs) const; + inline OwnedObject PyCall(const OwnedObject& args, + const OwnedObject& kwargs) const; + + protected: + void _set_raw_pointer(void* t) + { + TC(t); + p = reinterpret_cast(t); + } + void* _get_raw_pointer() const + { + return p; + } + }; + +#ifdef GREENLET_USE_STDIO + template + std::ostream& operator<<(std::ostream& os, const PyObjectPointer& s) + { + const std::type_info& t = typeid(s); + os << t.name() + << "(addr=" << s.borrow() + << ", refcnt=" << s.REFCNT() + << ", value=" << s.as_str() + << ")"; + + return os; + } +#endif + + template + inline bool operator==(const PyObjectPointer& lhs, const void* const rhs) noexcept + { + return lhs.borrow_o() == rhs; + } + + template + inline bool operator==(const PyObjectPointer& lhs, const PyObjectPointer& rhs) noexcept + { + return lhs.borrow_o() == rhs.borrow_o(); + } + + template + inline bool operator!=(const PyObjectPointer& lhs, + const PyObjectPointer& rhs) noexcept + { + return lhs.borrow_o() != rhs.borrow_o(); + } + + template + class OwnedReference : public PyObjectPointer + { + private: + friend class OwnedList; + + protected: + explicit OwnedReference(T* it) : PyObjectPointer(it) + { + } + + public: + + // Constructors + + static OwnedReference consuming(PyObject* p) + { + return OwnedReference(reinterpret_cast(p)); + } + + static OwnedReference owning(T* p) + { + OwnedReference result(p); + Py_XINCREF(result.p); + return result; + } + + OwnedReference() : PyObjectPointer(nullptr) + {} + + explicit OwnedReference(const PyObjectPointer<>& other) + : PyObjectPointer(nullptr) + { + T* op = other.borrow(); + TC(op); + this->p = other.borrow(); + Py_XINCREF(this->p); + } + + // It would be good to make use of the C++11 distinction + // between move and copy operations, e.g., constructing from a + // pointer should be a move operation. + // In the common case of ``OwnedObject x = Py_SomeFunction()``, + // the call to the copy constructor will be elided completely. + OwnedReference(const OwnedReference& other) + : PyObjectPointer(other.p) + { + Py_XINCREF(this->p); + } + + static OwnedReference None() + { + Py_INCREF(Py_None); + return OwnedReference(Py_None); + } + + // We can assign from exactly our type without any extra checking + OwnedReference& operator=(const OwnedReference& other) + { + Py_XINCREF(other.p); + const T* tmp = this->p; + this->p = other.p; + Py_XDECREF(tmp); + return *this; + } + + OwnedReference& operator=(const BorrowedReference other) + { + return this->operator=(other.borrow()); + } + + OwnedReference& operator=(T* const other) + { + TC(other); + Py_XINCREF(other); + T* tmp = this->p; + this->p = other; + Py_XDECREF(tmp); + return *this; + } + + // We can assign from an arbitrary reference type + // if it passes our check. + template + OwnedReference& operator=(const OwnedReference& other) + { + X* op = other.borrow(); + TC(op); + return this->operator=(reinterpret_cast(op)); + } + + inline void steal(T* other) + { + assert(this->p == nullptr); + TC(other); + this->p = other; + } + + T* relinquish_ownership() + { + T* result = this->p; + this->p = nullptr; + return result; + } + + T* acquire() const + { + // Return a new reference. + // TODO: This may go away when we have reference objects + // throughout the code. + Py_XINCREF(this->p); + return this->p; + } + + // Nothing else declares a destructor, we're the leaf, so we + // should be able to get away without virtual. + ~OwnedReference() + { + Py_CLEAR(this->p); + } + + void CLEAR() + { + Py_CLEAR(this->p); + assert(this->p == nullptr); + } + }; + + static inline + void operator<<=(PyObject*& target, OwnedObject& o) + { + target = o.relinquish_ownership(); + } + + class NewReference : public OwnedObject + { + private: + G_NO_COPIES_OF_CLS(NewReference); + public: + // Consumes the reference. Only use this + // for API return values. + NewReference(PyObject* it) : OwnedObject(it) + { + } + }; + + class NewDictReference : public NewReference + { + private: + G_NO_COPIES_OF_CLS(NewDictReference); + public: + NewDictReference() : NewReference(PyDict_New()) + { + if (!this->p) { + throw PyErrOccurred(); + } + } + + void SetItem(const char* const key, PyObject* value) + { + Require(PyDict_SetItemString(this->p, key, value)); + } + + void SetItem(const PyObjectPointer<>& key, PyObject* value) + { + Require(PyDict_SetItem(this->p, key.borrow_o(), value)); + } + }; + + template + class _OwnedGreenlet: public OwnedReference + { + private: + protected: + _OwnedGreenlet(T* it) : OwnedReference(it) + {} + + public: + _OwnedGreenlet() : OwnedReference() + {} + + _OwnedGreenlet(const _OwnedGreenlet& other) : OwnedReference(other) + { + } + _OwnedGreenlet(OwnedMainGreenlet& other) : + OwnedReference(reinterpret_cast(other.acquire())) + { + } + _OwnedGreenlet(const BorrowedGreenlet& other); + // Steals a reference. + static _OwnedGreenlet consuming(PyGreenlet* it) + { + return _OwnedGreenlet(reinterpret_cast(it)); + } + + inline _OwnedGreenlet& operator=(const OwnedGreenlet& other) + { + return this->operator=(other.borrow()); + } + + inline _OwnedGreenlet& operator=(const BorrowedGreenlet& other); + + _OwnedGreenlet& operator=(const OwnedMainGreenlet& other) + { + PyGreenlet* owned = other.acquire(); + Py_XDECREF(this->p); + this->p = reinterpret_cast(owned); + return *this; + } + + _OwnedGreenlet& operator=(T* const other) + { + OwnedReference::operator=(other); + return *this; + } + + T* relinquish_ownership() + { + T* result = this->p; + this->p = nullptr; + return result; + } + + PyObject* relinquish_ownership_o() + { + return reinterpret_cast(relinquish_ownership()); + } + + inline Greenlet* operator->() const noexcept; + inline operator Greenlet*() const noexcept; + }; + + template + class BorrowedReference : public PyObjectPointer + { + public: + // Allow implicit creation from PyObject* pointers as we + // transition to using these classes. Also allow automatic + // conversion to PyObject* for passing to C API calls and even + // for Py_INCREF/DECREF, because we ourselves do no memory management. + BorrowedReference(T* it) : PyObjectPointer(it) + {} + + BorrowedReference(const PyObjectPointer& ref) : PyObjectPointer(ref.borrow()) + {} + + BorrowedReference() : PyObjectPointer(nullptr) + {} + + operator T*() const + { + return this->p; + } + }; + + typedef BorrowedReference BorrowedObject; + //typedef BorrowedReference BorrowedGreenlet; + + template + class _BorrowedGreenlet : public BorrowedReference + { + public: + _BorrowedGreenlet() : + BorrowedReference(nullptr) + {} + + _BorrowedGreenlet(T* it) : + BorrowedReference(it) + {} + + _BorrowedGreenlet(const BorrowedObject& it); + + _BorrowedGreenlet(const OwnedGreenlet& it) : + BorrowedReference(it.borrow()) + {} + + _BorrowedGreenlet& operator=(const BorrowedObject& other); + + // We get one of these for PyGreenlet, but one for PyObject + // is handy as well + operator PyObject*() const + { + return reinterpret_cast(this->p); + } + inline Greenlet* operator->() const noexcept; + inline operator Greenlet*() const noexcept; + }; + + typedef _BorrowedGreenlet BorrowedGreenlet; + + template + _OwnedGreenlet::_OwnedGreenlet(const BorrowedGreenlet& other) + : OwnedReference(reinterpret_cast(other.borrow())) + { + Py_XINCREF(this->p); + } + + + class BorrowedMainGreenlet + : public _BorrowedGreenlet + { + public: + BorrowedMainGreenlet(const OwnedMainGreenlet& it) : + _BorrowedGreenlet(it.borrow()) + {} + BorrowedMainGreenlet(PyGreenlet* it=nullptr) + : _BorrowedGreenlet(it) + {} + }; + + template + _OwnedGreenlet& _OwnedGreenlet::operator=(const BorrowedGreenlet& other) + { + return this->operator=(other.borrow()); + } + + + class ImmortalObject : public PyObjectPointer<> + { + private: + G_NO_ASSIGNMENT_OF_CLS(ImmortalObject); + public: + explicit ImmortalObject(PyObject* it) : PyObjectPointer<>(it) + { + } + + ImmortalObject(const ImmortalObject& other) + : PyObjectPointer<>(other.p) + { + + } + + /** + * Become the new owner of the object. Does not change the + * reference count. + */ + ImmortalObject& operator=(PyObject* it) + { + assert(this->p == nullptr); + this->p = it; + return *this; + } + + static ImmortalObject consuming(PyObject* it) + { + return ImmortalObject(it); + } + + inline operator PyObject*() const + { + return this->p; + } + }; + + class ImmortalString : public ImmortalObject + { + private: + G_NO_COPIES_OF_CLS(ImmortalString); + const char* str; + public: + ImmortalString(const char* const str) : + ImmortalObject(str ? Require(PyUnicode_InternFromString(str)) : nullptr) + { + this->str = str; + } + + inline ImmortalString& operator=(const char* const str) + { + if (!this->p) { + this->p = Require(PyUnicode_InternFromString(str)); + this->str = str; + } + else { + assert(this->str == str); + } + return *this; + } + + inline operator std::string() const + { + return this->str; + } + + }; + + class ImmortalEventName : public ImmortalString + { + private: + G_NO_COPIES_OF_CLS(ImmortalEventName); + public: + ImmortalEventName(const char* const str) : ImmortalString(str) + {} + }; + + class ImmortalException : public ImmortalObject + { + private: + G_NO_COPIES_OF_CLS(ImmortalException); + public: + ImmortalException(const char* const name, PyObject* base=nullptr) : + ImmortalObject(name + // Python 2.7 isn't const correct + ? Require(PyErr_NewException((char*)name, base, nullptr)) + : nullptr) + {} + + inline bool PyExceptionMatches() const + { + return PyErr_ExceptionMatches(this->p) > 0; + } + + }; + + template + inline OwnedObject PyObjectPointer::PyStr() const noexcept + { + if (!this->p) { + return OwnedObject(); + } + return OwnedObject::consuming(PyObject_Str(reinterpret_cast(this->p))); + } + + template + inline const std::string PyObjectPointer::as_str() const noexcept + { + // NOTE: This is not Python exception safe. + if (this->p) { + // The Python APIs return a cached char* value that's only valid + // as long as the original object stays around, and we're + // about to (probably) toss it. Hence the copy to std::string. + OwnedObject py_str = this->PyStr(); + if (!py_str) { + return "(nil)"; + } + return PyUnicode_AsUTF8(py_str.borrow()); + } + return "(nil)"; + } + + template + inline OwnedObject PyObjectPointer::PyGetAttr(const ImmortalObject& name) const noexcept + { + assert(this->p); + return OwnedObject::consuming(PyObject_GetAttr(reinterpret_cast(this->p), name)); + } + + template + inline OwnedObject PyObjectPointer::PyRequireAttr(const char* const name) const + { + assert(this->p); + return OwnedObject::consuming(Require(PyObject_GetAttrString(this->p, name), name)); + } + + template + inline OwnedObject PyObjectPointer::PyRequireAttr(const ImmortalString& name) const + { + assert(this->p); + return OwnedObject::consuming(Require( + PyObject_GetAttr( + reinterpret_cast(this->p), + name + ), + name + )); + } + + template + inline OwnedObject PyObjectPointer::PyCall(const BorrowedObject& arg) const + { + return this->PyCall(arg.borrow()); + } + + template + inline OwnedObject PyObjectPointer::PyCall(PyGreenlet* arg) const + { + return this->PyCall(reinterpret_cast(arg)); + } + + template + inline OwnedObject PyObjectPointer::PyCall(PyObject* arg) const + { + assert(this->p); + return OwnedObject::consuming(PyObject_CallFunctionObjArgs(this->p, arg, NULL)); + } + + template + inline OwnedObject PyObjectPointer::PyCall(const BorrowedObject args, + const BorrowedObject kwargs) const + { + assert(this->p); + return OwnedObject::consuming(PyObject_Call(this->p, args, kwargs)); + } + + template + inline OwnedObject PyObjectPointer::PyCall(const OwnedObject& args, + const OwnedObject& kwargs) const + { + assert(this->p); + return OwnedObject::consuming(PyObject_Call(this->p, args.borrow(), kwargs.borrow())); + } + + G_FP_TMPL_STATIC inline void + ListChecker(void * p) + { + if (!p) { + return; + } + if (!PyList_Check(p)) { + throw TypeError("Expected a list"); + } + } + + class OwnedList : public OwnedReference + { + private: + G_NO_ASSIGNMENT_OF_CLS(OwnedList); + public: + // TODO: Would like to use move. + explicit OwnedList(const OwnedObject& other) + : OwnedReference(other) + { + } + + OwnedList& operator=(const OwnedObject& other) + { + if (other && PyList_Check(other.p)) { + // Valid list. Own a new reference to it, discard the + // reference to what we did own. + PyObject* new_ptr = other.p; + Py_INCREF(new_ptr); + Py_XDECREF(this->p); + this->p = new_ptr; + } + else { + // Either the other object was NULL (an error) or it + // wasn't a list. Either way, we're now invalidated. + Py_XDECREF(this->p); + this->p = nullptr; + } + return *this; + } + + inline bool empty() const + { + return PyList_GET_SIZE(p) == 0; + } + + inline Py_ssize_t size() const + { + return PyList_GET_SIZE(p); + } + + inline BorrowedObject at(const Py_ssize_t index) const + { + return PyList_GET_ITEM(p, index); + } + + inline void clear() + { + PyList_SetSlice(p, 0, PyList_GET_SIZE(p), NULL); + } + }; + + // Use this to represent the module object used at module init + // time. + // This could either be a borrowed (Py2) or new (Py3) reference; + // either way, we don't want to do any memory management + // on it here, Python itself will handle that. + // XXX: Actually, that's not quite right. On Python 3, if an + // exception occurs before we return to the interpreter, this will + // leak; but all previous versions also had that problem. + class CreatedModule : public PyObjectPointer<> + { + private: + G_NO_COPIES_OF_CLS(CreatedModule); + public: + CreatedModule(PyModuleDef& mod_def) : PyObjectPointer<>( + Require(PyModule_Create(&mod_def))) + { + } + + // PyAddObject(): Add a reference to the object to the module. + // On return, the reference count of the object is unchanged. + // + // The docs warn that PyModule_AddObject only steals the + // reference on success, so if it fails after we've incref'd + // or allocated, we're responsible for the decref. + void PyAddObject(const char* name, const long new_bool) + { + OwnedObject p = OwnedObject::consuming(Require(PyBool_FromLong(new_bool))); + this->PyAddObject(name, p); + } + + void PyAddObject(const char* name, const OwnedObject& new_object) + { + // The caller already owns a reference they will decref + // when their variable goes out of scope, we still need to + // incref/decref. + this->PyAddObject(name, new_object.borrow()); + } + + void PyAddObject(const char* name, const ImmortalObject& new_object) + { + this->PyAddObject(name, new_object.borrow()); + } + + void PyAddObject(const char* name, PyTypeObject& type) + { + this->PyAddObject(name, reinterpret_cast(&type)); + } + + void PyAddObject(const char* name, PyObject* new_object) + { + Py_INCREF(new_object); + try { + Require(PyModule_AddObject(this->p, name, new_object)); + } + catch (const PyErrOccurred&) { + Py_DECREF(p); + throw; + } + } + }; + + class PyErrFetchParam : public PyObjectPointer<> + { + // Not an owned object, because we can't be initialized with + // one, and we only sometimes acquire ownership. + private: + G_NO_COPIES_OF_CLS(PyErrFetchParam); + public: + // To allow declaring these and passing them to + // PyErr_Fetch we implement the empty constructor, + // and the address operator. + PyErrFetchParam() : PyObjectPointer<>(nullptr) + { + } + + PyObject** operator&() + { + return &this->p; + } + + // This allows us to pass one directly without the &, + // BUT it has higher precedence than the bool operator + // if it's not explicit. + operator PyObject**() + { + return &this->p; + } + + // We don't want to be able to pass these to Py_DECREF and + // such so we don't have the implicit PyObject* conversion. + + inline PyObject* relinquish_ownership() + { + PyObject* result = this->p; + this->p = nullptr; + return result; + } + + ~PyErrFetchParam() + { + Py_XDECREF(p); + } + }; + + class OwnedErrPiece : public OwnedObject + { + private: + + public: + // Unlike OwnedObject, this increments the refcount. + OwnedErrPiece(PyObject* p=nullptr) : OwnedObject(p) + { + this->acquire(); + } + + PyObject** operator&() + { + return &this->p; + } + + inline operator PyObject*() const + { + return this->p; + } + + operator PyTypeObject*() const + { + return reinterpret_cast(this->p); + } + }; + + class PyErrPieces + { + private: + OwnedErrPiece type; + OwnedErrPiece instance; + OwnedErrPiece traceback; + bool restored; + public: + // Takes new references; if we're destroyed before + // restoring the error, we drop the references. + PyErrPieces(PyObject* t, PyObject* v, PyObject* tb) : + type(t), + instance(v), + traceback(tb), + restored(0) + { + this->normalize(); + } + + PyErrPieces() : + restored(0) + { + // PyErr_Fetch transfers ownership to us, so + // we don't actually need to INCREF; but we *do* + // need to DECREF if we're not restored. + PyErrFetchParam t, v, tb; + PyErr_Fetch(&t, &v, &tb); + type.steal(t.relinquish_ownership()); + instance.steal(v.relinquish_ownership()); + traceback.steal(tb.relinquish_ownership()); + } + + void PyErrRestore() + { + // can only do this once + assert(!this->restored); + this->restored = true; + PyErr_Restore( + this->type.relinquish_ownership(), + this->instance.relinquish_ownership(), + this->traceback.relinquish_ownership()); + assert(!this->type && !this->instance && !this->traceback); + } + + private: + void normalize() + { + // First, check the traceback argument, replacing None, + // with NULL + if (traceback.is_None()) { + traceback = nullptr; + } + + if (traceback && !PyTraceBack_Check(traceback.borrow())) { + throw PyErrOccurred(PyExc_TypeError, + "throw() third argument must be a traceback object"); + } + + if (PyExceptionClass_Check(type)) { + // If we just had a type, we'll now have a type and + // instance. + // The type's refcount will have gone up by one + // because of the instance and the instance will have + // a refcount of one. Either way, we owned, and still + // do own, exactly one reference. + PyErr_NormalizeException(&type, &instance, &traceback); + + } + else if (PyExceptionInstance_Check(type)) { + /* Raising an instance --- usually that means an + object that is a subclass of BaseException, but on + Python 2, that can also mean an arbitrary old-style + object. The value should be a dummy. */ + if (instance && !instance.is_None()) { + throw PyErrOccurred( + PyExc_TypeError, + "instance exception may not have a separate value"); + } + /* Normalize to raise , */ + this->instance = this->type; + this->type = PyExceptionInstance_Class(instance.borrow()); + + /* + It would be tempting to do this: + + Py_ssize_t type_count = Py_REFCNT(Py_TYPE(instance.borrow())); + this->type = PyExceptionInstance_Class(instance.borrow()); + assert(this->type.REFCNT() == type_count + 1); + + But that doesn't work on Python 2 in the case of + old-style instances: The result of Py_TYPE is going to + be the global shared that all + old-style classes have, while the return of Instance_Class() + will be the Python-level class object. The two are unrelated. + */ + } + else { + /* Not something you can raise. throw() fails. */ + PyErr_Format(PyExc_TypeError, + "exceptions must be classes, or instances, not %s", + Py_TYPE(type.borrow())->tp_name); + throw PyErrOccurred(); + } + } + }; + + // PyArg_Parse's O argument returns a borrowed reference. + class PyArgParseParam : public BorrowedObject + { + private: + G_NO_COPIES_OF_CLS(PyArgParseParam); + public: + explicit PyArgParseParam(PyObject* p=nullptr) : BorrowedObject(p) + { + } + + inline PyObject** operator&() + { + return &this->p; + } + }; + +};}; + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_slp_switch.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_slp_switch.hpp new file mode 100644 index 00000000..bd4b7ae1 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_slp_switch.hpp @@ -0,0 +1,99 @@ +#ifndef GREENLET_SLP_SWITCH_HPP +#define GREENLET_SLP_SWITCH_HPP + +#include "greenlet_compiler_compat.hpp" +#include "greenlet_refs.hpp" + +/* + * the following macros are spliced into the OS/compiler + * specific code, in order to simplify maintenance. + */ +// We can save about 10% of the time it takes to switch greenlets if +// we thread the thread state through the slp_save_state() and the +// following slp_restore_state() calls from +// slp_switch()->g_switchstack() (which already needs to access it). +// +// However: +// +// that requires changing the prototypes and implementations of the +// switching functions. If we just change the prototype of +// slp_switch() to accept the argument and update the macros, without +// changing the implementation of slp_switch(), we get crashes on +// 64-bit Linux and 32-bit x86 (for reasons that aren't 100% clear); +// on the other hand, 64-bit macOS seems to be fine. Also, 64-bit +// windows is an issue because slp_switch is written fully in assembly +// and currently ignores its argument so some code would have to be +// adjusted there to pass the argument on to the +// ``slp_save_state_asm()`` function (but interestingly, because of +// the calling convention, the extra argument is just ignored and +// things function fine, albeit slower, if we just modify +// ``slp_save_state_asm`()` to fetch the pointer to pass to the +// macro.) +// +// Our compromise is to use a *glabal*, untracked, weak, pointer +// to the necessary thread state during the process of switching only. +// This is safe because we're protected by the GIL, and if we're +// running this code, the thread isn't exiting. This also nets us a +// 10-12% speed improvement. + +static greenlet::Greenlet* volatile switching_thread_state = nullptr; + + +extern "C" { +static int GREENLET_NOINLINE(slp_save_state_trampoline)(char* stackref); +static void GREENLET_NOINLINE(slp_restore_state_trampoline)(); +} + + +#define SLP_SAVE_STATE(stackref, stsizediff) \ +do { \ + assert(switching_thread_state); \ + stackref += STACK_MAGIC; \ + if (slp_save_state_trampoline((char*)stackref)) \ + return -1; \ + if (!switching_thread_state->active()) \ + return 1; \ + stsizediff = switching_thread_state->stack_start() - (char*)stackref; \ +} while (0) + +#define SLP_RESTORE_STATE() slp_restore_state_trampoline() + +#define SLP_EVAL +extern "C" { +#define slp_switch GREENLET_NOINLINE(slp_switch) +#include "slp_platformselect.h" +} +#undef slp_switch + +#ifndef STACK_MAGIC +# error \ + "greenlet needs to be ported to this platform, or taught how to detect your compiler properly." +#endif /* !STACK_MAGIC */ + + + +#ifdef EXTERNAL_ASM +/* CCP addition: Make these functions, to be called from assembler. + * The token include file for the given platform should enable the + * EXTERNAL_ASM define so that this is included. + */ +extern "C" { +intptr_t +slp_save_state_asm(intptr_t* ref) +{ + intptr_t diff; + SLP_SAVE_STATE(ref, diff); + return diff; +} + +void +slp_restore_state_asm(void) +{ + SLP_RESTORE_STATE(); +} + +extern int slp_switch(void); +}; +#endif + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_state.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_state.hpp new file mode 100644 index 00000000..045371f8 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_state.hpp @@ -0,0 +1,543 @@ +#ifndef GREENLET_THREAD_STATE_HPP +#define GREENLET_THREAD_STATE_HPP + +#include +#include + +#include "greenlet_internal.hpp" +#include "greenlet_refs.hpp" +#include "greenlet_thread_support.hpp" + +using greenlet::refs::BorrowedObject; +using greenlet::refs::BorrowedGreenlet; +using greenlet::refs::BorrowedMainGreenlet; +using greenlet::refs::OwnedMainGreenlet; +using greenlet::refs::OwnedObject; +using greenlet::refs::OwnedGreenlet; +using greenlet::refs::OwnedList; +using greenlet::refs::PyErrFetchParam; +using greenlet::refs::PyArgParseParam; +using greenlet::refs::ImmortalString; +using greenlet::refs::CreatedModule; +using greenlet::refs::PyErrPieces; +using greenlet::refs::NewReference; + +namespace greenlet { +/** + * Thread-local state of greenlets. + * + * Each native thread will get exactly one of these objects, + * automatically accessed through the best available thread-local + * mechanism the compiler supports (``thread_local`` for C++11 + * compilers or ``__thread``/``declspec(thread)`` for older GCC/clang + * or MSVC, respectively.) + * + * Previously, we kept thread-local state mostly in a bunch of + * ``static volatile`` variables in the main greenlet file.. This had + * the problem of requiring extra checks, loops, and great care + * accessing these variables if we potentially invoked any Python code + * that could release the GIL, because the state could change out from + * under us. Making the variables thread-local solves this problem. + * + * When we detected that a greenlet API accessing the current greenlet + * was invoked from a different thread than the greenlet belonged to, + * we stored a reference to the greenlet in the Python thread + * dictionary for the thread the greenlet belonged to. This could lead + * to memory leaks if the thread then exited (because of a reference + * cycle, as greenlets referred to the thread dictionary, and deleting + * non-current greenlets leaked their frame plus perhaps arguments on + * the C stack). If a thread exited while still having running + * greenlet objects (perhaps that had just switched back to the main + * greenlet), and did not invoke one of the greenlet APIs *in that + * thread, immediately before it exited, without some other thread + * then being invoked*, such a leak was guaranteed. + * + * This can be partly solved by using compiler thread-local variables + * instead of the Python thread dictionary, thus avoiding a cycle. + * + * To fully solve this problem, we need a reliable way to know that a + * thread is done and we should clean up the main greenlet. On POSIX, + * we can use the destructor function of ``pthread_key_create``, but + * there's nothing similar on Windows; a C++11 thread local object + * reliably invokes its destructor when the thread it belongs to exits + * (non-C++11 compilers offer ``__thread`` or ``declspec(thread)`` to + * create thread-local variables, but they can't hold C++ objects that + * invoke destructors; the C++11 version is the most portable solution + * I found). When the thread exits, we can drop references and + * otherwise manipulate greenlets and frames that we know can no + * longer be switched to. For compilers that don't support C++11 + * thread locals, we have a solution that uses the python thread + * dictionary, though it may not collect everything as promptly as + * other compilers do, if some other library is using the thread + * dictionary and has a cycle or extra reference. + * + * There are two small wrinkles. The first is that when the thread + * exits, it is too late to actually invoke Python APIs: the Python + * thread state is gone, and the GIL is released. To solve *this* + * problem, our destructor uses ``Py_AddPendingCall`` to transfer the + * destruction work to the main thread. (This is not an issue for the + * dictionary solution.) + * + * The second is that once the thread exits, the thread local object + * is invalid and we can't even access a pointer to it, so we can't + * pass it to ``Py_AddPendingCall``. This is handled by actually using + * a second object that's thread local (ThreadStateCreator) and having + * it dynamically allocate this object so it can live until the + * pending call runs. + */ + + + +class ThreadState { +private: + // As of commit 08ad1dd7012b101db953f492e0021fb08634afad + // this class needed 56 bytes in o Py_DEBUG build + // on 64-bit macOS 11. + // Adding the vector takes us up to 80 bytes () + + /* Strong reference to the main greenlet */ + OwnedMainGreenlet main_greenlet; + + /* Strong reference to the current greenlet. */ + OwnedGreenlet current_greenlet; + + /* Strong reference to the trace function, if any. */ + OwnedObject tracefunc; + + typedef std::vector > deleteme_t; + /* A vector of raw PyGreenlet pointers representing things that need + deleted when this thread is running. The vector owns the + references, but you need to manually INCREF/DECREF as you use + them. We don't use a vector because we + make copy of this vector, and that would become O(n) as all the + refcounts are incremented in the copy. + */ + deleteme_t deleteme; + +#ifdef GREENLET_NEEDS_EXCEPTION_STATE_SAVED + void* exception_state; +#endif + + static std::clock_t _clocks_used_doing_gc; + static ImmortalString get_referrers_name; + static PythonAllocator allocator; + + G_NO_COPIES_OF_CLS(ThreadState); + +public: + static void* operator new(size_t UNUSED(count)) + { + return ThreadState::allocator.allocate(1); + } + + static void operator delete(void* ptr) + { + return ThreadState::allocator.deallocate(static_cast(ptr), + 1); + } + + static void init() + { + ThreadState::get_referrers_name = "get_referrers"; + ThreadState::_clocks_used_doing_gc = 0; + } + + ThreadState() + : main_greenlet(OwnedMainGreenlet::consuming(green_create_main(this))), + current_greenlet(main_greenlet) + { + if (!this->main_greenlet) { + // We failed to create the main greenlet. That's bad. + throw PyFatalError("Failed to create main greenlet"); + } + // The main greenlet starts with 1 refs: The returned one. We + // then copied it to the current greenlet. + assert(this->main_greenlet.REFCNT() == 2); + +#ifdef GREENLET_NEEDS_EXCEPTION_STATE_SAVED + this->exception_state = slp_get_exception_state(); +#endif + } + + inline void restore_exception_state() + { +#ifdef GREENLET_NEEDS_EXCEPTION_STATE_SAVED + // It's probably important this be inlined and only call C + // functions to avoid adding an SEH frame. + slp_set_exception_state(this->exception_state); +#endif + } + + inline bool has_main_greenlet() + { + return !!this->main_greenlet; + } + + // Called from the ThreadStateCreator when we're in non-standard + // threading mode. In that case, there is an object in the Python + // thread state dictionary that points to us. The main greenlet + // also traverses into us, in which case it's crucial not to + // traverse back into the main greenlet. + int tp_traverse(visitproc visit, void* arg, bool traverse_main=true) + { + if (traverse_main) { + Py_VISIT(main_greenlet.borrow_o()); + } + if (traverse_main || current_greenlet != main_greenlet) { + Py_VISIT(current_greenlet.borrow_o()); + } + Py_VISIT(tracefunc.borrow()); + return 0; + } + + inline BorrowedMainGreenlet borrow_main_greenlet() const + { + assert(this->main_greenlet); + assert(this->main_greenlet.REFCNT() >= 2); + return this->main_greenlet; + }; + + inline OwnedMainGreenlet get_main_greenlet() + { + return this->main_greenlet; + } + + /** + * In addition to returning a new reference to the currunt + * greenlet, this performs any maintenance needed. + */ + inline OwnedGreenlet get_current() + { + /* green_dealloc() cannot delete greenlets from other threads, so + it stores them in the thread dict; delete them now. */ + this->clear_deleteme_list(); + //assert(this->current_greenlet->main_greenlet == this->main_greenlet); + //assert(this->main_greenlet->main_greenlet == this->main_greenlet); + return this->current_greenlet; + } + + /** + * As for non-const get_current(); + */ + inline BorrowedGreenlet borrow_current() + { + this->clear_deleteme_list(); + return this->current_greenlet; + } + + /** + * Does no maintenance. + */ + inline OwnedGreenlet get_current() const + { + return this->current_greenlet; + } + + template + inline bool is_current(const refs::PyObjectPointer& obj) const + { + return this->current_greenlet.borrow_o() == obj.borrow_o(); + } + + inline void set_current(const OwnedGreenlet& target) + { + this->current_greenlet = target; + } + +private: + /** + * Deref and remove the greenlets from the deleteme list. Must be + * holding the GIL. + * + * If *murder* is true, then we must be called from a different + * thread than the one that these greenlets were running in. + * In that case, if the greenlet was actually running, we destroy + * the frame reference and otherwise make it appear dead before + * proceeding; otherwise, we would try (and fail) to raise an + * exception in it and wind up right back in this list. + */ + inline void clear_deleteme_list(const bool murder=false) + { + if (!this->deleteme.empty()) { + // It's possible we could add items to this list while + // running Python code if there's a thread switch, so we + // need to defensively copy it before that can happen. + deleteme_t copy = this->deleteme; + this->deleteme.clear(); // in case things come back on the list + for(deleteme_t::iterator it = copy.begin(), end = copy.end(); + it != end; + ++it ) { + PyGreenlet* to_del = *it; + if (murder) { + // Force each greenlet to appear dead; we can't raise an + // exception into it anymore anyway. + to_del->pimpl->murder_in_place(); + } + + // The only reference to these greenlets should be in + // this list, decreffing them should let them be + // deleted again, triggering calls to green_dealloc() + // in the correct thread (if we're not murdering). + // This may run arbitrary Python code and switch + // threads or greenlets! + Py_DECREF(to_del); + if (PyErr_Occurred()) { + PyErr_WriteUnraisable(nullptr); + PyErr_Clear(); + } + } + } + } + +public: + + /** + * Returns a new reference, or a false object. + */ + inline OwnedObject get_tracefunc() const + { + return tracefunc; + }; + + + inline void set_tracefunc(BorrowedObject tracefunc) + { + assert(tracefunc); + if (tracefunc == BorrowedObject(Py_None)) { + this->tracefunc.CLEAR(); + } + else { + this->tracefunc = tracefunc; + } + } + + /** + * Given a reference to a greenlet that some other thread + * attempted to delete (has a refcount of 0) store it for later + * deletion when the thread this state belongs to is current. + */ + inline void delete_when_thread_running(PyGreenlet* to_del) + { + Py_INCREF(to_del); + this->deleteme.push_back(to_del); + } + + /** + * Set to std::clock_t(-1) to disable. + */ + inline static std::clock_t& clocks_used_doing_gc() + { + return ThreadState::_clocks_used_doing_gc; + } + + ~ThreadState() + { + if (!PyInterpreterState_Head()) { + // We shouldn't get here (our callers protect us) + // but if we do, all we can do is bail early. + return; + } + + // We should not have an "origin" greenlet; that only exists + // for the temporary time during a switch, which should not + // be in progress as the thread dies. + //assert(!this->switching_state.origin); + + this->tracefunc.CLEAR(); + + // Forcibly GC as much as we can. + this->clear_deleteme_list(true); + + // The pending call did this. + assert(this->main_greenlet->thread_state() == nullptr); + + // If the main greenlet is the current greenlet, + // then we "fell off the end" and the thread died. + // It's possible that there is some other greenlet that + // switched to us, leaving a reference to the main greenlet + // on the stack, somewhere uncollectible. Try to detect that. + if (this->current_greenlet == this->main_greenlet && this->current_greenlet) { + assert(this->current_greenlet->is_currently_running_in_some_thread()); + // Drop one reference we hold. + this->current_greenlet.CLEAR(); + assert(!this->current_greenlet); + // Only our reference to the main greenlet should be left, + // But hold onto the pointer in case we need to do extra cleanup. + PyGreenlet* old_main_greenlet = this->main_greenlet.borrow(); + Py_ssize_t cnt = this->main_greenlet.REFCNT(); + this->main_greenlet.CLEAR(); + if (ThreadState::_clocks_used_doing_gc != std::clock_t(-1) + && cnt == 2 && Py_REFCNT(old_main_greenlet) == 1) { + // Highly likely that the reference is somewhere on + // the stack, not reachable by GC. Verify. + // XXX: This is O(n) in the total number of objects. + // TODO: Add a way to disable this at runtime, and + // another way to report on it. + std::clock_t begin = std::clock(); + NewReference gc(PyImport_ImportModule("gc")); + if (gc) { + OwnedObject get_referrers = gc.PyRequireAttr(ThreadState::get_referrers_name); + OwnedList refs(get_referrers.PyCall(old_main_greenlet)); + if (refs && refs.empty()) { + assert(refs.REFCNT() == 1); + // We found nothing! So we left a dangling + // reference: Probably the last thing some + // other greenlet did was call + // 'getcurrent().parent.switch()' to switch + // back to us. Clean it up. This will be the + // case on CPython 3.7 and newer, as they use + // an internal calling conversion that avoids + // creating method objects and storing them on + // the stack. + Py_DECREF(old_main_greenlet); + } + else if (refs + && refs.size() == 1 + && PyCFunction_Check(refs.at(0)) + && Py_REFCNT(refs.at(0)) == 2) { + assert(refs.REFCNT() == 1); + // Ok, we found a C method that refers to the + // main greenlet, and its only referenced + // twice, once in the list we just created, + // once from...somewhere else. If we can't + // find where else, then this is a leak. + // This happens in older versions of CPython + // that create a bound method object somewhere + // on the stack that we'll never get back to. + if (PyCFunction_GetFunction(refs.at(0).borrow()) == (PyCFunction)green_switch) { + BorrowedObject function_w = refs.at(0); + refs.clear(); // destroy the reference + // from the list. + // back to one reference. Can *it* be + // found? + assert(function_w.REFCNT() == 1); + refs = get_referrers.PyCall(function_w); + if (refs && refs.empty()) { + // Nope, it can't be found so it won't + // ever be GC'd. Drop it. + Py_CLEAR(function_w); + } + } + } + std::clock_t end = std::clock(); + ThreadState::_clocks_used_doing_gc += (end - begin); + } + } + } + + // We need to make sure this greenlet appears to be dead, + // because otherwise deallocing it would fail to raise an + // exception in it (the thread is dead) and put it back in our + // deleteme list. + if (this->current_greenlet) { + this->current_greenlet->murder_in_place(); + this->current_greenlet.CLEAR(); + } + + if (this->main_greenlet) { + // Couldn't have been the main greenlet that was running + // when the thread exited (because we already cleared this + // pointer if it was). This shouldn't be possible? + + // If the main greenlet was current when the thread died (it + // should be, right?) then we cleared its self pointer above + // when we cleared the current greenlet's main greenlet pointer. + // assert(this->main_greenlet->main_greenlet == this->main_greenlet + // || !this->main_greenlet->main_greenlet); + // // self reference, probably gone + // this->main_greenlet->main_greenlet.CLEAR(); + + // This will actually go away when the ivar is destructed. + this->main_greenlet.CLEAR(); + } + + if (PyErr_Occurred()) { + PyErr_WriteUnraisable(NULL); + PyErr_Clear(); + } + + } + +}; + +ImmortalString ThreadState::get_referrers_name(nullptr); +PythonAllocator ThreadState::allocator; +std::clock_t ThreadState::_clocks_used_doing_gc(0); + +template +class ThreadStateCreator +{ +private: + // Initialized to 1, and, if still 1, created on access. + // Set to 0 on destruction. + ThreadState* _state; + G_NO_COPIES_OF_CLS(ThreadStateCreator); +public: + + // Only one of these, auto created per thread + ThreadStateCreator() : + _state((ThreadState*)1) + { + } + + ~ThreadStateCreator() + { + ThreadState* tmp = this->_state; + this->_state = nullptr; + if (tmp && tmp != (ThreadState*)1) { + Destructor x(tmp); + } + } + + inline ThreadState& state() + { + // The main greenlet will own this pointer when it is created, + // which will be right after this. The plan is to give every + // greenlet a pointer to the main greenlet for the thread it + // runs in; if we are doing something cross-thread, we need to + // access the pointer from the main greenlet. Deleting the + // thread, and hence the thread-local storage, will delete the + // state pointer in the main greenlet. + if (this->_state == (ThreadState*)1) { + // XXX: Assuming allocation never fails + this->_state = new ThreadState; + // For non-standard threading, we need to store an object + // in the Python thread state dictionary so that it can be + // DECREF'd when the thread ends (ideally; the dict could + // last longer) and clean this object up. + } + if (!this->_state) { + throw std::runtime_error("Accessing state after destruction."); + } + return *this->_state; + } + + operator ThreadState&() + { + return this->state(); + } + + operator ThreadState*() + { + return &this->state(); + } + + inline int tp_traverse(visitproc visit, void* arg) + { + if (this->_state) { + return this->_state->tp_traverse(visit, arg); + } + return 0; + } + +}; + + +// We can't use the PythonAllocator for this, because we push to it +// from the thread state destructor, which doesn't have the GIL, +// and Python's allocators can only be called with the GIL. +typedef std::vector cleanup_queue_t; + +}; // namespace greenlet + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_state_dict_cleanup.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_state_dict_cleanup.hpp new file mode 100644 index 00000000..acf39c8f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_state_dict_cleanup.hpp @@ -0,0 +1,118 @@ +#ifndef GREENLET_THREAD_STATE_DICT_CLEANUP_HPP +#define GREENLET_THREAD_STATE_DICT_CLEANUP_HPP + +#include "greenlet_internal.hpp" +#include "greenlet_thread_state.hpp" + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wmissing-field-initializers" +#endif + +#ifndef G_THREAD_STATE_DICT_CLEANUP_TYPE +// shut the compiler up if it looks at this file in isolation +#define ThreadStateCreator int +#endif + +// Define a Python object that goes in the Python thread state dict +// when the greenlet thread state is created, and which owns the +// reference to the greenlet thread local state. +// When the thread state dict is cleaned up, so too is the thread +// state. This works best if we make sure there are no circular +// references to the thread state. +typedef struct _PyGreenletCleanup { + PyObject_HEAD + ThreadStateCreator* thread_state_creator; +} PyGreenletCleanup; + +static void +cleanup_do_dealloc(PyGreenletCleanup* self) +{ + ThreadStateCreator* tmp = self->thread_state_creator; + self->thread_state_creator = nullptr; + if (tmp) { + delete tmp; + } +} + +static void +cleanup_dealloc(PyGreenletCleanup* self) +{ + PyObject_GC_UnTrack(self); + cleanup_do_dealloc(self); +} + +static int +cleanup_clear(PyGreenletCleanup* self) +{ + // This method is never called by our test cases. + cleanup_do_dealloc(self); + return 0; +} + +static int +cleanup_traverse(PyGreenletCleanup* self, visitproc visit, void* arg) +{ + if (self->thread_state_creator) { + return self->thread_state_creator->tp_traverse(visit, arg); + } + return 0; +} + +static int +cleanup_is_gc(PyGreenlet* UNUSED(self)) +{ + return 1; +} + +static PyTypeObject PyGreenletCleanup_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "greenlet._greenlet.ThreadStateCleanup", + sizeof(struct _PyGreenletCleanup), + 0, /* tp_itemsize */ + /* methods */ + (destructor)cleanup_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as _number*/ + 0, /* tp_as _sequence*/ + 0, /* tp_as _mapping*/ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer*/ + G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + "Internal use only", /* tp_doc */ + (traverseproc)cleanup_traverse, /* tp_traverse */ + (inquiry)cleanup_clear, /* tp_clear */ + 0, /* tp_richcompare */ + // XXX: Don't our flags promise a weakref? + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + PyType_GenericAlloc, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ + PyObject_GC_Del, /* tp_free */ + (inquiry)cleanup_is_gc, /* tp_is_gc */ +}; + +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_support.hpp b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_support.hpp new file mode 100644 index 00000000..3ded7d2b --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/greenlet_thread_support.hpp @@ -0,0 +1,31 @@ +#ifndef GREENLET_THREAD_SUPPORT_HPP +#define GREENLET_THREAD_SUPPORT_HPP + +/** + * Defines various utility functions to help greenlet integrate well + * with threads. This used to be needed when we supported Python + * 2.7 on Windows, which used a very old compiler. We wrote an + * alternative implementation using Python APIs and POSIX or Windows + * APIs, but that's no longer needed. So this file is a shadow of its + * former self --- but may be needed in the future. + */ + +#include +#include +#include + +#include "greenlet_compiler_compat.hpp" + +namespace greenlet { + typedef std::mutex Mutex; + typedef std::lock_guard LockGuard; + class LockInitError : public std::runtime_error + { + public: + LockInitError(const char* what) : std::runtime_error(what) + {}; + }; +}; + + +#endif /* GREENLET_THREAD_SUPPORT_HPP */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/__init__.py b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..900a37294ada535ca44390f1c246531832fb48ca GIT binary patch literal 189 zcmYe~<>g`k0-1;AsUZ3>h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o11$*(xTqIJKxa zCZiz6CBHl`CqFTzIL19Uv7lJNBQZHUu_PluPa!!!w;(1RD43d87UPqd6jPj8lB!z( zl21=9j!7>{P0h + * Add support for strange GCC caller-save decisions + * (ported from switch_aarch64_gcc.h) + * 18-Aug-11 Alexey Borzenkov + * Correctly save rbp, csr and cw + * 01-Apr-04 Hye-Shik Chang + * Ported from i386 to amd64. + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for spark + * 31-Avr-02 Armin Rigo + * Added ebx, esi and edi register-saves. + * 01-Mar-02 Samual M. Rushing + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +/* #define STACK_MAGIC 3 */ +/* the above works fine with gcc 2.96, but 2.95.3 wants this */ +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "r12", "r13", "r14", "r15" + +static int +slp_switch(void) +{ + int err; + void* rbp; + void* rbx; + unsigned int csr; + unsigned short cw; + /* This used to be declared 'register', but that does nothing in + modern compilers and is explicitly forbidden in some new + standards. */ + long *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("fstcw %0" : "=m" (cw)); + __asm__ volatile ("stmxcsr %0" : "=m" (csr)); + __asm__ volatile ("movq %%rbp, %0" : "=m" (rbp)); + __asm__ volatile ("movq %%rbx, %0" : "=m" (rbx)); + __asm__ ("movq %%rsp, %0" : "=g" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "addq %0, %%rsp\n" + "addq %0, %%rbp\n" + : + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + __asm__ volatile ("xorq %%rax, %%rax" : "=a" (err)); + } + __asm__ volatile ("movq %0, %%rbx" : : "m" (rbx)); + __asm__ volatile ("movq %0, %%rbp" : : "m" (rbp)); + __asm__ volatile ("ldmxcsr %0" : : "m" (csr)); + __asm__ volatile ("fldcw %0" : : "m" (cw)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h new file mode 100644 index 00000000..655003aa --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm32_gcc.h @@ -0,0 +1,79 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 14-Aug-06 File creation. Ported from Arm Thumb. Sylvain Baro + * 3-Sep-06 Commented out saving of r1-r3 (r4 already commented out) as I + * read that these do not need to be saved. Also added notes and + * errors related to the frame pointer. Richard Tew. + * + * NOTES + * + * It is not possible to detect if fp is used or not, so the supplied + * switch function needs to support it, so that you can remove it if + * it does not apply to you. + * + * POSSIBLE ERRORS + * + * "fp cannot be used in asm here" + * + * - Try commenting out "fp" in REGS_TO_SAVE. + * + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL +#define STACK_MAGIC 0 +#define REG_SP "sp" +#define REG_SPSP "sp,sp" +#ifdef __thumb__ +#define REG_FP "r7" +#define REG_FPFP "r7,r7" +#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r8", "r9", "r10", "r11", "lr" +#else +#define REG_FP "fp" +#define REG_FPFP "fp,fp" +#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr" +#endif +#if defined(__SOFTFP__) +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL +#elif defined(__VFP_FP__) +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "d8", "d9", "d10", "d11", \ + "d12", "d13", "d14", "d15" +#elif defined(__MAVERICK__) +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "mvf4", "mvf5", "mvf6", "mvf7", \ + "mvf8", "mvf9", "mvf10", "mvf11", \ + "mvf12", "mvf13", "mvf14", "mvf15" +#else +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "f4", "f5", "f6", "f7" +#endif + +static int +#ifdef __GNUC__ +__attribute__((optimize("no-omit-frame-pointer"))) +#endif +slp_switch(void) +{ + void *fp; + int *stackref, stsizediff; + int result; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("mov r0," REG_FP "\n\tstr r0,%0" : "=m" (fp) : : "r0"); + __asm__ ("mov %0," REG_SP : "=r" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "add " REG_SPSP ",%0\n" + "add " REG_FPFP ",%0\n" + : + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("ldr r0,%1\n\tmov " REG_FP ",r0\n\tmov %0, #0" : "=r" (result) : "m" (fp) : "r0"); + __asm__ volatile ("" : : : REGS_TO_SAVE); + return result; +} + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm32_ios.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm32_ios.h new file mode 100644 index 00000000..9e640e15 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm32_ios.h @@ -0,0 +1,67 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 31-May-15 iOS support. Ported from arm32. Proton + * + * NOTES + * + * It is not possible to detect if fp is used or not, so the supplied + * switch function needs to support it, so that you can remove it if + * it does not apply to you. + * + * POSSIBLE ERRORS + * + * "fp cannot be used in asm here" + * + * - Try commenting out "fp" in REGS_TO_SAVE. + * + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 +#define REG_SP "sp" +#define REG_SPSP "sp,sp" +#define REG_FP "r7" +#define REG_FPFP "r7,r7" +#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r8", "r10", "r11", "lr" +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "d8", "d9", "d10", "d11", \ + "d12", "d13", "d14", "d15" + +static int +#ifdef __GNUC__ +__attribute__((optimize("no-omit-frame-pointer"))) +#endif +slp_switch(void) +{ + void *fp; + int *stackref, stsizediff, result; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("str " REG_FP ",%0" : "=m" (fp)); + __asm__ ("mov %0," REG_SP : "=r" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "add " REG_SPSP ",%0\n" + "add " REG_FPFP ",%0\n" + : + : "r" (stsizediff) + : REGS_TO_SAVE /* Clobber registers, force compiler to + * recalculate address of void *fp from REG_SP or REG_FP */ + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ( + "ldr " REG_FP ", %1\n\t" + "mov %0, #0" + : "=r" (result) + : "m" (fp) + : REGS_TO_SAVE /* Force compiler to restore saved registers after this */ + ); + return result; +} + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_masm.asm b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_masm.asm new file mode 100644 index 00000000..29f9c225 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_masm.asm @@ -0,0 +1,53 @@ + AREA switch_arm64_masm, CODE, READONLY; + GLOBAL slp_switch [FUNC] + EXTERN slp_save_state_asm + EXTERN slp_restore_state_asm + +slp_switch + ; push callee saved registers to stack + stp x19, x20, [sp, #-16]! + stp x21, x22, [sp, #-16]! + stp x23, x24, [sp, #-16]! + stp x25, x26, [sp, #-16]! + stp x27, x28, [sp, #-16]! + stp x29, x30, [sp, #-16]! + stp d8, d9, [sp, #-16]! + stp d10, d11, [sp, #-16]! + stp d12, d13, [sp, #-16]! + stp d14, d15, [sp, #-16]! + + ; call slp_save_state_asm with stack pointer + mov x0, sp + bl slp_save_state_asm + + ; early return for return value of 1 and -1 + cmp x0, #-1 + b.eq RETURN + cmp x0, #1 + b.eq RETURN + + ; increment stack and frame pointer + add sp, sp, x0 + add x29, x29, x0 + + bl slp_restore_state_asm + + ; store return value for successful completion of routine + mov x0, #0 + +RETURN + ; pop registers from stack + ldp d14, d15, [sp], #16 + ldp d12, d13, [sp], #16 + ldp d10, d11, [sp], #16 + ldp d8, d9, [sp], #16 + ldp x29, x30, [sp], #16 + ldp x27, x28, [sp], #16 + ldp x25, x26, [sp], #16 + ldp x23, x24, [sp], #16 + ldp x21, x22, [sp], #16 + ldp x19, x20, [sp], #16 + + ret + + END diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_masm.obj b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_masm.obj new file mode 100644 index 0000000000000000000000000000000000000000..f6f220e4310baaa9756110685ce7d6a2bdf90c37 GIT binary patch literal 746 zcma)4PiqrF6n~qoo~*PNZ{i+=wji4b#Xu2~wiJpGk)*AMF07NyB(9n1#+i+!)I;v| zBKQG3?t1eB$T(lYgGb4+lu{_QmQrebldQB_4?cMF-uu0IZ{DA2e8@rZ+e^~30488W z`B{KPh%yV{HEIpyeum^wI#7P*HfX)ux?9U&c!SFK-$o|OFtKn{Q|a-#N>2inp0-tb zCRKXAtg2SolaoLv$Ll&ds_Epj?SH+8K{t?XSjKaFsEy%yh}=V70BaHj zEY5kWk_zcJo{$SSUL~=K(zW|tnhm$rA z<%dZ$q?>RX*18r{!azhaYR1lVb;g;mR-6h!#F>|p@;aje%0a|CZrE7s+SXuT>MS=Y ziQPiMY-5DD&5+S7^H03fy7qt7ir}L34kK|h68s-MU>{lXOqlr?!Y=`~WwviNenFS_ zZalVSHh-0FU4lj#X8u5`ODn6@#{f?dHE&%XdP~_I3;$RS9-(z*>>ydkm*f@oWlUn~ Qn+^;lsEi}=H#!Q3U&UU-WdHyG literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_msvc.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_msvc.h new file mode 100644 index 00000000..7ab7f45b --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_arm64_msvc.h @@ -0,0 +1,17 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 21-Oct-21 Niyas Sait + * First version to enable win/arm64 support. + */ + +#define STACK_REFPLUS 1 +#define STACK_MAGIC 0 + +/* Use the generic support for an external assembly language slp_switch function. */ +#define EXTERNAL_ASM + +#ifdef SLP_EVAL +/* This always uses the external masm assembly file. */ +#endif \ No newline at end of file diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_csky_gcc.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_csky_gcc.h new file mode 100644 index 00000000..ac469d3a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_csky_gcc.h @@ -0,0 +1,48 @@ +#ifdef SLP_EVAL +#define STACK_MAGIC 0 +#define REG_FP "r8" +#ifdef __CSKYABIV2__ +#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r7", "r9", "r10", "r11", "r15",\ + "r16", "r17", "r18", "r19", "r20", "r21", "r22",\ + "r23", "r24", "r25" + +#if defined (__CSKY_HARD_FLOAT__) || (__CSKY_VDSP__) +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "vr8", "vr9", "vr10", "vr11", "vr12",\ + "vr13", "vr14", "vr15" +#else +#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL +#endif +#else +#define REGS_TO_SAVE "r9", "r10", "r11", "r12", "r13", "r15" +#endif + + +static int +#ifdef __GNUC__ +__attribute__((optimize("no-omit-frame-pointer"))) +#endif +slp_switch(void) +{ + int *stackref, stsizediff; + int result; + + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("mov %0, sp" : "=r" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "addu sp,%0\n" + "addu "REG_FP",%0\n" + : + : "r" (stsizediff) + ); + + SLP_RESTORE_STATE(); + } + __asm__ volatile ("movi %0, 0" : "=r" (result)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + + return result; +} + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_loongarch64_linux.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_loongarch64_linux.h new file mode 100644 index 00000000..9eaf34ef --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_loongarch64_linux.h @@ -0,0 +1,31 @@ +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "s0", "s1", "s2", "s3", "s4", "s5", \ + "s6", "s7", "s8", "fp", \ + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31" + +static int +slp_switch(void) +{ + int ret; + long *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("move %0, $sp" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "add.d $sp, $sp, %0\n\t" + : /* no outputs */ + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("move %0, $zero" : "=r" (ret) : ); + return ret; +} + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h new file mode 100644 index 00000000..da761c2d --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_m68k_gcc.h @@ -0,0 +1,38 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 2014-01-06 Andreas Schwab + * File created. + */ + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \ + "%a2", "%a3", "%a4" + +static int +slp_switch(void) +{ + int err; + int *stackref, stsizediff; + void *fp, *a5; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("move.l %%fp, %0" : "=m"(fp)); + __asm__ volatile ("move.l %%a5, %0" : "=m"(a5)); + __asm__ ("move.l %%sp, %0" : "=r"(stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ("add.l %0, %%sp; add.l %0, %%fp" : : "r"(stsizediff)); + SLP_RESTORE_STATE(); + __asm__ volatile ("clr.l %0" : "=g" (err)); + } + __asm__ volatile ("move.l %0, %%a5" : : "m"(a5)); + __asm__ volatile ("move.l %0, %%fp" : : "m"(fp)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + return err; +} + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_mips_unix.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_mips_unix.h new file mode 100644 index 00000000..b9003e94 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_mips_unix.h @@ -0,0 +1,64 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 20-Sep-14 Matt Madison + * Re-code the saving of the gp register for MIPS64. + * 05-Jan-08 Thiemo Seufer + * Ported from ppc. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "$16", "$17", "$18", "$19", "$20", "$21", "$22", \ + "$23", "$30" +static int +slp_switch(void) +{ + int err; + int *stackref, stsizediff; +#ifdef __mips64 + uint64_t gpsave; +#endif + __asm__ __volatile__ ("" : : : REGS_TO_SAVE); +#ifdef __mips64 + __asm__ __volatile__ ("sd $28,%0" : "=m" (gpsave) : : ); +#endif + __asm__ ("move %0, $29" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ __volatile__ ( +#ifdef __mips64 + "daddu $29, %0\n" +#else + "addu $29, %0\n" +#endif + : /* no outputs */ + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } +#ifdef __mips64 + __asm__ __volatile__ ("ld $28,%0" : : "m" (gpsave) : ); +#endif + __asm__ __volatile__ ("" : : : REGS_TO_SAVE); + __asm__ __volatile__ ("move %0, $0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h new file mode 100644 index 00000000..e7e0b877 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc64_aix.h @@ -0,0 +1,103 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 16-Oct-20 Jesse Gorzinski + * Copied from Linux PPC64 implementation + * 04-Sep-18 Alexey Borzenkov + * Workaround a gcc bug using manual save/restore of r30 + * 21-Mar-18 Tulio Magno Quites Machado Filho + * Added r30 to the list of saved registers in order to fully comply with + * both ppc64 ELFv1 ABI and the ppc64le ELFv2 ABI, that classify this + * register as a nonvolatile register used for local variables. + * 21-Mar-18 Laszlo Boszormenyi + * Save r2 (TOC pointer) manually. + * 10-Dec-13 Ulrich Weigand + * Support ELFv2 ABI. Save float/vector registers. + * 09-Mar-12 Michael Ellerman + * 64-bit implementation, copied from 32-bit. + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + * 31-Jul-12 Trevor Bowen + * Changed memory constraints to register only. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 6 + +#if defined(__ALTIVEC__) +#define ALTIVEC_REGS \ + "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", \ + "v28", "v29", "v30", "v31", +#else +#define ALTIVEC_REGS +#endif + +#define REGS_TO_SAVE "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "r31", \ + "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", \ + "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", \ + "fr30", "fr31", \ + ALTIVEC_REGS \ + "cr2", "cr3", "cr4" + +static int +slp_switch(void) +{ + int err; + long *stackref, stsizediff; + void * toc; + void * r30; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("std 2, %0" : "=m" (toc)); + __asm__ volatile ("std 30, %0" : "=m" (r30)); + __asm__ ("mr %0, 1" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + : /* no outputs */ + : "r" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("ld 30, %0" : : "m" (r30)); + __asm__ volatile ("ld 2, %0" : : "m" (toc)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h new file mode 100644 index 00000000..3c324d00 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc64_linux.h @@ -0,0 +1,105 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 04-Sep-18 Alexey Borzenkov + * Workaround a gcc bug using manual save/restore of r30 + * 21-Mar-18 Tulio Magno Quites Machado Filho + * Added r30 to the list of saved registers in order to fully comply with + * both ppc64 ELFv1 ABI and the ppc64le ELFv2 ABI, that classify this + * register as a nonvolatile register used for local variables. + * 21-Mar-18 Laszlo Boszormenyi + * Save r2 (TOC pointer) manually. + * 10-Dec-13 Ulrich Weigand + * Support ELFv2 ABI. Save float/vector registers. + * 09-Mar-12 Michael Ellerman + * 64-bit implementation, copied from 32-bit. + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + * 31-Jul-12 Trevor Bowen + * Changed memory constraints to register only. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#if _CALL_ELF == 2 +#define STACK_MAGIC 4 +#else +#define STACK_MAGIC 6 +#endif + +#if defined(__ALTIVEC__) +#define ALTIVEC_REGS \ + "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", \ + "v28", "v29", "v30", "v31", +#else +#define ALTIVEC_REGS +#endif + +#define REGS_TO_SAVE "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "r31", \ + "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", \ + "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", \ + "fr30", "fr31", \ + ALTIVEC_REGS \ + "cr2", "cr3", "cr4" + +static int +slp_switch(void) +{ + int err; + long *stackref, stsizediff; + void * toc; + void * r30; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("std 2, %0" : "=m" (toc)); + __asm__ volatile ("std 30, %0" : "=m" (r30)); + __asm__ ("mr %0, 1" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + : /* no outputs */ + : "r" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("ld 30, %0" : : "m" (r30)); + __asm__ volatile ("ld 2, %0" : : "m" (toc)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_aix.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_aix.h new file mode 100644 index 00000000..6d93c132 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_aix.h @@ -0,0 +1,87 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 07-Mar-11 Floris Bruynooghe + * Do not add stsizediff to general purpose + * register (GPR) 30 as this is a non-volatile and + * unused by the PowerOpen Environment, therefore + * this was modifying a user register instead of the + * frame pointer (which does not seem to exist). + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 3 + +/* !!!!WARNING!!!! need to add "r31" in the next line if this header file + * is meant to be compiled non-dynamically! + */ +#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "cr2", "cr3", "cr4" +static int +slp_switch(void) +{ + int err; + int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("mr %0, 1" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + : /* no outputs */ + : "r" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_linux.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_linux.h new file mode 100644 index 00000000..e83ad70a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_linux.h @@ -0,0 +1,84 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + * 31-Jul-12 Trevor Bowen + * Changed memory constraints to register only. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 3 + +/* !!!!WARNING!!!! need to add "r31" in the next line if this header file + * is meant to be compiled non-dynamically! + */ +#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "cr2", "cr3", "cr4" +static int +slp_switch(void) +{ + int err; + int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("mr %0, 1" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + "add 30, 30, 11\n" + : /* no outputs */ + : "r" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h new file mode 100644 index 00000000..d6e5a03c --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_macosx.h @@ -0,0 +1,82 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 3 + +/* !!!!WARNING!!!! need to add "r31" in the next line if this header file + * is meant to be compiled non-dynamically! + */ +#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "cr2", "cr3", "cr4" + +static int +slp_switch(void) +{ + int err; + int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("; asm block 2\n\tmr %0, r1" : "=g" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "; asm block 3\n" + "\tmr r11, %0\n" + "\tadd r1, r1, r11\n" + "\tadd r30, r30, r11\n" + : /* no outputs */ + : "g" (stsizediff) + : "r11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_unix.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_unix.h new file mode 100644 index 00000000..ca590a59 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_ppc_unix.h @@ -0,0 +1,82 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'r31' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 14-Jan-04 Bob Ippolito + * added cr2-cr4 to the registers to be saved. + * Open questions: Should we save FP registers? + * What about vector registers? + * Differences between darwin and unix? + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 04-Oct-02 Gustavo Niemeyer + * Ported from MacOS version. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 29-Jun-02 Christian Tismer + * Added register 13-29, 31 saves. The same way as + * Armin Rigo did for the x86_unix version. + * This seems to be now fully functional! + * 04-Mar-02 Hye-Shik Chang + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 3 + +/* !!!!WARNING!!!! need to add "r31" in the next line if this header file + * is meant to be compiled non-dynamically! + */ +#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ + "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ + "cr2", "cr3", "cr4" +static int +slp_switch(void) +{ + int err; + int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ ("mr %0, 1" : "=g" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "mr 11, %0\n" + "add 1, 1, 11\n" + "add 30, 30, 11\n" + : /* no outputs */ + : "g" (stsizediff) + : "11" + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("li %0, 0" : "=r" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_riscv_unix.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_riscv_unix.h new file mode 100644 index 00000000..24df9dbb --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_riscv_unix.h @@ -0,0 +1,32 @@ +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "s0", "s1", "s2", "s3", "s4", "s5", \ + "s6", "s7", "s8", "s9", "s10", "s11", "fs0", "fs1", \ + "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", \ + "fs10", "fs11" + +static int +slp_switch(void) +{ + int ret; + long *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("mv %0, sp" : "=r" (stackref) : ); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "add sp, sp, %0\n\t" + : /* no outputs */ + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("mv %0, zero" : "=r" (ret) : ); + return ret; +} + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_s390_unix.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_s390_unix.h new file mode 100644 index 00000000..9199367f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_s390_unix.h @@ -0,0 +1,87 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 25-Jan-12 Alexey Borzenkov + * Fixed Linux/S390 port to work correctly with + * different optimization options both on 31-bit + * and 64-bit. Thanks to Stefan Raabe for lots + * of testing. + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 06-Oct-02 Gustavo Niemeyer + * Ported to Linux/S390. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#ifdef __s390x__ +#define STACK_MAGIC 20 /* 20 * 8 = 160 bytes of function call area */ +#else +#define STACK_MAGIC 24 /* 24 * 4 = 96 bytes of function call area */ +#endif + +/* Technically, r11-r13 also need saving, but function prolog starts + with stm(g) and since there are so many saved registers already + it won't be optimized, resulting in all r6-r15 being saved */ +#define REGS_TO_SAVE "r6", "r7", "r8", "r9", "r10", "r14", \ + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15" + +static int +slp_switch(void) +{ + int ret; + long *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); +#ifdef __s390x__ + __asm__ volatile ("lgr %0, 15" : "=r" (stackref) : ); +#else + __asm__ volatile ("lr %0, 15" : "=r" (stackref) : ); +#endif + { + SLP_SAVE_STATE(stackref, stsizediff); +/* N.B. + r11 may be used as the frame pointer, and in that case it cannot be + clobbered and needs offsetting just like the stack pointer (but in cases + where frame pointer isn't used we might clobber it accidentally). What's + scary is that r11 is 2nd (and even 1st when GOT is used) callee saved + register that gcc would chose for surviving function calls. However, + since r6-r10 are clobbered above, their cost for reuse is reduced, so + gcc IRA will chose them over r11 (not seeing r11 is implicitly saved), + making it relatively safe to offset in all cases. :) */ + __asm__ volatile ( +#ifdef __s390x__ + "agr 15, %0\n\t" + "agr 11, %0" +#else + "ar 15, %0\n\t" + "ar 11, %0" +#endif + : /* no outputs */ + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("lhi %0, 0" : "=r" (ret) : ); + return ret; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h new file mode 100644 index 00000000..96990c39 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_sparc_sun_gcc.h @@ -0,0 +1,92 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 16-May-15 Alexey Borzenkov + * Move stack spilling code inside save/restore functions + * 30-Aug-13 Floris Bruynooghe + Clean the register windows again before returning. + This does not clobber the PIC register as it leaves + the current window intact and is required for multi- + threaded code to work correctly. + * 08-Mar-11 Floris Bruynooghe + * No need to set return value register explicitly + * before the stack and framepointer are adjusted + * as none of the other registers are influenced by + * this. Also don't needlessly clean the windows + * ('ta %0" :: "i" (ST_CLEAN_WINDOWS)') as that + * clobbers the gcc PIC register (%l7). + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * added support for SunOS sparc with gcc + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + + +#define STACK_MAGIC 0 + + +#if defined(__sparcv9) +#define SLP_FLUSHW __asm__ volatile ("flushw") +#else +#define SLP_FLUSHW __asm__ volatile ("ta 3") /* ST_FLUSH_WINDOWS */ +#endif + +/* On sparc we need to spill register windows inside save/restore functions */ +#define SLP_BEFORE_SAVE_STATE() SLP_FLUSHW +#define SLP_BEFORE_RESTORE_STATE() SLP_FLUSHW + + +static int +slp_switch(void) +{ + int err; + int *stackref, stsizediff; + + /* Put current stack pointer into stackref. + * Register spilling is done in save/restore. + */ + __asm__ volatile ("mov %%sp, %0" : "=r" (stackref)); + + { + /* Thou shalt put SLP_SAVE_STATE into a local block */ + /* Copy the current stack onto the heap */ + SLP_SAVE_STATE(stackref, stsizediff); + + /* Increment stack and frame pointer by stsizediff */ + __asm__ volatile ( + "add %0, %%sp, %%sp\n\t" + "add %0, %%fp, %%fp" + : : "r" (stsizediff)); + + /* Copy new stack from it's save store on the heap */ + SLP_RESTORE_STATE(); + + __asm__ volatile ("mov %1, %0" : "=r" (err) : "i" (0)); + return err; + } +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x32_unix.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x32_unix.h new file mode 100644 index 00000000..893369c7 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x32_unix.h @@ -0,0 +1,63 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 17-Aug-12 Fantix King + * Ported from amd64. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 + +#define REGS_TO_SAVE "r12", "r13", "r14", "r15" + + +static int +slp_switch(void) +{ + void* ebp; + void* ebx; + unsigned int csr; + unsigned short cw; + int err; + int *stackref, stsizediff; + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("fstcw %0" : "=m" (cw)); + __asm__ volatile ("stmxcsr %0" : "=m" (csr)); + __asm__ volatile ("movl %%ebp, %0" : "=m" (ebp)); + __asm__ volatile ("movl %%ebx, %0" : "=m" (ebx)); + __asm__ ("movl %%esp, %0" : "=g" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "addl %0, %%esp\n" + "addl %0, %%ebp\n" + : + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + } + __asm__ volatile ("movl %0, %%ebx" : : "m" (ebx)); + __asm__ volatile ("movl %0, %%ebp" : : "m" (ebp)); + __asm__ volatile ("ldmxcsr %0" : : "m" (csr)); + __asm__ volatile ("fldcw %0" : : "m" (cw)); + __asm__ volatile ("" : : : REGS_TO_SAVE); + __asm__ volatile ("xorl %%eax, %%eax" : "=a" (err)); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_masm.asm b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_masm.asm new file mode 100644 index 00000000..f5c72a27 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_masm.asm @@ -0,0 +1,111 @@ +; +; stack switching code for MASM on x641 +; Kristjan Valur Jonsson, sept 2005 +; + + +;prototypes for our calls +slp_save_state_asm PROTO +slp_restore_state_asm PROTO + + +pushxmm MACRO reg + sub rsp, 16 + .allocstack 16 + movaps [rsp], reg ; faster than movups, but we must be aligned + ; .savexmm128 reg, offset (don't know what offset is, no documentation) +ENDM +popxmm MACRO reg + movaps reg, [rsp] ; faster than movups, but we must be aligned + add rsp, 16 +ENDM + +pushreg MACRO reg + push reg + .pushreg reg +ENDM +popreg MACRO reg + pop reg +ENDM + + +.code +slp_switch PROC FRAME + ;realign stack to 16 bytes after return address push, makes the following faster + sub rsp,8 + .allocstack 8 + + pushxmm xmm15 + pushxmm xmm14 + pushxmm xmm13 + pushxmm xmm12 + pushxmm xmm11 + pushxmm xmm10 + pushxmm xmm9 + pushxmm xmm8 + pushxmm xmm7 + pushxmm xmm6 + + pushreg r15 + pushreg r14 + pushreg r13 + pushreg r12 + + pushreg rbp + pushreg rbx + pushreg rdi + pushreg rsi + + sub rsp, 10h ;allocate the singlefunction argument (must be multiple of 16) + .allocstack 10h +.endprolog + + lea rcx, [rsp+10h] ;load stack base that we are saving + call slp_save_state_asm ;pass stackpointer, return offset in eax + cmp rax, 1 + je EXIT1 + cmp rax, -1 + je EXIT2 + ;actual stack switch: + add rsp, rax + call slp_restore_state_asm + xor rax, rax ;return 0 + +EXIT: + + add rsp, 10h + popreg rsi + popreg rdi + popreg rbx + popreg rbp + + popreg r12 + popreg r13 + popreg r14 + popreg r15 + + popxmm xmm6 + popxmm xmm7 + popxmm xmm8 + popxmm xmm9 + popxmm xmm10 + popxmm xmm11 + popxmm xmm12 + popxmm xmm13 + popxmm xmm14 + popxmm xmm15 + + add rsp, 8 + ret + +EXIT1: + mov rax, 1 + jmp EXIT + +EXIT2: + sar rax, 1 + jmp EXIT + +slp_switch ENDP + +END \ No newline at end of file diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_masm.obj b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_masm.obj new file mode 100644 index 0000000000000000000000000000000000000000..64e3e6b898ec765d4e37075f7b1635ad24c9efa2 GIT binary patch literal 1078 zcmZ{j&ubG=5XWb`DJB@*%~BA=L%=;Gk}d_~52VO$4J4q2U~MY6&1RFl{E&?scGnt@ zn(9GNy!ihFEO@PV4?T&H9`x2*oO!!jlNJZwd!P4xlX&_;U$Bg3z>p zje>}2kp+MsxE|w5hOUr>YC~(=fz6fwPdZd5+Hlb^P3{;ZO@Yuv96GG&+Gx?QfclNd zhy2KN&~>fNnlHQRR;U1cMyQ?hlQ$~k<0KBbB<0uD2#PTjVo+na7Q;#m=@=3m;xJOa zs2V#)&Db`cY;WzTF9)11;SjkVQWE!?bPTC%x3h3^F2;aBns5!i%m4&-*h69;~AUpZR%rDpm!zuXY+kc zFCz-n*^4&c)5~}y3e?r-Evy*n*(lp9r%ti58Y#l5&)rDjx5EbRd}nC+_8znRzz&#& XZ_Fi+`GM=5Rl{n4%KxAK>jC@)Nz=zi literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_msvc.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_msvc.h new file mode 100644 index 00000000..601ea560 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x64_msvc.h @@ -0,0 +1,60 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 26-Sep-02 Christian Tismer + * again as a result of virtualized stack access, + * the compiler used less registers. Needed to + * explicit mention registers in order to get them saved. + * Thanks to Jeff Senn for pointing this out and help. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 01-Mar-02 Christian Tismer + * Initial final version after lots of iterations for i386. + */ + +/* Avoid alloca redefined warning on mingw64 */ +#ifndef alloca +#define alloca _alloca +#endif + +#define STACK_REFPLUS 1 +#define STACK_MAGIC 0 + +/* Use the generic support for an external assembly language slp_switch function. */ +#define EXTERNAL_ASM + +#ifdef SLP_EVAL +/* This always uses the external masm assembly file. */ +#endif + +/* + * further self-processing support + */ + +/* we have IsBadReadPtr available, so we can peek at objects */ +/* +#define STACKLESS_SPY + +#ifdef IMPLEMENT_STACKLESSMODULE +#include "Windows.h" +#define CANNOT_READ_MEM(p, bytes) IsBadReadPtr(p, bytes) + +static int IS_ON_STACK(void*p) +{ + int stackref; + intptr_t stackbase = ((intptr_t)&stackref) & 0xfffff000; + return (intptr_t)p >= stackbase && (intptr_t)p < stackbase + 0x00100000; +} + +#endif +*/ \ No newline at end of file diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x86_msvc.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x86_msvc.h new file mode 100644 index 00000000..0f3a59f5 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x86_msvc.h @@ -0,0 +1,326 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 26-Sep-02 Christian Tismer + * again as a result of virtualized stack access, + * the compiler used less registers. Needed to + * explicit mention registers in order to get them saved. + * Thanks to Jeff Senn for pointing this out and help. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for sparc + * 01-Mar-02 Christian Tismer + * Initial final version after lots of iterations for i386. + */ + +#define alloca _alloca + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +#define STACK_MAGIC 0 + +/* Some magic to quell warnings and keep slp_switch() from crashing when built + with VC90. Disable global optimizations, and the warning: frame pointer + register 'ebp' modified by inline assembly code. + + We used to just disable global optimizations ("g") but upstream stackless + Python, as well as stackman, turn off all optimizations. + +References: +https://github.com/stackless-dev/stackman/blob/dbc72fe5207a2055e658c819fdeab9731dee78b9/stackman/platforms/switch_x86_msvc.h +https://github.com/stackless-dev/stackless/blob/main-slp/Stackless/platf/switch_x86_msvc.h +*/ +#define WIN32_LEAN_AND_MEAN +#include + +#pragma optimize("", off) /* so that autos are stored on the stack */ +#pragma warning(disable:4731) +#pragma warning(disable:4733) /* disable warning about modifying FS[0] */ + +/** + * Most modern compilers and environments handle C++ exceptions without any + * special help from us. MSVC on 32-bit windows is an exception. There, C++ + * exceptions are dealt with using Windows' Structured Exception Handling + * (SEH). + * + * SEH is implemented as a singly linked list of nodes. The + * head of this list is stored in the Thread Information Block, which itself + * is pointed to from the FS register. It's the first field in the structure, + * or offset 0, so we can access it using assembly FS:[0], or the compiler + * intrinsics and field offset information from the headers (as we do below). + * Somewhat unusually, the tail of the list doesn't have prev == NULL, it has + * prev == 0xFFFFFFFF. + * + * SEH was designed for C, and traditionally uses the MSVC compiler + * intrinsincs __try{}/__except{}. It is also utilized for C++ exceptions by + * MSVC; there, every throw of a C++ exception raises a SEH error with the + * ExceptionCode 0xE06D7363; the SEH handler list is then traversed to + * deal with the exception. + * + * If the SEH list is corrupt, then when a C++ exception is thrown the program + * will abruptly exit with exit code 1. This does not use std::terminate(), so + * std::set_terminate() is useless to debug this. + * + * The SEH list is closely tied to the call stack; entering a function that + * uses __try{} or most C++ functions will push a new handler onto the front + * of the list. Returning from the function will remove the handler. Saving + * and restoring the head node of the SEH list (FS:[0]) per-greenlet is NOT + * ENOUGH to make SEH or exceptions work. + * + * Stack switching breaks SEH because the call stack no longer necessarily + * matches the SEH list. For example, given greenlet A that switches to + * greenlet B, at the moment of entering greenlet B, we will have any SEH + * handlers from greenlet A on the SEH list; greenlet B can then add its own + * handlers to the SEH list. When greenlet B switches back to greenlet A, + * greenlet B's handlers would still be on the SEH stack, but when switch() + * returns control to greenlet A, we have replaced the contents of the stack + * in memory, so all the address that greenlet B added to the SEH list are now + * invalid: part of the call stack has been unwound, but the SEH list was out + * of sync with the call stack. The net effect is that exception handling + * stops working. + * + * Thus, when switching greenlets, we need to be sure that the SEH list + * matches the effective call stack, "cutting out" any handlers that were + * pushed by the greenlet that switched out and which are no longer valid. + * + * The easiest way to do this is to capture the SEH list at the time the main + * greenlet for a thread is created, and, when initially starting a greenlet, + * start a new SEH list for it, which contains nothing but the handler + * established for the new greenlet itself, with the tail being the handlers + * for the main greenlet. If we then save and restore the SEH per-greenlet, + * they won't interfere with each others SEH lists. (No greenlet can unwind + * the call stack past the handlers established by the main greenlet). + * + * By observation, a new thread starts with three SEH handlers on the list. By + * the time we get around to creating the main greenlet, though, there can be + * many more, established by transient calls that lead to the creation of the + * main greenlet. Therefore, 3 is a magic constant telling us when to perform + * the initial slice. + * + * All of this can be debugged using a vectored exception handler, which + * operates independently of the SEH handler list, and is called first. + * Walking the SEH list at key points can also be helpful. + * + * References: + * https://en.wikipedia.org/wiki/Win32_Thread_Information_Block + * https://devblogs.microsoft.com/oldnewthing/20100730-00/?p=13273 + * https://docs.microsoft.com/en-us/cpp/cpp/try-except-statement?view=msvc-160 + * https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-160 + * https://docs.microsoft.com/en-us/windows/win32/debug/structured-exception-handling + * https://docs.microsoft.com/en-us/windows/win32/debug/using-a-vectored-exception-handler + * https://bytepointer.com/resources/pietrek_crash_course_depths_of_win32_seh.htm + */ +#define GREENLET_NEEDS_EXCEPTION_STATE_SAVED + + +typedef struct _GExceptionRegistration { + struct _GExceptionRegistration* prev; + void* handler_f; +} GExceptionRegistration; + +static void +slp_set_exception_state(const void *const seh_state) +{ + // Because the stack from from which we do this is ALSO a handler, and + // that one we want to keep, we need to relink the current SEH handler + // frame to point to this one, cutting out the middle men, as it were. + // + // Entering a try block doesn't change the SEH frame, but entering a + // function containing a try block does. + GExceptionRegistration* current_seh_state = (GExceptionRegistration*)__readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); + current_seh_state->prev = (GExceptionRegistration*)seh_state; +} + + +static GExceptionRegistration* +x86_slp_get_third_oldest_handler() +{ + GExceptionRegistration* a = NULL; /* Closest to the top */ + GExceptionRegistration* b = NULL; /* second */ + GExceptionRegistration* c = NULL; + GExceptionRegistration* seh_state = (GExceptionRegistration*)__readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); + a = b = c = seh_state; + + while (seh_state && seh_state != (GExceptionRegistration*)0xFFFFFFFF) { + if ((void*)seh_state->prev < (void*)100) { + fprintf(stderr, "\tERROR: Broken SEH chain.\n"); + return NULL; + } + a = b; + b = c; + c = seh_state; + + seh_state = seh_state->prev; + } + return a ? a : (b ? b : c); +} + + +static void* +slp_get_exception_state() +{ + // XXX: There appear to be three SEH handlers on the stack already at the + // start of the thread. Is that a guarantee? Almost certainly not. Yet in + // all observed cases it has been three. This is consistent with + // faulthandler off or on, and optimizations off or on. It may not be + // consistent with other operating system versions, though: we only have + // CI on one or two versions (don't ask what there are). + // In theory we could capture the number of handlers on the chain when + // PyInit__greenlet is called: there are probably only the default + // handlers at that point (unless we're embedded and people have used + // __try/__except or a C++ handler)? + return x86_slp_get_third_oldest_handler(); +} + +static int +slp_switch(void) +{ + /* MASM syntax is typically reversed from other assemblers. + It is usually + */ + int *stackref, stsizediff; + /* store the structured exception state for this stack */ + DWORD seh_state = __readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); + __asm mov stackref, esp; + /* modify EBX, ESI and EDI in order to get them preserved */ + __asm mov ebx, ebx; + __asm xchg esi, edi; + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm { + mov eax, stsizediff + add esp, eax + add ebp, eax + } + SLP_RESTORE_STATE(); + } + __writefsdword(FIELD_OFFSET(NT_TIB, ExceptionList), seh_state); + return 0; +} + +/* re-enable ebp warning and global optimizations. */ +#pragma optimize("", on) +#pragma warning(default:4731) +#pragma warning(default:4733) /* disable warning about modifying FS[0] */ + + +#endif + +/* + * further self-processing support + */ + +/* we have IsBadReadPtr available, so we can peek at objects */ +#define STACKLESS_SPY + +#ifdef GREENLET_DEBUG + +#define CANNOT_READ_MEM(p, bytes) IsBadReadPtr(p, bytes) + +static int IS_ON_STACK(void*p) +{ + int stackref; + int stackbase = ((int)&stackref) & 0xfffff000; + return (int)p >= stackbase && (int)p < stackbase + 0x00100000; +} + +static void +x86_slp_show_seh_chain() +{ + GExceptionRegistration* seh_state = (GExceptionRegistration*)__readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); + fprintf(stderr, "====== SEH Chain ======\n"); + while (seh_state && seh_state != (GExceptionRegistration*)0xFFFFFFFF) { + fprintf(stderr, "\tSEH_chain addr: %p handler: %p prev: %p\n", + seh_state, + seh_state->handler_f, seh_state->prev); + if ((void*)seh_state->prev < (void*)100) { + fprintf(stderr, "\tERROR: Broken chain.\n"); + break; + } + seh_state = seh_state->prev; + } + fprintf(stderr, "====== End SEH Chain ======\n"); + fflush(NULL); + return; +} + +//addVectoredExceptionHandler constants: +//CALL_FIRST means call this exception handler first; +//CALL_LAST means call this exception handler last +#define CALL_FIRST 1 +#define CALL_LAST 0 + +LONG WINAPI +GreenletVectorHandler(PEXCEPTION_POINTERS ExceptionInfo) +{ + // We get one of these for every C++ exception, with code + // E06D7363 + // This is a special value that means "C++ exception from MSVC" + // https://devblogs.microsoft.com/oldnewthing/20100730-00/?p=13273 + // + // Install in the module init function with: + // AddVectoredExceptionHandler(CALL_FIRST, GreenletVectorHandler); + PEXCEPTION_RECORD ExceptionRecord = ExceptionInfo->ExceptionRecord; + + fprintf(stderr, + "GOT VECTORED EXCEPTION:\n" + "\tExceptionCode : %p\n" + "\tExceptionFlags : %p\n" + "\tExceptionAddr : %p\n" + "\tNumberparams : %ld\n", + ExceptionRecord->ExceptionCode, + ExceptionRecord->ExceptionFlags, + ExceptionRecord->ExceptionAddress, + ExceptionRecord->NumberParameters + ); + if (ExceptionRecord->ExceptionFlags & 1) { + fprintf(stderr, "\t\tEH_NONCONTINUABLE\n" ); + } + if (ExceptionRecord->ExceptionFlags & 2) { + fprintf(stderr, "\t\tEH_UNWINDING\n" ); + } + if (ExceptionRecord->ExceptionFlags & 4) { + fprintf(stderr, "\t\tEH_EXIT_UNWIND\n" ); + } + if (ExceptionRecord->ExceptionFlags & 8) { + fprintf(stderr, "\t\tEH_STACK_INVALID\n" ); + } + if (ExceptionRecord->ExceptionFlags & 0x10) { + fprintf(stderr, "\t\tEH_NESTED_CALL\n" ); + } + if (ExceptionRecord->ExceptionFlags & 0x20) { + fprintf(stderr, "\t\tEH_TARGET_UNWIND\n" ); + } + if (ExceptionRecord->ExceptionFlags & 0x40) { + fprintf(stderr, "\t\tEH_COLLIDED_UNWIND\n" ); + } + fprintf(stderr, "\n"); + fflush(NULL); + for(DWORD i = 0; i < ExceptionRecord->NumberParameters; i++) { + fprintf(stderr, "\t\t\tParam %ld: %lX\n", i, ExceptionRecord->ExceptionInformation[i]); + } + + if (ExceptionRecord->NumberParameters == 3) { + fprintf(stderr, "\tAbout to traverse SEH chain\n"); + // C++ Exception records have 3 params. + x86_slp_show_seh_chain(); + } + + return EXCEPTION_CONTINUE_SEARCH; +} + + + + +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x86_unix.h b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x86_unix.h new file mode 100644 index 00000000..493fa6ba --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/platform/switch_x86_unix.h @@ -0,0 +1,105 @@ +/* + * this is the internal transfer function. + * + * HISTORY + * 3-May-13 Ralf Schmitt + * Add support for strange GCC caller-save decisions + * (ported from switch_aarch64_gcc.h) + * 19-Aug-11 Alexey Borzenkov + * Correctly save ebp, ebx and cw + * 07-Sep-05 (py-dev mailing list discussion) + * removed 'ebx' from the register-saved. !!!! WARNING !!!! + * It means that this file can no longer be compiled statically! + * It is now only suitable as part of a dynamic library! + * 24-Nov-02 Christian Tismer + * needed to add another magic constant to insure + * that f in slp_eval_frame(PyFrameObject *f) + * STACK_REFPLUS will probably be 1 in most cases. + * gets included into the saved stack area. + * 17-Sep-02 Christian Tismer + * after virtualizing stack save/restore, the + * stack size shrunk a bit. Needed to introduce + * an adjustment STACK_MAGIC per platform. + * 15-Sep-02 Gerd Woetzel + * slightly changed framework for spark + * 31-Avr-02 Armin Rigo + * Added ebx, esi and edi register-saves. + * 01-Mar-02 Samual M. Rushing + * Ported from i386. + */ + +#define STACK_REFPLUS 1 + +#ifdef SLP_EVAL + +/* #define STACK_MAGIC 3 */ +/* the above works fine with gcc 2.96, but 2.95.3 wants this */ +#define STACK_MAGIC 0 + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +# define ATTR_NOCLONE __attribute__((noclone)) +#else +# define ATTR_NOCLONE +#endif + +static int +slp_switch(void) +{ + int err; +#ifdef _WIN32 + void *seh; +#endif + void *ebp, *ebx; + unsigned short cw; + int *stackref, stsizediff; + __asm__ volatile ("" : : : "esi", "edi"); + __asm__ volatile ("fstcw %0" : "=m" (cw)); + __asm__ volatile ("movl %%ebp, %0" : "=m" (ebp)); + __asm__ volatile ("movl %%ebx, %0" : "=m" (ebx)); +#ifdef _WIN32 + __asm__ volatile ( + "movl %%fs:0x0, %%eax\n" + "movl %%eax, %0\n" + : "=m" (seh) + : + : "eax"); +#endif + __asm__ ("movl %%esp, %0" : "=g" (stackref)); + { + SLP_SAVE_STATE(stackref, stsizediff); + __asm__ volatile ( + "addl %0, %%esp\n" + "addl %0, %%ebp\n" + : + : "r" (stsizediff) + ); + SLP_RESTORE_STATE(); + __asm__ volatile ("xorl %%eax, %%eax" : "=a" (err)); + } +#ifdef _WIN32 + __asm__ volatile ( + "movl %0, %%eax\n" + "movl %%eax, %%fs:0x0\n" + : + : "m" (seh) + : "eax"); +#endif + __asm__ volatile ("movl %0, %%ebx" : : "m" (ebx)); + __asm__ volatile ("movl %0, %%ebp" : : "m" (ebp)); + __asm__ volatile ("fldcw %0" : : "m" (cw)); + __asm__ volatile ("" : : : "esi", "edi"); + return err; +} + +#endif + +/* + * further self-processing support + */ + +/* + * if you want to add self-inspection tools, place them + * here. See the x86_msvc for the necessary defines. + * These features are highly experimental und not + * essential yet. + */ diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/slp_platformselect.h b/Meliora/gmapenv/Lib/site-packages/greenlet/slp_platformselect.h new file mode 100644 index 00000000..c959f0f8 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/slp_platformselect.h @@ -0,0 +1,71 @@ +/* + * Platform Selection for Stackless Python + */ +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MS_WIN32) && !defined(MS_WIN64) && defined(_M_IX86) && defined(_MSC_VER) +# include "platform/switch_x86_msvc.h" /* MS Visual Studio on X86 */ +#elif defined(MS_WIN64) && defined(_M_X64) && defined(_MSC_VER) || defined(__MINGW64__) +# include "platform/switch_x64_msvc.h" /* MS Visual Studio on X64 */ +#elif defined(MS_WIN64) && defined(_M_ARM64) +# include "platform/switch_arm64_msvc.h" /* MS Visual Studio on ARM64 */ +#elif defined(__GNUC__) && defined(__amd64__) && defined(__ILP32__) +# include "platform/switch_x32_unix.h" /* gcc on amd64 with x32 ABI */ +#elif defined(__GNUC__) && defined(__amd64__) +# include "platform/switch_amd64_unix.h" /* gcc on amd64 */ +#elif defined(__GNUC__) && defined(__i386__) +# include "platform/switch_x86_unix.h" /* gcc on X86 */ +#elif defined(__GNUC__) && defined(__powerpc64__) && (defined(__linux__) || defined(__FreeBSD__)) +# include "platform/switch_ppc64_linux.h" /* gcc on PowerPC 64-bit */ +#elif defined(__GNUC__) && defined(__PPC__) && (defined(__linux__) || defined(__FreeBSD__)) +# include "platform/switch_ppc_linux.h" /* gcc on PowerPC */ +#elif defined(__GNUC__) && defined(__ppc__) && defined(__APPLE__) +# include "platform/switch_ppc_macosx.h" /* Apple MacOS X on PowerPC */ +#elif defined(__GNUC__) && defined(__powerpc64__) && defined(_AIX) +# include "platform/switch_ppc64_aix.h" /* gcc on AIX/PowerPC 64-bit */ +#elif defined(__GNUC__) && defined(_ARCH_PPC) && defined(_AIX) +# include "platform/switch_ppc_aix.h" /* gcc on AIX/PowerPC */ +#elif defined(__GNUC__) && defined(sparc) +# include "platform/switch_sparc_sun_gcc.h" /* SunOS sparc with gcc */ +#elif defined(__SUNPRO_C) && defined(sparc) && defined(sun) +# iiclude "platform/switch_sparc_sun_gcc.h" /* SunStudio on amd64 */ +#elif defined(__SUNPRO_C) && defined(__amd64__) && defined(sun) +# include "platform/switch_amd64_unix.h" /* SunStudio on amd64 */ +#elif defined(__SUNPRO_C) && defined(__i386__) && defined(sun) +# include "platform/switch_x86_unix.h" /* SunStudio on x86 */ +#elif defined(__GNUC__) && defined(__s390__) && defined(__linux__) +# include "platform/switch_s390_unix.h" /* Linux/S390 */ +#elif defined(__GNUC__) && defined(__s390x__) && defined(__linux__) +# include "platform/switch_s390_unix.h" /* Linux/S390 zSeries (64-bit) */ +#elif defined(__GNUC__) && defined(__arm__) +# ifdef __APPLE__ +# include +# endif +# if TARGET_OS_IPHONE +# include "platform/switch_arm32_ios.h" /* iPhone OS on arm32 */ +# else +# include "platform/switch_arm32_gcc.h" /* gcc using arm32 */ +# endif +#elif defined(__GNUC__) && defined(__mips__) && defined(__linux__) +# include "platform/switch_mips_unix.h" /* Linux/MIPS */ +#elif defined(__GNUC__) && defined(__aarch64__) +# include "platform/switch_aarch64_gcc.h" /* Aarch64 ABI */ +#elif defined(__GNUC__) && defined(__mc68000__) +# include "platform/switch_m68k_gcc.h" /* gcc on m68k */ +#elif defined(__GNUC__) && defined(__csky__) +#include "platform/switch_csky_gcc.h" /* gcc on csky */ +# elif defined(__GNUC__) && defined(__riscv) +# include "platform/switch_riscv_unix.h" /* gcc on RISC-V */ +#elif defined(__GNUC__) && defined(__alpha__) +# include "platform/switch_alpha_unix.h" /* gcc on DEC Alpha */ +#elif defined(MS_WIN32) && defined(__llvm__) && defined(__aarch64__) +# include "platform/switch_aarch64_gcc.h" /* LLVM Aarch64 ABI for Windows */ +#elif defined(__GNUC__) && defined(__loongarch64) && defined(__linux__) +# include "platform/switch_loongarch64_linux.h" /* LoongArch64 */ +#endif + +#ifdef __cplusplus +}; +#endif diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__init__.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__init__.py new file mode 100644 index 00000000..173b11f4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__init__.py @@ -0,0 +1,218 @@ +# -*- coding: utf-8 -*- +""" +Tests for greenlet. + +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import sys +import unittest + +from gc import collect +from gc import get_objects +from threading import active_count as active_thread_count +from time import sleep +from time import time + +from greenlet import greenlet as RawGreenlet +from greenlet import getcurrent + +from greenlet._greenlet import get_pending_cleanup_count +from greenlet._greenlet import get_total_main_greenlets + +from . import leakcheck + +PY312 = sys.version_info[:2] >= (3, 12) +WIN = sys.platform.startswith("win") + +class TestCaseMetaClass(type): + # wrap each test method with + # a) leak checks + def __new__(cls, classname, bases, classDict): + # pylint and pep8 fight over what this should be called (mcs or cls). + # pylint gets it right, but we can't scope disable pep8, so we go with + # its convention. + # pylint: disable=bad-mcs-classmethod-argument + check_totalrefcount = True + + # Python 3: must copy, we mutate the classDict. Interestingly enough, + # it doesn't actually error out, but under 3.6 we wind up wrapping + # and re-wrapping the same items over and over and over. + for key, value in list(classDict.items()): + if key.startswith('test') and callable(value): + classDict.pop(key) + if check_totalrefcount: + value = leakcheck.wrap_refcount(value) + classDict[key] = value + return type.__new__(cls, classname, bases, classDict) + + +class TestCase(TestCaseMetaClass( + "NewBase", + (unittest.TestCase,), + {})): + + cleanup_attempt_sleep_duration = 0.001 + cleanup_max_sleep_seconds = 1 + + def wait_for_pending_cleanups(self, + initial_active_threads=None, + initial_main_greenlets=None): + initial_active_threads = initial_active_threads or self.threads_before_test + initial_main_greenlets = initial_main_greenlets or self.main_greenlets_before_test + sleep_time = self.cleanup_attempt_sleep_duration + # NOTE: This is racy! A Python-level thread object may be dead + # and gone, but the C thread may not yet have fired its + # destructors and added to the queue. There's no particular + # way to know that's about to happen. We try to watch the + # Python threads to make sure they, at least, have gone away. + # Counting the main greenlets, which we can easily do deterministically, + # also helps. + + # Always sleep at least once to let other threads run + sleep(sleep_time) + quit_after = time() + self.cleanup_max_sleep_seconds + # TODO: We could add an API that calls us back when a particular main greenlet is deleted? + # It would have to drop the GIL + while ( + get_pending_cleanup_count() + or active_thread_count() > initial_active_threads + or (not self.expect_greenlet_leak + and get_total_main_greenlets() > initial_main_greenlets)): + sleep(sleep_time) + if time() > quit_after: + print("Time limit exceeded.") + print("Threads: Waiting for only", initial_active_threads, + "-->", active_thread_count()) + print("MGlets : Waiting for only", initial_main_greenlets, + "-->", get_total_main_greenlets()) + break + collect() + + def count_objects(self, kind=list, exact_kind=True): + # pylint:disable=unidiomatic-typecheck + # Collect the garbage. + for _ in range(3): + collect() + if exact_kind: + return sum( + 1 + for x in get_objects() + if type(x) is kind + ) + # instances + return sum( + 1 + for x in get_objects() + if isinstance(x, kind) + ) + + greenlets_before_test = 0 + threads_before_test = 0 + main_greenlets_before_test = 0 + expect_greenlet_leak = False + + def count_greenlets(self): + """ + Find all the greenlets and subclasses tracked by the GC. + """ + return self.count_objects(RawGreenlet, False) + + def setUp(self): + # Ensure the main greenlet exists, otherwise the first test + # gets a false positive leak + super().setUp() + getcurrent() + self.threads_before_test = active_thread_count() + self.main_greenlets_before_test = get_total_main_greenlets() + self.wait_for_pending_cleanups(self.threads_before_test, self.main_greenlets_before_test) + self.greenlets_before_test = self.count_greenlets() + + def tearDown(self): + if getattr(self, 'skipTearDown', False): + return + + self.wait_for_pending_cleanups(self.threads_before_test, self.main_greenlets_before_test) + super().tearDown() + + def get_expected_returncodes_for_aborted_process(self): + import signal + # The child should be aborted in an unusual way. On POSIX + # platforms, this is done with abort() and signal.SIGABRT, + # which is reflected in a negative return value; however, on + # Windows, even though we observe the child print "Fatal + # Python error: Aborted" and in older versions of the C + # runtime "This application has requested the Runtime to + # terminate it in an unusual way," it always has an exit code + # of 3. This is interesting because 3 is the error code for + # ERROR_PATH_NOT_FOUND; BUT: the C runtime abort() function + # also uses this code. + # + # If we link to the static C library on Windows, the error + # code changes to '0xc0000409' (hex(3221226505)), which + # apparently is STATUS_STACK_BUFFER_OVERRUN; but "What this + # means is that nowadays when you get a + # STATUS_STACK_BUFFER_OVERRUN, it doesn’t actually mean that + # there is a stack buffer overrun. It just means that the + # application decided to terminate itself with great haste." + # + # + # On windows, we've also seen '0xc0000005' (hex(3221225477)). + # That's "Access Violation" + # + # See + # https://devblogs.microsoft.com/oldnewthing/20110519-00/?p=10623 + # and + # https://docs.microsoft.com/en-us/previous-versions/k089yyh0(v=vs.140)?redirectedfrom=MSDN + # and + # https://devblogs.microsoft.com/oldnewthing/20190108-00/?p=100655 + expected_exit = ( + -signal.SIGABRT, + # But beginning on Python 3.11, the faulthandler + # that prints the C backtraces sometimes segfaults after + # reporting the exception but before printing the stack. + # This has only been seen on linux/gcc. + -signal.SIGSEGV, + ) if not WIN else ( + 3, + 0xc0000409, + 0xc0000005, + ) + return expected_exit + + def run_script(self, script_name, show_output=True): + import subprocess + import os + script = os.path.join( + os.path.dirname(__file__), + script_name, + ) + + try: + return subprocess.check_output([sys.executable, script], + encoding='utf-8', + stderr=subprocess.STDOUT) + except subprocess.CalledProcessError as ex: + if show_output: + print('-----') + print('Failed to run script', script) + print('~~~~~') + print(ex.output) + print('------') + raise + + + def assertScriptRaises(self, script_name, exitcodes=None): + import subprocess + with self.assertRaises(subprocess.CalledProcessError) as exc: + output = self.run_script(script_name, show_output=False) + __traceback_info__ = output + # We're going to fail the assertion if we get here, at least + # preserve the output in the traceback. + + if exitcodes is None: + exitcodes = self.get_expected_returncodes_for_aborted_process() + self.assertIn(exc.exception.returncode, exitcodes) + return exc.exception diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a0f011076b6d8de3cafb731dac977b9423fd50d GIT binary patch literal 4894 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 C2fR!G literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92dd9d04643e315488e04b3fce7db05c37e0937f GIT binary patch literal 1534 zcmbVMOK%%D5GMB_t=E$3Iz?aTf#@X>kUGZ#K~V&73pYSu6mfD{2%xFuNZNR{yCJ!8 zZRDmLdg*_VkNrz~D|+gw_nbOI*^Zj#R6;Z2@G+0?8?G7-Q-*Ni~ z66iy3#a0||2kRZYokG0c)jN>Rf-BA$40H;q-qnNOLbUuDzdD3?6>z456E+^Hgfo^t zo{4i13-t-m3RR`bIa5qq2loYP za;EF*F7D>8MOPQ1wSXR!6ZfW&E3!^crJRGiy(#7CX^KuMPFb9RC@KeL1_tc-KCM>b z+$&6@1ZCdkIE7hlKulp?R8>*UQ_L2N@RtnSr36LYG_`SURk#a*r^U|~Zc$^MwZ^>s z@q;w|3#nnpIqB^Ypz#RBeu4@ZQpU1?=tCMp9U_cTxBIlM4zEGW5z^a1^AP0_#eR;; zu{GD67;?cn)SfHN&`Eea4h+TW`ci5rrM%pmnR+RnRW&4rTOUgO>sJ)`ir3lWBK@OJ+Q3;cImn~%`R zI5yNx`W@W)0>#o1#uLOi;)cLLRLw5_ zn*pgIDLTC6fV#qX07p3c4CMwuvi}1hk?E13-FL0)8#bVZ{TSD?80f8{bz9>HBhp!c z;v+Kd?_Tav`#u!&gG~?J8($6{SArG=cJ$&Ic62-|Tf4~mPk%gl{^Z%oc<5h9olBV| zH?7(6d6pvZd20-2V|o~8lMWGTD19H#^l{elUp7p{jls{%hm!4*?=~IzJ>9ooqKf)S V5OI`X)ZgDpqBKtUC>$aF{{W5OX+Z!0 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_cpp_exception.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_cpp_exception.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd443db73de992604c980839ad585ad27fe2ecfe GIT binary patch literal 1172 zcma)5%Wl&^6rGtkiQ~4R5)uLdmDOE%q=1Bws;Vj~h%Qh!Ekan4rmp8Eaq5h%nMof} zyJ@>%!-^kh*zrkthgkI&*uWh(Q44gzM82Loo^v1P+=MeT9>I0*`wRG1BIJj4t}Yjy z6@2s;G=c;~P{9%!(BjPkhVN2R>N|l$36zC%LMahtQ8^_+1!%7-s&`1>4(m_@2iy}D zc<+f^aR^Kue5Azwz=cY0dWWetR02=Vfh%0}j)9#qaC$Q%8q}fQyMf=>G5J6wdtx)y zz!RRB`c%RQ-U-GLY=bnWho8MQNHS1F=ZD*= zG8!H5GnGc5b<^`U!yV9mD!~s`XV3>}9u+ra*atst7yI@=Mn#-h`iuQkEN*d|iNn4D zsWAbMvTVyYsUL+&()7-eJhI-P`ORzY4ez(ZII#%CPYR5+uLe?L?UBV!7Q+q7L{{<9 zb7-s#r{stjaz+lxh#t{HdPYZ<4uW))*8hMbpnz{!_$(TPQA2ucWL2{Oy51-$n%G`ST^>roMapBzJI{iViil$M<)3|cCqvX#3ji^6XTHlViuZ9Ns5x`)NMPBHl%7Z9lwIo5Y3ee! P=21rLxc6vfa)$nI<_SwZ literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7542a761c82b10591463813206e0eee53b5cec53 GIT binary patch literal 2033 zcmaJ>&2J+$6t_K|$#nA3Hd|N(Wf`pmD2MGzdqG;QpiNw zLuphlbg%pm>9PL`XHGsKAx@mRaRA<%N!#qUVv_f4zi0dTef(ZruLlIa?cYC>mlZ<( zz{Tq4!(tam*C-)^bcvvXjcFHnmjO9IT+)SmLAu_MbSuIU{59$N!WABjYX?MBg#Vfd zU(yjhce(*c)XA$1ch-H#$zR8aT;n9De<+6 z>&4Tl%tVV?9;>0gB+7;Jf1m6>?Y-1e>E7|Q_ho*Pjq_OO-oYfE>hSA0c@>-EJPVV2 zGVKjPD6{W-FVcQbr$#=SqJAiKZ>Xfq#?m}C;I4i=h|_Vj;&HU}GFp1MGd;C#9I07` zK4=DvFa^a$-tZR14$wZ3eh94e7V~7-0_v)mVFVnU72fk}@Av24bCpj*823YwXR^f= zT2gqWrG4w^lhh=~MI2U`hiW&$*WHJy#xU>C$VGol}0feUs< zB4YT$6^`*r?KvG)?vo-F{$lNdKypyeZ|j$L9}D+KYJx@e46I!sP`r+HAlyguPY;Wf zgeDLB;Q+JO-ie~2G_f%%?avGZ4xkjyKfXiWhiWVjO=8#sf9pkU%wwx&eUSs=qSRRb zs#t9R7bi2NWM(W)R*Hk0)2UQ-2#3P%rq+O2FYk|JV(iA-4}v^%Eyn}PF_$ZuERy&> zoDG3AP6%z#4eG(K_OHkM>yguW^R`C`me$pWnYxDlC$LyTpO(-sRwW=18g~JrJ%6tZ zM_3jccRsa7&Z@;4uk#}172oz7y0!G!R3fIsX zy=jcaFs~K`RMcNGuk3{aTJ#stRj(${PYOwWW#7(|x&Q4~hc90o9X@R}Z6%6CoE(-}8ih38>hse-+(e{eYQsBLCw0O_5>dO9IG%Y|gn6>UyrJ1?QFY7-m+so$| q8I2xt?lTS{gdlpH`L6FaS#zriwFe!I`?TTuY}>)^7J#h50`?#3jk)#! literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_slp_switch.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_slp_switch.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f94ad185eb9142e313e9cdcfb01a1b43baaf8c0e GIT binary patch literal 749 zcmZ`%!EVz)5Z$piwquft1L^^B@R1y7k4OkrMMW(_s2AwPvanq5#CGefSGyac_K3Lh z56O{V@(ppyFK}WuA!>xgN;B*Cc04n0c8l>iX0)FDe2F8Ev0o1CFHYc;%qVh#rA&bE zT1Wvs;R`MX-#uUzOMMZD@Ec1x!p&eAAYVZmVz`V}3>f+%s^Hc$=kM89*k{GC@`(TJ zc)>Buhr3hZePomP{xp7*STr`Nu~n#(X{Qr|*vKkb)CJLnQYZ}pl!<9oZWfI#>*ter zS~RUWir3UPyS#tuVEz!0G$zq=DJjvX3G{<$J2!RdV)vI%;Ec?ikh5$F0#*RbdP{%B zZuoNG)NOe0KfLdF!AJ|gTmxlU)0ElTC7uL5rxr{fY&3{Isx+c((WY^Qww!B?()NKW zw)XTWs-MAd0W`JlS$dlR8|p*@=Nxi zxz0>u@r82d6`E{U_Sg;D9RD+^BX!sF>0FivRMu=>3&e1+F+FyzI5FBilu6u&c`mv# z&vit&A1K{Os{h;D3WsQ=)v|UsTaw+C?GT8{ zshoL+gd6X`lk5#~>ML+!#+%UcW69(3%y>S}HxqZeK7n=X`vdu{LC6ohTwP!zPhjgD zgdhVVs9+;H06Ac=8=?_&!G-gQ3>@K#CY-MDL<`QQq;pR?3rY!SRJsc~U{-5_){t!8 z62A5NqJ550Xz8Fuu$QFQoz4AMTIwJUjEWN(oJ{h>WJMmBBGA*!B*P$8QsyIRAjkxh zT)r=5Vx$O6HkNwB_g_HpQ2zD)PB4|L1ShH(+mK|Ul+4ZVj0h6v1-w@N3I!exGeE7u zrS>m?71G~N@K`Mh3et7}Ti*v^fV7mJkuUU!d?u6_ssh1cYS_H7z&jC*tA0VCc;2s^ z&tFG}s}d>x@%QJ*x2fU(R+h_#O!43`gRUr&B(6 z7UZL43q26Q&&WB0805?8&sxyzbSqMm{CKv0B+W$GNvTb<_C9vHjIqf*S7C<~2T^&e zk5_&w&2kJXw~kaUg!Jg3jdKz$ZOE#nR<$sJTO-^6eOagng|1xN3t>bx?Fs;5TZ>f55k~;@jZYn3yni4dew*;jHr%x))@5FpjhQ z0^PlK)r=xhBvE7`U~aaQ0}jiDZH)c2O;UMU8r#Sk-*R?|Z#Bz+_h?**$w)p%RDBZ! Tcaa0mIP-9EpZU~xeBk64Z|e?< literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets2.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets2.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa950209b3f00fec9c96130d0bda0168e8eb6629 GIT binary patch literal 1514 zcmaJ=TZ`N_6qe-ccrMvXAp}D4>p;3;O`s)|kaW9A3d=t1r4Pe^(OO#1G#=YXnrvf| zr}VkM!IQWAojm$2^r?TLPdSojoFO5V(b3V-CrjUVj_7b0AZT|#{>U8%p?~ybyV)># z3|)Qz!_WjV%t(eOU?&8+#Vl&4XyP!NIe(#v%UtHc=rN!5VDvezd)!@NjKIU(Tj2>Y zo)4bINgc2Nygqm80qgVrH8I#B8}R;H0=qO~*daz+h+A8Toer_vA*?!Bq4l5ly6BMY zb4UM~k#jWuuDT3P<}Y}7P3KuGZ{{kQ#cC!vk5e#t#+AGmUM*FqW;{%2mWA_N6=8Z9 zi)9|(6w8c-G*L@fc@>&6T+-(Fyz`{Fi93^PNg+8NkF3z4D9Y3vh(h+Y%=|=1Oic2N$|4%ZagYs3=>j;gsmIE*d@8KO{V;cup3}K#VDK?FOqf7Y+ zy8H>uM*2>6@>Yv$)%FVg;nXg(R`?AzDEl>TQOp6U-P6iV4?~ck>iw3l>!9izncJeM zMzC(?B^5kZl?QWH8Qm&Gv(D=q}_lX`r#-y>}tcf`wUN30j zjru|}Z{R+<7;l3w&1=RZ?BgA{97UBV{eknw4fdIPN;2plf@Veb^i4YkP*32V) zgQq}!U2z@t=xgdaXX2JNJKAWP!UHoVVz-Na#nGJbJ*>AJ$;hM|IPOEN8f-LQ(0N{Y z+Cpxs!7or@@M1#~9&B#64T`G$t2Kz4Z8X)t=#pq+QPneJdU(*e5xD-@@%iP+#rebW zsPW>M6-gWm%@3Z;q3|^u&8*G4u1b>;bLGaDT(yr@E70ISKNm)u+%F{Xe_j-9nej)u eu;o24w(aYRC;IbyzUK!439#-XcmDBx)QW%g@l9L63lTRs z^BcC@_)EDVPW%N<%p@BqsE9~2e$3eOecw2IZOtd}-THc8?pTC;!^Oo9_Q+!}eFjdD z5fN0djE=yM7?>q2ZVOvDAIZoOuIRz&3QzQ5>`A)tq;pOwff<$VIUTWP)`OWP*`j|= zAm$7I1Lj!mTCnG2uu?7j7h39o2S)K&2IE;Co3zLSQv`aRns^c(x)F=;ynxfn@2bGTNeWfl;!^wH zK@l=MjB)5b3KNv<2u$AtXF#xoz9*mQ3HbzM4OM|)oEo;UkUYe#i*Z4KygjU))04gZ zgTrdIe|)g_@*rrI1G{!gmFA{iZBay~h?3o!fw}F@fYvrwiT*;A2jzd1`wv3UQR#3} zhEIxlo)ui^@My|Q9X#dnYi=eWYFtdqFo8{(zX^}iSD{Xgyjx;Ckvi-&*fvrdy*=h> z7Ig^b0HJHdR{5^(H~qqPt)mFd^P-!~rZ)Ac!sQ=|!J06zeK5TR4i&@a@LQ!bd*O6i zVFWVlCIhu{hE*RLo$N$vmY-IeC(_JR^Ge#S>c%0@vNTVEVmuCHE?`_{4_t-4QZ~5S z>qw0JM4IJ;sNIs|!%!~fp`aIBACI|hm1{6xQuTo9I#OMOy?;}^0#QR2v?0cpl#vh{ zR#z{BygRU<(K{`a2KVK7c2S7ihzEHQM6v;6b^Ve{r##IED|Ii5L=i`kT7g7`ZBq_9 wyrAh=!=<^V_OvujhyMe_dpIq`ER&D$m(VxC*)B?BGn;w%**^2B&pZJ56PorD*Z=?k literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/leakcheck.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/leakcheck.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8270234e31635533dafae7fabc652a7339f72e0e GIT binary patch literal 7382 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 F^0zi#Sg-&9 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3f19e8ea7afb10205fbe6531d769a9dd28b211c GIT binary patch literal 2812 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_generator.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_generator.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ced1b7f30cd4bd312659e592cc0bd8e36ada48bf GIT binary patch literal 2251 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc33b65ec8fb01d341c48d42881ee6317ab89f9c GIT binary patch literal 44754 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 dsO}Lc^6F8YkBEcVURDU$d)K{$KXj>6-um literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_leaks.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_leaks.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3370c21983c511f8e4717d4e5cfc3f7ff5b1c3d9 GIT binary patch literal 11545 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_stack_saved.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_stack_saved.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d9bbb69489d7716663a1db4ff0734d99b9ec067 GIT binary patch literal 869 zcmZuv&2AGh5FUFsVU;FTTj0i_5*KnH9Fb5}RccWrf z=oExZLdYePdP`r1Vrmv}BHCpv2D}mIEGzt0dKS;@4QnQEd3b{}PvN0SP zcCk^PySBNQ+GOIov9Tg~9~*J57wh@ SZM`lyYS@nHkr+Zkwcal=t;_!a literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_throw.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_throw.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3887649f54acd101799f7b201eeecd0811250a8 GIT binary patch literal 4041 zcmbtXNpIUm6rLH95+%#d-mFasCrzU^abkB#Qv^ZU#7F}aKEy7H2u2B-9LaPj(wP~> zwkn?#pzWdUt!Mk_zrAl#+vH77771ME{=CWmm?Gpa zd>Onk3qtTDodg zBpWm9TOtqp;4M)%LiPL5(Xbo8-Gy7;2f;~&2Bg9Q8Zbc6KvWUQ4x(0uXC)UDf+FsC< z+`xB+ zYpEf)9Mz-P-vo8(C}ihRnG!A1=83Ti9Zb|SSmn)$3d}YgCF}L{2IejsL$EbWFxpa& z;79N>MDQ1y;QJkd!D@Da)YD{}D6>V{G%%hpad(*b$0TN&d{8R{14K2F0Sl5#K)Jpip!f~f;G7%_h#Kancc zgxT9vw=r_t+pObyKuilGs`V?|25;D5%Gjm9p8=Z89TVFaA_EA{CTSa##D`~z{NaWU zm6SY&C(N;0=31^pEl{1c$F6VeYTU$pEJci z?6q_xV%52a(9~LsVMI-0_hYN=Sg0aSZA%92C0Reg!3j zTg>{HX0fmT-tTK(dn?X{ydR??dcO|QOV9uhgQ5mJ`4ZGnI>>@ITgqy~mtFAVeLnr^ zh)?HKzD3t;$c_|!r^9x0RwHnw?5NdH1P;`#jXKn{PQ4+Ov%($EQNr{23Y4Kvva-f~ z1@xe&q=lue^-ht5+6tsA3!#PiO`or;Fp0CcdQK0AB${>ZG0jtIK+ixx*Q}h|%jvVUCOO2mIe8|9S7K}X+zuM`=hvl2K`wJ!wB5ttUYv!gk4Z z@jpQJMVvx)&ZD@9;yQ}YP~1du3q_yh9@Sz3KH#ktgNkFyK50+dWvCL1`Wr+@EFQIC gr9@!8l!Z^6G;YPzzMW}!2McnE5y^&gLbNmg1$hy1CjbBd literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_tracing.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_tracing.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e8e61f723ba5bad3fdcefc8a090200b99af4623 GIT binary patch literal 9522 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 PLz6pPd-7+->#q5Kz6f&# literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_version.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_version.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1994cbb8018cd5126d181fce4d12eba8823af292 GIT binary patch literal 1560 zcmZ`(UvC>l5Z}FjzB-O$st8k5p?d*gq!{<5l}J?;rBxBCBBZoLJsF)Y-nDb_dH1@z z7aHr#1Fm?4uVC}WSK2qkQ@;XF%$#EsiE{SN?#|xK{N^`vo9^y52|RcIe83NVLjJ=~26vo@tqvh9}vqkjj9nU8qc$WL%1o$)q?2RrrEybCha6LbIEX z1DnS%^gakqV#-MDFv^^_1Ylt(&$hnjN`ohKqDK^7+&&FhAPq+_^zR@xmJ2#>Rg}3) zx^Pa3xbG1|uD+#Y;ZidHq#`TIJmXYw-X&|Gf(cHU&d2=*p=8nCeuZo{$Btb#5&I$eOMpF%vMlq)*5XFBUFyCbV+*0cM3O zuM2@EkleyYn~O%}{|ZnyUaA1BgNm*~Tv4E=jt6Tsr~(H-pODuB19h%Q7y6+~OtXSW zU9zM4`TmhCa~26{qH!h|h@40B=3z8C=c6fSQE$gOQd_S`&AAQu zn+%F*8_+hjqQNpH(iyj5lAvjlSYM@L!mW29Ghu_YD7av@{k7IyVLv@pN-FDWqk0YN zp>6CNm2qahbFR3hnRUuSg#gg{V?6(Zs4ndO9vyu(dpX&`^A;rM-~z$ zXPHP%CMI=Odsy6$K@i%ap5xJdn47c%5@#Iq2RFOCkIw&f`!JWIG}n*%@AEwmH8*7e zvFH7lB0U58joj2?dvF-dN^PPu9?8-~avT}Rp&!lnKGhNY4-T&J_gbn07~@b+vjV?1 z^#N>w>nm-W{0$$K2K_7i?5tl%V90ukr_B2BZdTZxw64y^$b(5YpX!LCmgoYgl$ZXTk-8Rf$ zIP*LIOX@LPEYNe~c!h-uW5_JQe+08$R41eT3e1 N3j{Qg6Vec+_YYOWndtxk literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e0720c3b186e9342399c05a58f99a8b6b78a4d6 GIT binary patch literal 1881 zcmbVM%WfMt6y@bSG*M*LY4bo|fm3wRSyXKkpaqJ+2;dgUqVS?g5kL?yV1~4;dNiYw z;}{X-O&uW4Usy~35_d&cS$Ee}?=9nZ*hjK~(1~q5RpRJJ zbwHpdrz7SM7RIQMJ#40f!6ThQ%`RX9XKV_myyh3dlmVNti*Ulvu*fL~jEEiVuO&#( z1oxQWKEQx5Ge`s?0PsMYTk&H&Vz!kq2>%lHFPV;Uv<22T7?DRVnh%3EK;TnZ^F{E6-NAK4uEH&krzTqkvlp?PO z&(-`&Y1b;@pKR9h_LjAJ=I)~2Ji*Xsui+JY1qa@-iSrqoz!YAy^O-rEWt@-C(P!R$ z6HZ@9cFM_v=ji!9EIb&kdk~LdbPZIixr1^le zj2wyGW?$9$vDT`rZ9EdxYchq6#R$D69hH|{w`dOKqDoJ$<2631^pVocmgf{7wROc;Q#;t literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension.c b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension.c new file mode 100644 index 00000000..05e81c03 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension.c @@ -0,0 +1,231 @@ +/* This is a set of functions used by test_extension_interface.py to test the + * Greenlet C API. + */ + +#include "../greenlet.h" + +#ifndef Py_RETURN_NONE +# define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None +#endif + +#define TEST_MODULE_NAME "_test_extension" + +static PyObject* +test_switch(PyObject* self, PyObject* greenlet) +{ + PyObject* result = NULL; + + if (greenlet == NULL || !PyGreenlet_Check(greenlet)) { + PyErr_BadArgument(); + return NULL; + } + + result = PyGreenlet_Switch((PyGreenlet*)greenlet, NULL, NULL); + if (result == NULL) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_AssertionError, + "greenlet.switch() failed for some reason."); + } + return NULL; + } + Py_INCREF(result); + return result; +} + +static PyObject* +test_switch_kwargs(PyObject* self, PyObject* args, PyObject* kwargs) +{ + PyGreenlet* g = NULL; + PyObject* result = NULL; + + PyArg_ParseTuple(args, "O!", &PyGreenlet_Type, &g); + + if (g == NULL || !PyGreenlet_Check(g)) { + PyErr_BadArgument(); + return NULL; + } + + result = PyGreenlet_Switch(g, NULL, kwargs); + if (result == NULL) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_AssertionError, + "greenlet.switch() failed for some reason."); + } + return NULL; + } + Py_XINCREF(result); + return result; +} + +static PyObject* +test_getcurrent(PyObject* self) +{ + PyGreenlet* g = PyGreenlet_GetCurrent(); + if (g == NULL || !PyGreenlet_Check(g) || !PyGreenlet_ACTIVE(g)) { + PyErr_SetString(PyExc_AssertionError, + "getcurrent() returned an invalid greenlet"); + Py_XDECREF(g); + return NULL; + } + Py_DECREF(g); + Py_RETURN_NONE; +} + +static PyObject* +test_setparent(PyObject* self, PyObject* arg) +{ + PyGreenlet* current; + PyGreenlet* greenlet = NULL; + + if (arg == NULL || !PyGreenlet_Check(arg)) { + PyErr_BadArgument(); + return NULL; + } + if ((current = PyGreenlet_GetCurrent()) == NULL) { + return NULL; + } + greenlet = (PyGreenlet*)arg; + if (PyGreenlet_SetParent(greenlet, current)) { + Py_DECREF(current); + return NULL; + } + Py_DECREF(current); + if (PyGreenlet_Switch(greenlet, NULL, NULL) == NULL) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject* +test_new_greenlet(PyObject* self, PyObject* callable) +{ + PyObject* result = NULL; + PyGreenlet* greenlet = PyGreenlet_New(callable, NULL); + + if (!greenlet) { + return NULL; + } + + result = PyGreenlet_Switch(greenlet, NULL, NULL); + Py_CLEAR(greenlet); + if (result == NULL) { + return NULL; + } + + Py_INCREF(result); + return result; +} + +static PyObject* +test_raise_dead_greenlet(PyObject* self) +{ + PyErr_SetString(PyExc_GreenletExit, "test GreenletExit exception."); + return NULL; +} + +static PyObject* +test_raise_greenlet_error(PyObject* self) +{ + PyErr_SetString(PyExc_GreenletError, "test greenlet.error exception"); + return NULL; +} + +static PyObject* +test_throw(PyObject* self, PyGreenlet* g) +{ + const char msg[] = "take that sucka!"; + PyObject* msg_obj = Py_BuildValue("s", msg); + PyGreenlet_Throw(g, PyExc_ValueError, msg_obj, NULL); + Py_DECREF(msg_obj); + if (PyErr_Occurred()) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyObject* +test_throw_exact(PyObject* self, PyObject* args) +{ + PyGreenlet* g = NULL; + PyObject* typ = NULL; + PyObject* val = NULL; + PyObject* tb = NULL; + + if (!PyArg_ParseTuple(args, "OOOO:throw", &g, &typ, &val, &tb)) { + return NULL; + } + + PyGreenlet_Throw(g, typ, val, tb); + if (PyErr_Occurred()) { + return NULL; + } + Py_RETURN_NONE; +} + +static PyMethodDef test_methods[] = { + {"test_switch", + (PyCFunction)test_switch, + METH_O, + "Switch to the provided greenlet sending provided arguments, and \n" + "return the results."}, + {"test_switch_kwargs", + (PyCFunction)test_switch_kwargs, + METH_VARARGS | METH_KEYWORDS, + "Switch to the provided greenlet sending the provided keyword args."}, + {"test_getcurrent", + (PyCFunction)test_getcurrent, + METH_NOARGS, + "Test PyGreenlet_GetCurrent()"}, + {"test_setparent", + (PyCFunction)test_setparent, + METH_O, + "Se the parent of the provided greenlet and switch to it."}, + {"test_new_greenlet", + (PyCFunction)test_new_greenlet, + METH_O, + "Test PyGreenlet_New()"}, + {"test_raise_dead_greenlet", + (PyCFunction)test_raise_dead_greenlet, + METH_NOARGS, + "Just raise greenlet.GreenletExit"}, + {"test_raise_greenlet_error", + (PyCFunction)test_raise_greenlet_error, + METH_NOARGS, + "Just raise greenlet.error"}, + {"test_throw", + (PyCFunction)test_throw, + METH_O, + "Throw a ValueError at the provided greenlet"}, + {"test_throw_exact", + (PyCFunction)test_throw_exact, + METH_VARARGS, + "Throw exactly the arguments given at the provided greenlet"}, + {NULL, NULL, 0, NULL} +}; + + +#define INITERROR return NULL + +static struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, + TEST_MODULE_NAME, + NULL, + 0, + test_methods, + NULL, + NULL, + NULL, + NULL}; + +PyMODINIT_FUNC +PyInit__test_extension(void) +{ + PyObject* module = NULL; + module = PyModule_Create(&moduledef); + + if (module == NULL) { + return NULL; + } + + PyGreenlet_Import(); + return module; +} diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension.cp39-win_amd64.pyd b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension.cp39-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..571e545dbf83b168f112772d4d9d6bb0f5e85eda GIT binary patch literal 13312 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cp39-win_amd64.pyd b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cp39-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..d044554229d74bd3cc44a11b0b1ab7b06281ca9f GIT binary patch literal 14848 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 BfhGU| literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cpp b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cpp new file mode 100644 index 00000000..1c49160a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/_test_extension_cpp.cpp @@ -0,0 +1,211 @@ +/* This is a set of functions used to test C++ exceptions are not + * broken during greenlet switches + */ + +#include "../greenlet.h" +#include "../greenlet_compiler_compat.hpp" +#include +#include + +struct exception_t { + int depth; + exception_t(int depth) : depth(depth) {} +}; + +/* Functions are called via pointers to prevent inlining */ +static void (*p_test_exception_throw_nonstd)(int depth); +static void (*p_test_exception_throw_std)(); +static PyObject* (*p_test_exception_switch_recurse)(int depth, int left); + +static void +test_exception_throw_nonstd(int depth) +{ + throw exception_t(depth); +} + +static void +test_exception_throw_std() +{ + throw std::runtime_error("Thrown from an extension."); +} + +static PyObject* +test_exception_switch_recurse(int depth, int left) +{ + if (left > 0) { + return p_test_exception_switch_recurse(depth, left - 1); + } + + PyObject* result = NULL; + PyGreenlet* self = PyGreenlet_GetCurrent(); + if (self == NULL) + return NULL; + + try { + if (PyGreenlet_Switch(PyGreenlet_GET_PARENT(self), NULL, NULL) == NULL) { + Py_DECREF(self); + return NULL; + } + p_test_exception_throw_nonstd(depth); + PyErr_SetString(PyExc_RuntimeError, + "throwing C++ exception didn't work"); + } + catch (const exception_t& e) { + if (e.depth != depth) + PyErr_SetString(PyExc_AssertionError, "depth mismatch"); + else + result = PyLong_FromLong(depth); + } + catch (...) { + PyErr_SetString(PyExc_RuntimeError, "unexpected C++ exception"); + } + + Py_DECREF(self); + return result; +} + +/* test_exception_switch(int depth) + * - recurses depth times + * - switches to parent inside try/catch block + * - throws an exception that (expected to be caught in the same function) + * - verifies depth matches (exceptions shouldn't be caught in other greenlets) + */ +static PyObject* +test_exception_switch(PyObject* UNUSED(self), PyObject* args) +{ + int depth; + if (!PyArg_ParseTuple(args, "i", &depth)) + return NULL; + return p_test_exception_switch_recurse(depth, depth); +} + + +static PyObject* +py_test_exception_throw_nonstd(PyObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + p_test_exception_throw_nonstd(0); + PyErr_SetString(PyExc_AssertionError, "unreachable code running after throw"); + return NULL; +} + +static PyObject* +py_test_exception_throw_std(PyObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + p_test_exception_throw_std(); + PyErr_SetString(PyExc_AssertionError, "unreachable code running after throw"); + return NULL; +} + + + +/* test_exception_switch_and_do_in_g2(g2func) + * - creates new greenlet g2 to run g2func + * - switches to g2 inside try/catch block + * - verifies that no exception has been caught + * + * it is used together with test_exception_throw to verify that unhandled + * exceptions thrown in one greenlet do not propagate to other greenlet nor + * segfault the process. + */ +static PyObject* +test_exception_switch_and_do_in_g2(PyObject* self, PyObject* args) +{ + PyObject* g2func = NULL; + PyObject* result = NULL; + + if (!PyArg_ParseTuple(args, "O", &g2func)) + return NULL; + PyGreenlet* g2 = PyGreenlet_New(g2func, NULL); + if (!g2) { + return NULL; + } + + try { + result = PyGreenlet_Switch(g2, NULL, NULL); + if (!result) { + return NULL; + } + } + catch (const exception_t& e) { + /* if we are here the memory can be already corrupted and the program + * might crash before below py-level exception might become printed. + * -> print something to stderr to make it clear that we had entered + * this catch block. + * See comments in inner_bootstrap() + */ +#if defined(WIN32) || defined(_WIN32) + fprintf(stderr, "C++ exception unexpectedly caught in g1\n"); + PyErr_SetString(PyExc_AssertionError, "C++ exception unexpectedly caught in g1"); + Py_XDECREF(result); + return NULL; +#else + throw; +#endif + } + + Py_XDECREF(result); + Py_RETURN_NONE; +} + +static PyMethodDef test_methods[] = { + {"test_exception_switch", + (PyCFunction)&test_exception_switch, + METH_VARARGS, + "Switches to parent twice, to test exception handling and greenlet " + "switching."}, + {"test_exception_switch_and_do_in_g2", + (PyCFunction)&test_exception_switch_and_do_in_g2, + METH_VARARGS, + "Creates new greenlet g2 to run g2func and switches to it inside try/catch " + "block. Used together with test_exception_throw to verify that unhandled " + "C++ exceptions thrown in a greenlet doe not corrupt memory."}, + {"test_exception_throw_nonstd", + (PyCFunction)&py_test_exception_throw_nonstd, + METH_VARARGS, + "Throws non-standard C++ exception. Calling this function directly should abort the process." + }, + {"test_exception_throw_std", + (PyCFunction)&py_test_exception_throw_std, + METH_VARARGS, + "Throws standard C++ exception. Calling this function directly should abort the process." + }, + {NULL, NULL, 0, NULL} +}; + + +static struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, + "greenlet.tests._test_extension_cpp", + NULL, + 0, + test_methods, + NULL, + NULL, + NULL, + NULL}; + +PyMODINIT_FUNC +PyInit__test_extension_cpp(void) +{ + PyObject* module = NULL; + + module = PyModule_Create(&moduledef); + + if (module == NULL) { + return NULL; + } + + PyGreenlet_Import(); + if (_PyGreenlet_API == NULL) { + return NULL; + } + + p_test_exception_throw_nonstd = test_exception_throw_nonstd; + p_test_exception_throw_std = test_exception_throw_std; + p_test_exception_switch_recurse = test_exception_switch_recurse; + + return module; +} diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_clearing_run_switches.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_clearing_run_switches.py new file mode 100644 index 00000000..6dd1492f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_clearing_run_switches.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +""" +If we have a run callable passed to the constructor or set as an +attribute, but we don't actually use that (because ``__getattribute__`` +or the like interferes), then when we clear callable before beginning +to run, there's an opportunity for Python code to run. + +""" +import greenlet + +g = None +main = greenlet.getcurrent() + +results = [] + +class RunCallable: + + def __del__(self): + results.append(('RunCallable', '__del__')) + main.switch('from RunCallable') + + +class G(greenlet.greenlet): + + def __getattribute__(self, name): + if name == 'run': + results.append(('G.__getattribute__', 'run')) + return run_func + return object.__getattribute__(self, name) + + +def run_func(): + results.append(('run_func', 'enter')) + + +g = G(RunCallable()) +# Try to start G. It will get to the point where it deletes +# its run callable C++ variable in inner_bootstrap. That triggers +# the __del__ method, which switches back to main before g +# actually even starts running. +x = g.switch() +results.append(('main: g.switch()', x)) +# In the C++ code, this results in g->g_switch() appearing to return, even though +# it has yet to run. +print('In main with', x, flush=True) +g.switch() +print('RESULTS', results) diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_cpp_exception.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_cpp_exception.py new file mode 100644 index 00000000..fa4dc2eb --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_cpp_exception.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +""" +Helper for testing a C++ exception throw aborts the process. + +Takes one argument, the name of the function in :mod:`_test_extension_cpp` to call. +""" +import sys +import greenlet +from greenlet.tests import _test_extension_cpp +print('fail_cpp_exception is running') + +def run_unhandled_exception_in_greenlet_aborts(): + def _(): + _test_extension_cpp.test_exception_switch_and_do_in_g2( + _test_extension_cpp.test_exception_throw_nonstd + ) + g1 = greenlet.greenlet(_) + g1.switch() + + +func_name = sys.argv[1] +try: + func = getattr(_test_extension_cpp, func_name) +except AttributeError: + if func_name == run_unhandled_exception_in_greenlet_aborts.__name__: + func = run_unhandled_exception_in_greenlet_aborts + elif func_name == 'run_as_greenlet_target': + g = greenlet.greenlet(_test_extension_cpp.test_exception_throw_std) + func = g.switch + else: + raise +print('raising', func, flush=True) +func() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_initialstub_already_started.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_initialstub_already_started.py new file mode 100644 index 00000000..c1a44efd --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_initialstub_already_started.py @@ -0,0 +1,78 @@ +""" +Testing initialstub throwing an already started exception. +""" + +import greenlet + +a = None +b = None +c = None +main = greenlet.getcurrent() + +# If we switch into a dead greenlet, +# we go looking for its parents. +# if a parent is not yet started, we start it. + +results = [] + +def a_run(*args): + #results.append('A') + results.append(('Begin A', args)) + + +def c_run(): + results.append('Begin C') + b.switch('From C') + results.append('C done') + +class A(greenlet.greenlet): pass + +class B(greenlet.greenlet): + doing_it = False + def __getattribute__(self, name): + if name == 'run' and not self.doing_it: + assert greenlet.getcurrent() is c + self.doing_it = True + results.append('Switch to b from B.__getattribute__ in ' + + type(greenlet.getcurrent()).__name__) + b.switch() + results.append('B.__getattribute__ back from main in ' + + type(greenlet.getcurrent()).__name__) + if name == 'run': + name = '_B_run' + return object.__getattribute__(self, name) + + def _B_run(self, *arg): + results.append(('Begin B', arg)) + results.append('_B_run switching to main') + main.switch('From B') + +class C(greenlet.greenlet): + pass +a = A(a_run) +b = B(parent=a) +c = C(c_run, b) + +# Start a child; while running, it will start B, +# but starting B will ALSO start B. +result = c.switch() +results.append(('main from c', result)) + +# Switch back to C, which was in the middle of switching +# already. This will throw the ``GreenletStartedWhileInPython`` +# exception, which results in parent A getting started (B is finished) +c.switch() + +results.append(('A dead?', a.dead, 'B dead?', b.dead, 'C dead?', c.dead)) + +# A and B should both be dead now. +assert a.dead +assert b.dead +assert not c.dead + +result = c.switch() +results.append(('main from c.2', result)) +# Now C is dead +assert c.dead + +print("RESULTS:", results) diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_slp_switch.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_slp_switch.py new file mode 100644 index 00000000..09905269 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_slp_switch.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +""" +A test helper for seeing what happens when slp_switch() +fails. +""" +# pragma: no cover + +import greenlet + + +print('fail_slp_switch is running', flush=True) + +runs = [] +def func(): + runs.append(1) + greenlet.getcurrent().parent.switch() + runs.append(2) + greenlet.getcurrent().parent.switch() + runs.append(3) + +g = greenlet._greenlet.UnswitchableGreenlet(func) +g.switch() +assert runs == [1] +g.switch() +assert runs == [1, 2] +g.force_slp_switch_error = True + +# This should crash. +g.switch() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets.py new file mode 100644 index 00000000..e151b19a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets.py @@ -0,0 +1,44 @@ +""" +Uses a trace function to switch greenlets at unexpected times. + +In the trace function, we switch from the current greenlet to another +greenlet, which switches +""" +import greenlet + +g1 = None +g2 = None + +switch_to_g2 = False + +def tracefunc(*args): + print('TRACE', *args) + global switch_to_g2 + if switch_to_g2: + switch_to_g2 = False + g2.switch() + print('\tLEAVE TRACE', *args) + +def g1_run(): + print('In g1_run') + global switch_to_g2 + switch_to_g2 = True + from_parent = greenlet.getcurrent().parent.switch() + print('Return to g1_run') + print('From parent', from_parent) + +def g2_run(): + #g1.switch() + greenlet.getcurrent().parent.switch() + +greenlet.settrace(tracefunc) + +g1 = greenlet.greenlet(g1_run) +g2 = greenlet.greenlet(g2_run) + +# This switch didn't actually finish! +# And if it did, it would raise TypeError +# because g1_run() doesn't take any arguments. +g1.switch(1) +print('Back in main') +g1.switch(2) diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets2.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets2.py new file mode 100644 index 00000000..1f6b66bc --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_three_greenlets2.py @@ -0,0 +1,55 @@ +""" +Like fail_switch_three_greenlets, but the call into g1_run would actually be +valid. +""" +import greenlet + +g1 = None +g2 = None + +switch_to_g2 = True + +results = [] + +def tracefunc(*args): + results.append(('trace', args[0])) + print('TRACE', *args) + global switch_to_g2 + if switch_to_g2: + switch_to_g2 = False + g2.switch('g2 from tracefunc') + print('\tLEAVE TRACE', *args) + +def g1_run(arg): + results.append(('g1 arg', arg)) + print('In g1_run') + from_parent = greenlet.getcurrent().parent.switch('from g1_run') + results.append(('g1 from parent', from_parent)) + return 'g1 done' + +def g2_run(arg): + #g1.switch() + results.append(('g2 arg', arg)) + parent = greenlet.getcurrent().parent.switch('from g2_run') + global switch_to_g2 + switch_to_g2 = False + results.append(('g2 from parent', parent)) + return 'g2 done' + + +greenlet.settrace(tracefunc) + +g1 = greenlet.greenlet(g1_run) +g2 = greenlet.greenlet(g2_run) + +x = g1.switch('g1 from main') +results.append(('main g1', x)) +print('Back in main', x) +x = g1.switch('g2 from main') +results.append(('main g2', x)) +print('back in amain again', x) +x = g1.switch('g1 from main 2') +results.append(('main g1.2', x)) +x = g2.switch() +results.append(('main g2.2', x)) +print("RESULTS:", results) diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_two_greenlets.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_two_greenlets.py new file mode 100644 index 00000000..3e52345a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/fail_switch_two_greenlets.py @@ -0,0 +1,41 @@ +""" +Uses a trace function to switch greenlets at unexpected times. + +In the trace function, we switch from the current greenlet to another +greenlet, which switches +""" +import greenlet + +g1 = None +g2 = None + +switch_to_g2 = False + +def tracefunc(*args): + print('TRACE', *args) + global switch_to_g2 + if switch_to_g2: + switch_to_g2 = False + g2.switch() + print('\tLEAVE TRACE', *args) + +def g1_run(): + print('In g1_run') + global switch_to_g2 + switch_to_g2 = True + greenlet.getcurrent().parent.switch() + print('Return to g1_run') + print('Falling off end of g1_run') + +def g2_run(): + g1.switch() + print('Falling off end of g2') + +greenlet.settrace(tracefunc) + +g1 = greenlet.greenlet(g1_run) +g2 = greenlet.greenlet(g2_run) + +g1.switch() +print('Falling off end of main') +g2.switch() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/leakcheck.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/leakcheck.py new file mode 100644 index 00000000..79a18fce --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/leakcheck.py @@ -0,0 +1,318 @@ +# Copyright (c) 2018 gevent community +# Copyright (c) 2021 greenlet community +# +# This was originally part of gevent's test suite. The main author +# (Jason Madden) vendored a copy of it into greenlet. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +from __future__ import print_function + +import os +import sys +import gc + +from functools import wraps +import unittest + + +import objgraph + +# graphviz 0.18 (Nov 7 2021), available only on Python 3.6 and newer, +# has added type hints (sigh). It wants to use ``typing.Literal`` for +# some stuff, but that's only available on Python 3.9+. If that's not +# found, it creates a ``unittest.mock.MagicMock`` object and annotates +# with that. These are GC'able objects, and doing almost *anything* +# with them results in an explosion of objects. For example, trying to +# compare them for equality creates new objects. This causes our +# leakchecks to fail, with reports like: +# +# greenlet.tests.leakcheck.LeakCheckError: refcount increased by [337, 1333, 343, 430, 530, 643, 769] +# _Call 1820 +546 +# dict 4094 +76 +# MagicProxy 585 +73 +# tuple 2693 +66 +# _CallList 24 +3 +# weakref 1441 +1 +# function 5996 +1 +# type 736 +1 +# cell 592 +1 +# MagicMock 8 +1 +# +# To avoid this, we *could* filter this type of object out early. In +# principle it could leak, but we don't use mocks in greenlet, so it +# doesn't leak from us. However, a further issue is that ``MagicMock`` +# objects have subobjects that are also GC'able, like ``_Call``, and +# those create new mocks of their own too. So we'd have to filter them +# as well, and they're not public. That's OK, we can workaround the +# problem by being very careful to never compare by equality or other +# user-defined operators, only using object identity or other builtin +# functions. + +RUNNING_ON_GITHUB_ACTIONS = os.environ.get('GITHUB_ACTIONS') +RUNNING_ON_TRAVIS = os.environ.get('TRAVIS') or RUNNING_ON_GITHUB_ACTIONS +RUNNING_ON_APPVEYOR = os.environ.get('APPVEYOR') +RUNNING_ON_CI = RUNNING_ON_TRAVIS or RUNNING_ON_APPVEYOR +RUNNING_ON_MANYLINUX = os.environ.get('GREENLET_MANYLINUX') +SKIP_LEAKCHECKS = RUNNING_ON_MANYLINUX or os.environ.get('GREENLET_SKIP_LEAKCHECKS') +SKIP_FAILING_LEAKCHECKS = os.environ.get('GREENLET_SKIP_FAILING_LEAKCHECKS') +ONLY_FAILING_LEAKCHECKS = os.environ.get('GREENLET_ONLY_FAILING_LEAKCHECKS') + +def ignores_leakcheck(func): + """ + Ignore the given object during leakchecks. + + Can be applied to a method, in which case the method will run, but + will not be subject to leak checks. + + If applied to a class, the entire class will be skipped during leakchecks. This + is intended to be used for classes that are very slow and cause problems such as + test timeouts; typically it will be used for classes that are subclasses of a base + class and specify variants of behaviour (such as pool sizes). + """ + func.ignore_leakcheck = True + return func + +def fails_leakcheck(func): + """ + Mark that the function is known to leak. + """ + func.fails_leakcheck = True + if SKIP_FAILING_LEAKCHECKS: + func = unittest.skip("Skipping known failures")(func) + return func + +class LeakCheckError(AssertionError): + pass + +if hasattr(sys, 'getobjects'): + # In a Python build with ``--with-trace-refs``, make objgraph + # trace *all* the objects, not just those that are tracked by the + # GC + class _MockGC(object): + def get_objects(self): + return sys.getobjects(0) # pylint:disable=no-member + def __getattr__(self, name): + return getattr(gc, name) + objgraph.gc = _MockGC() + fails_strict_leakcheck = fails_leakcheck +else: + def fails_strict_leakcheck(func): + """ + Decorator for a function that is known to fail when running + strict (``sys.getobjects()``) leakchecks. + + This type of leakcheck finds all objects, even those, such as + strings, which are not tracked by the garbage collector. + """ + return func + +class ignores_types_in_strict_leakcheck(object): + def __init__(self, types): + self.types = types + def __call__(self, func): + func.leakcheck_ignore_types = self.types + return func + +class _RefCountChecker(object): + + # Some builtin things that we ignore + # XXX: Those things were ignored by gevent, but they're important here, + # presumably. + IGNORED_TYPES = () #(tuple, dict, types.FrameType, types.TracebackType) + + def __init__(self, testcase, function): + self.testcase = testcase + self.function = function + self.deltas = [] + self.peak_stats = {} + self.ignored_types = () + + # The very first time we are called, we have already been + # self.setUp() by the test runner, so we don't need to do it again. + self.needs_setUp = False + + def _include_object_p(self, obj): + # pylint:disable=too-many-return-statements + # + # See the comment block at the top. We must be careful to + # avoid invoking user-defined operations. + if obj is self: + return False + kind = type(obj) + # ``self._include_object_p == obj`` returns NotImplemented + # for non-function objects, which causes the interpreter + # to try to reverse the order of arguments...which leads + # to the explosion of mock objects. We don't want that, so we implement + # the check manually. + if kind == type(self._include_object_p): + try: + # pylint:disable=not-callable + exact_method_equals = self._include_object_p.__eq__(obj) + except AttributeError: + # Python 2.7 methods may only have __cmp__, and that raises a + # TypeError for non-method arguments + # pylint:disable=no-member + exact_method_equals = self._include_object_p.__cmp__(obj) == 0 + + if exact_method_equals is not NotImplemented and exact_method_equals: + return False + + # Similarly, we need to check identity in our __dict__ to avoid mock explosions. + for x in self.__dict__.values(): + if obj is x: + return False + + + if kind in self.ignored_types or kind in self.IGNORED_TYPES: + return False + + return True + + def _growth(self): + return objgraph.growth(limit=None, peak_stats=self.peak_stats, + filter=self._include_object_p) + + def _report_diff(self, growth): + if not growth: + return "" + + lines = [] + width = max(len(name) for name, _, _ in growth) + for name, count, delta in growth: + lines.append('%-*s%9d %+9d' % (width, name, count, delta)) + + diff = '\n'.join(lines) + return diff + + + def _run_test(self, args, kwargs): + gc_enabled = gc.isenabled() + gc.disable() + + if self.needs_setUp: + self.testcase.setUp() + self.testcase.skipTearDown = False + try: + self.function(self.testcase, *args, **kwargs) + finally: + self.testcase.tearDown() + self.testcase.doCleanups() + self.testcase.skipTearDown = True + self.needs_setUp = True + if gc_enabled: + gc.enable() + + def _growth_after(self): + # Grab post snapshot + if 'urlparse' in sys.modules: + sys.modules['urlparse'].clear_cache() + if 'urllib.parse' in sys.modules: + sys.modules['urllib.parse'].clear_cache() + + return self._growth() + + def _check_deltas(self, growth): + # Return false when we have decided there is no leak, + # true if we should keep looping, raises an assertion + # if we have decided there is a leak. + + deltas = self.deltas + if not deltas: + # We haven't run yet, no data, keep looping + return True + + if gc.garbage: + raise LeakCheckError("Generated uncollectable garbage %r" % (gc.garbage,)) + + + # the following configurations are classified as "no leak" + # [0, 0] + # [x, 0, 0] + # [... a, b, c, d] where a+b+c+d = 0 + # + # the following configurations are classified as "leak" + # [... z, z, z] where z > 0 + + if deltas[-2:] == [0, 0] and len(deltas) in (2, 3): + return False + + if deltas[-3:] == [0, 0, 0]: + return False + + if len(deltas) >= 4 and sum(deltas[-4:]) == 0: + return False + + if len(deltas) >= 3 and deltas[-1] > 0 and deltas[-1] == deltas[-2] and deltas[-2] == deltas[-3]: + diff = self._report_diff(growth) + raise LeakCheckError('refcount increased by %r\n%s' % (deltas, diff)) + + # OK, we don't know for sure yet. Let's search for more + if sum(deltas[-3:]) <= 0 or sum(deltas[-4:]) <= 0 or deltas[-4:].count(0) >= 2: + # this is suspicious, so give a few more runs + limit = 11 + else: + limit = 7 + if len(deltas) >= limit: + raise LeakCheckError('refcount increased by %r\n%s' + % (deltas, + self._report_diff(growth))) + + # We couldn't decide yet, keep going + return True + + def __call__(self, args, kwargs): + for _ in range(3): + gc.collect() + + expect_failure = getattr(self.function, 'fails_leakcheck', False) + if expect_failure: + self.testcase.expect_greenlet_leak = True + self.ignored_types = getattr(self.function, "leakcheck_ignore_types", ()) + + # Capture state before; the incremental will be + # updated by each call to _growth_after + growth = self._growth() + + try: + while self._check_deltas(growth): + self._run_test(args, kwargs) + + growth = self._growth_after() + + self.deltas.append(sum((stat[2] for stat in growth))) + except LeakCheckError: + if not expect_failure: + raise + else: + if expect_failure: + raise LeakCheckError("Expected %s to leak but it did not." % (self.function,)) + +def wrap_refcount(method): + if getattr(method, 'ignore_leakcheck', False) or SKIP_LEAKCHECKS: + return method + + @wraps(method) + def wrapper(self, *args, **kwargs): # pylint:disable=too-many-branches + if getattr(self, 'ignore_leakcheck', False): + raise unittest.SkipTest("This class ignored during leakchecks") + if ONLY_FAILING_LEAKCHECKS and not getattr(method, 'fails_leakcheck', False): + raise unittest.SkipTest("Only running tests that fail leakchecks.") + return _RefCountChecker(self, method)(args, kwargs) + + return wrapper diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_contextvars.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_contextvars.py new file mode 100644 index 00000000..4f7f98d2 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_contextvars.py @@ -0,0 +1,309 @@ +from __future__ import print_function + +import gc +import sys +import unittest + +from functools import partial +from unittest import skipUnless +from unittest import skipIf + +from greenlet import greenlet +from greenlet import getcurrent +from . import TestCase + + +try: + from contextvars import Context + from contextvars import ContextVar + from contextvars import copy_context + # From the documentation: + # + # Important: Context Variables should be created at the top module + # level and never in closures. Context objects hold strong + # references to context variables which prevents context variables + # from being properly garbage collected. + ID_VAR = ContextVar("id", default=None) + VAR_VAR = ContextVar("var", default=None) + ContextVar = None +except ImportError: + Context = ContextVar = copy_context = None + +# We don't support testing if greenlet's built-in context var support is disabled. +@skipUnless(Context is not None, "ContextVar not supported") +class ContextVarsTests(TestCase): + def _new_ctx_run(self, *args, **kwargs): + return copy_context().run(*args, **kwargs) + + def _increment(self, greenlet_id, callback, counts, expect): + ctx_var = ID_VAR + if expect is None: + self.assertIsNone(ctx_var.get()) + else: + self.assertEqual(ctx_var.get(), expect) + ctx_var.set(greenlet_id) + for _ in range(2): + counts[ctx_var.get()] += 1 + callback() + + def _test_context(self, propagate_by): + ID_VAR.set(0) + + callback = getcurrent().switch + counts = dict((i, 0) for i in range(5)) + + lets = [ + greenlet(partial( + partial( + copy_context().run, + self._increment + ) if propagate_by == "run" else self._increment, + greenlet_id=i, + callback=callback, + counts=counts, + expect=( + i - 1 if propagate_by == "share" else + 0 if propagate_by in ("set", "run") else None + ) + )) + for i in range(1, 5) + ] + + for let in lets: + if propagate_by == "set": + let.gr_context = copy_context() + elif propagate_by == "share": + let.gr_context = getcurrent().gr_context + + for i in range(2): + counts[ID_VAR.get()] += 1 + for let in lets: + let.switch() + + if propagate_by == "run": + # Must leave each context.run() in reverse order of entry + for let in reversed(lets): + let.switch() + else: + # No context.run(), so fine to exit in any order. + for let in lets: + let.switch() + + for let in lets: + self.assertTrue(let.dead) + # When using run(), we leave the run() as the greenlet dies, + # and there's no context "underneath". When not using run(), + # gr_context still reflects the context the greenlet was + # running in. + if propagate_by == 'run': + self.assertIsNone(let.gr_context) + else: + self.assertIsNotNone(let.gr_context) + + + if propagate_by == "share": + self.assertEqual(counts, {0: 1, 1: 1, 2: 1, 3: 1, 4: 6}) + else: + self.assertEqual(set(counts.values()), set([2])) + + def test_context_propagated_by_context_run(self): + self._new_ctx_run(self._test_context, "run") + + def test_context_propagated_by_setting_attribute(self): + self._new_ctx_run(self._test_context, "set") + + def test_context_not_propagated(self): + self._new_ctx_run(self._test_context, None) + + def test_context_shared(self): + self._new_ctx_run(self._test_context, "share") + + def test_break_ctxvars(self): + let1 = greenlet(copy_context().run) + let2 = greenlet(copy_context().run) + let1.switch(getcurrent().switch) + let2.switch(getcurrent().switch) + # Since let2 entered the current context and let1 exits its own, the + # interpreter emits: + # RuntimeError: cannot exit context: thread state references a different context object + let1.switch() + + def test_not_broken_if_using_attribute_instead_of_context_run(self): + let1 = greenlet(getcurrent().switch) + let2 = greenlet(getcurrent().switch) + let1.gr_context = copy_context() + let2.gr_context = copy_context() + let1.switch() + let2.switch() + let1.switch() + let2.switch() + + def test_context_assignment_while_running(self): + # pylint:disable=too-many-statements + ID_VAR.set(None) + + def target(): + self.assertIsNone(ID_VAR.get()) + self.assertIsNone(gr.gr_context) + + # Context is created on first use + ID_VAR.set(1) + self.assertIsInstance(gr.gr_context, Context) + self.assertEqual(ID_VAR.get(), 1) + self.assertEqual(gr.gr_context[ID_VAR], 1) + + # Clearing the context makes it get re-created as another + # empty context when next used + old_context = gr.gr_context + gr.gr_context = None # assign None while running + self.assertIsNone(ID_VAR.get()) + self.assertIsNone(gr.gr_context) + ID_VAR.set(2) + self.assertIsInstance(gr.gr_context, Context) + self.assertEqual(ID_VAR.get(), 2) + self.assertEqual(gr.gr_context[ID_VAR], 2) + + new_context = gr.gr_context + getcurrent().parent.switch((old_context, new_context)) + # parent switches us back to old_context + + self.assertEqual(ID_VAR.get(), 1) + gr.gr_context = new_context # assign non-None while running + self.assertEqual(ID_VAR.get(), 2) + + getcurrent().parent.switch() + # parent switches us back to no context + self.assertIsNone(ID_VAR.get()) + self.assertIsNone(gr.gr_context) + gr.gr_context = old_context + self.assertEqual(ID_VAR.get(), 1) + + getcurrent().parent.switch() + # parent switches us back to no context + self.assertIsNone(ID_VAR.get()) + self.assertIsNone(gr.gr_context) + + gr = greenlet(target) + + with self.assertRaisesRegex(AttributeError, "can't delete context attribute"): + del gr.gr_context + + self.assertIsNone(gr.gr_context) + old_context, new_context = gr.switch() + self.assertIs(new_context, gr.gr_context) + self.assertEqual(old_context[ID_VAR], 1) + self.assertEqual(new_context[ID_VAR], 2) + self.assertEqual(new_context.run(ID_VAR.get), 2) + gr.gr_context = old_context # assign non-None while suspended + gr.switch() + self.assertIs(gr.gr_context, new_context) + gr.gr_context = None # assign None while suspended + gr.switch() + self.assertIs(gr.gr_context, old_context) + gr.gr_context = None + gr.switch() + self.assertIsNone(gr.gr_context) + + # Make sure there are no reference leaks + gr = None + gc.collect() + self.assertEqual(sys.getrefcount(old_context), 2) + self.assertEqual(sys.getrefcount(new_context), 2) + + def test_context_assignment_different_thread(self): + import threading + VAR_VAR.set(None) + ctx = Context() + + is_running = threading.Event() + should_suspend = threading.Event() + did_suspend = threading.Event() + should_exit = threading.Event() + holder = [] + + def greenlet_in_thread_fn(): + VAR_VAR.set(1) + is_running.set() + should_suspend.wait(10) + VAR_VAR.set(2) + getcurrent().parent.switch() + holder.append(VAR_VAR.get()) + + def thread_fn(): + gr = greenlet(greenlet_in_thread_fn) + gr.gr_context = ctx + holder.append(gr) + gr.switch() + did_suspend.set() + should_exit.wait(10) + gr.switch() + del gr + greenlet() # trigger cleanup + + thread = threading.Thread(target=thread_fn, daemon=True) + thread.start() + is_running.wait(10) + gr = holder[0] + + # Can't access or modify context if the greenlet is running + # in a different thread + with self.assertRaisesRegex(ValueError, "running in a different"): + getattr(gr, 'gr_context') + with self.assertRaisesRegex(ValueError, "running in a different"): + gr.gr_context = None + + should_suspend.set() + did_suspend.wait(10) + + # OK to access and modify context if greenlet is suspended + self.assertIs(gr.gr_context, ctx) + self.assertEqual(gr.gr_context[VAR_VAR], 2) + gr.gr_context = None + + should_exit.set() + thread.join(10) + + self.assertEqual(holder, [gr, None]) + + # Context can still be accessed/modified when greenlet is dead: + self.assertIsNone(gr.gr_context) + gr.gr_context = ctx + self.assertIs(gr.gr_context, ctx) + + # Otherwise we leak greenlets on some platforms. + # XXX: Should be able to do this automatically + del holder[:] + gr = None + thread = None + + def test_context_assignment_wrong_type(self): + g = greenlet() + with self.assertRaisesRegex(TypeError, + "greenlet context must be a contextvars.Context or None"): + g.gr_context = self + + +@skipIf(Context is not None, "ContextVar supported") +class NoContextVarsTests(TestCase): + def test_contextvars_errors(self): + let1 = greenlet(getcurrent().switch) + self.assertFalse(hasattr(let1, 'gr_context')) + with self.assertRaises(AttributeError): + getattr(let1, 'gr_context') + + with self.assertRaises(AttributeError): + let1.gr_context = None + + let1.switch() + + with self.assertRaises(AttributeError): + getattr(let1, 'gr_context') + + with self.assertRaises(AttributeError): + let1.gr_context = None + + del let1 + + +if __name__ == '__main__': + unittest.main() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_cpp.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_cpp.py new file mode 100644 index 00000000..4d9a4da4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_cpp.py @@ -0,0 +1,69 @@ +from __future__ import print_function +from __future__ import absolute_import + +import subprocess +import unittest + +import greenlet +from . import _test_extension_cpp +from . import TestCase +from . import WIN + +class CPPTests(TestCase): + def test_exception_switch(self): + greenlets = [] + for i in range(4): + g = greenlet.greenlet(_test_extension_cpp.test_exception_switch) + g.switch(i) + greenlets.append(g) + for i, g in enumerate(greenlets): + self.assertEqual(g.switch(), i) + + def _do_test_unhandled_exception(self, target): + import os + import sys + script = os.path.join( + os.path.dirname(__file__), + 'fail_cpp_exception.py', + ) + args = [sys.executable, script, target.__name__ if not isinstance(target, str) else target] + __traceback_info__ = args + with self.assertRaises(subprocess.CalledProcessError) as exc: + subprocess.check_output( + args, + encoding='utf-8', + stderr=subprocess.STDOUT + ) + + ex = exc.exception + expected_exit = self.get_expected_returncodes_for_aborted_process() + self.assertIn(ex.returncode, expected_exit) + self.assertIn('fail_cpp_exception is running', ex.output) + return ex.output + + + def test_unhandled_nonstd_exception_aborts(self): + # verify that plain unhandled throw aborts + self._do_test_unhandled_exception(_test_extension_cpp.test_exception_throw_nonstd) + + def test_unhandled_std_exception_aborts(self): + # verify that plain unhandled throw aborts + self._do_test_unhandled_exception(_test_extension_cpp.test_exception_throw_std) + + @unittest.skipIf(WIN, "XXX: This does not crash on Windows") + # Meaning the exception is getting lost somewhere... + def test_unhandled_std_exception_as_greenlet_function_aborts(self): + # verify that plain unhandled throw aborts + output = self._do_test_unhandled_exception('run_as_greenlet_target') + self.assertIn( + 'greenlet: Unhandled C++ exception: Thrown from an extension.', + output + ) + + def test_unhandled_exception_in_greenlet_aborts(self): + # verify that unhandled throw called in greenlet aborts too + self._do_test_unhandled_exception('run_unhandled_exception_in_greenlet_aborts') + + +if __name__ == '__main__': + unittest.main() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_extension_interface.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_extension_interface.py new file mode 100644 index 00000000..34b66567 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_extension_interface.py @@ -0,0 +1,115 @@ +from __future__ import print_function +from __future__ import absolute_import + +import sys + +import greenlet +from . import _test_extension +from . import TestCase + +# pylint:disable=c-extension-no-member + +class CAPITests(TestCase): + def test_switch(self): + self.assertEqual( + 50, _test_extension.test_switch(greenlet.greenlet(lambda: 50))) + + def test_switch_kwargs(self): + def adder(x, y): + return x * y + g = greenlet.greenlet(adder) + self.assertEqual(6, _test_extension.test_switch_kwargs(g, x=3, y=2)) + + def test_setparent(self): + # pylint:disable=disallowed-name + def foo(): + def bar(): + greenlet.getcurrent().parent.switch() + + # This final switch should go back to the main greenlet, since + # the test_setparent() function in the C extension should have + # reparented this greenlet. + greenlet.getcurrent().parent.switch() + raise AssertionError("Should never have reached this code") + child = greenlet.greenlet(bar) + child.switch() + greenlet.getcurrent().parent.switch(child) + greenlet.getcurrent().parent.throw( + AssertionError("Should never reach this code")) + foo_child = greenlet.greenlet(foo).switch() + self.assertEqual(None, _test_extension.test_setparent(foo_child)) + + def test_getcurrent(self): + _test_extension.test_getcurrent() + + def test_new_greenlet(self): + self.assertEqual(-15, _test_extension.test_new_greenlet(lambda: -15)) + + def test_raise_greenlet_dead(self): + self.assertRaises( + greenlet.GreenletExit, _test_extension.test_raise_dead_greenlet) + + def test_raise_greenlet_error(self): + self.assertRaises( + greenlet.error, _test_extension.test_raise_greenlet_error) + + def test_throw(self): + seen = [] + + def foo(): # pylint:disable=disallowed-name + try: + greenlet.getcurrent().parent.switch() + except ValueError: + seen.append(sys.exc_info()[1]) + except greenlet.GreenletExit: + raise AssertionError + g = greenlet.greenlet(foo) + g.switch() + _test_extension.test_throw(g) + self.assertEqual(len(seen), 1) + self.assertTrue( + isinstance(seen[0], ValueError), + "ValueError was not raised in foo()") + self.assertEqual( + str(seen[0]), + 'take that sucka!', + "message doesn't match") + + def test_non_traceback_param(self): + with self.assertRaises(TypeError) as exc: + _test_extension.test_throw_exact( + greenlet.getcurrent(), + Exception, + Exception(), + self + ) + self.assertEqual(str(exc.exception), + "throw() third argument must be a traceback object") + + def test_instance_of_wrong_type(self): + with self.assertRaises(TypeError) as exc: + _test_extension.test_throw_exact( + greenlet.getcurrent(), + Exception(), + BaseException(), + None, + ) + + self.assertEqual(str(exc.exception), + "instance exception may not have a separate value") + + def test_not_throwable(self): + with self.assertRaises(TypeError) as exc: + _test_extension.test_throw_exact( + greenlet.getcurrent(), + "abc", + None, + None, + ) + self.assertEqual(str(exc.exception), + "exceptions must be classes, or instances, not str") + + +if __name__ == '__main__': + import unittest + unittest.main() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_gc.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_gc.py new file mode 100644 index 00000000..43927d45 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_gc.py @@ -0,0 +1,86 @@ +import gc + +import weakref + +import greenlet + + +from . import TestCase +from .leakcheck import fails_leakcheck +# These only work with greenlet gc support +# which is no longer optional. +assert greenlet.GREENLET_USE_GC + +class GCTests(TestCase): + def test_dead_circular_ref(self): + o = weakref.ref(greenlet.greenlet(greenlet.getcurrent).switch()) + gc.collect() + if o() is not None: + import sys + print("O IS NOT NONE.", sys.getrefcount(o())) + self.assertIsNone(o()) + self.assertFalse(gc.garbage, gc.garbage) + + def test_circular_greenlet(self): + class circular_greenlet(greenlet.greenlet): + pass + o = circular_greenlet() + o.self = o + o = weakref.ref(o) + gc.collect() + self.assertIsNone(o()) + self.assertFalse(gc.garbage, gc.garbage) + + def test_inactive_ref(self): + class inactive_greenlet(greenlet.greenlet): + def __init__(self): + greenlet.greenlet.__init__(self, run=self.run) + + def run(self): + pass + o = inactive_greenlet() + o = weakref.ref(o) + gc.collect() + self.assertIsNone(o()) + self.assertFalse(gc.garbage, gc.garbage) + + @fails_leakcheck + def test_finalizer_crash(self): + # This test is designed to crash when active greenlets + # are made garbage collectable, until the underlying + # problem is resolved. How does it work: + # - order of object creation is important + # - array is created first, so it is moved to unreachable first + # - we create a cycle between a greenlet and this array + # - we create an object that participates in gc, is only + # referenced by a greenlet, and would corrupt gc lists + # on destruction, the easiest is to use an object with + # a finalizer + # - because array is the first object in unreachable it is + # cleared first, which causes all references to greenlet + # to disappear and causes greenlet to be destroyed, but since + # it is still live it causes a switch during gc, which causes + # an object with finalizer to be destroyed, which causes stack + # corruption and then a crash + + class object_with_finalizer(object): + def __del__(self): + pass + array = [] + parent = greenlet.getcurrent() + def greenlet_body(): + greenlet.getcurrent().object = object_with_finalizer() + try: + parent.switch() + except greenlet.GreenletExit: + print("Got greenlet exit!") + finally: + del greenlet.getcurrent().object + g = greenlet.greenlet(greenlet_body) + g.array = array + array.append(g) + g.switch() + del array + del g + greenlet.getcurrent() + gc.collect() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_generator.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_generator.py new file mode 100644 index 00000000..ca4a644b --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_generator.py @@ -0,0 +1,59 @@ + +from greenlet import greenlet + +from . import TestCase + +class genlet(greenlet): + parent = None + def __init__(self, *args, **kwds): + self.args = args + self.kwds = kwds + + def run(self): + fn, = self.fn + fn(*self.args, **self.kwds) + + def __iter__(self): + return self + + def __next__(self): + self.parent = greenlet.getcurrent() + result = self.switch() + if self: + return result + + raise StopIteration + + next = __next__ + + +def Yield(value): + g = greenlet.getcurrent() + while not isinstance(g, genlet): + if g is None: + raise RuntimeError('yield outside a genlet') + g = g.parent + g.parent.switch(value) + + +def generator(func): + class Generator(genlet): + fn = (func,) + return Generator + +# ____________________________________________________________ + + +class GeneratorTests(TestCase): + def test_generator(self): + seen = [] + + def g(n): + for i in range(n): + seen.append(i) + Yield(i) + g = generator(g) + for _ in range(3): + for j in g(5): + seen.append(j) + self.assertEqual(seen, 3 * [0, 0, 1, 1, 2, 2, 3, 3, 4, 4]) diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_generator_nested.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_generator_nested.py new file mode 100644 index 00000000..0c5d7466 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_generator_nested.py @@ -0,0 +1,168 @@ + +from greenlet import greenlet +from . import TestCase +from .leakcheck import fails_leakcheck + +class genlet(greenlet): + parent = None + def __init__(self, *args, **kwds): + self.args = args + self.kwds = kwds + self.child = None + + def run(self): + # Note the function is packed in a tuple + # to avoid creating a bound method for it. + fn, = self.fn + fn(*self.args, **self.kwds) + + def __iter__(self): + return self + + def set_child(self, child): + self.child = child + + def __next__(self): + if self.child: + child = self.child + while child.child: + tmp = child + child = child.child + tmp.child = None + + result = child.switch() + else: + self.parent = greenlet.getcurrent() + result = self.switch() + + if self: + return result + + raise StopIteration + + next = __next__ + +def Yield(value, level=1): + g = greenlet.getcurrent() + + while level != 0: + if not isinstance(g, genlet): + raise RuntimeError('yield outside a genlet') + if level > 1: + g.parent.set_child(g) + g = g.parent + level -= 1 + + g.switch(value) + + +def Genlet(func): + class TheGenlet(genlet): + fn = (func,) + return TheGenlet + +# ____________________________________________________________ + + +def g1(n, seen): + for i in range(n): + seen.append(i + 1) + yield i + + +def g2(n, seen): + for i in range(n): + seen.append(i + 1) + Yield(i) + +g2 = Genlet(g2) + + +def nested(i): + Yield(i) + + +def g3(n, seen): + for i in range(n): + seen.append(i + 1) + nested(i) +g3 = Genlet(g3) + + +def a(n): + if n == 0: + return + for ii in ax(n - 1): + Yield(ii) + Yield(n) +ax = Genlet(a) + + +def perms(l): + if len(l) > 1: + for e in l: + # No syntactical sugar for generator expressions + x = [Yield([e] + p) for p in perms([x for x in l if x != e])] + assert x + else: + Yield(l) +perms = Genlet(perms) + + +def gr1(n): + for ii in range(1, n): + Yield(ii) + Yield(ii * ii, 2) + +gr1 = Genlet(gr1) + + +def gr2(n, seen): + for ii in gr1(n): + seen.append(ii) + +gr2 = Genlet(gr2) + + +class NestedGeneratorTests(TestCase): + def test_layered_genlets(self): + seen = [] + for ii in gr2(5, seen): + seen.append(ii) + self.assertEqual(seen, [1, 1, 2, 4, 3, 9, 4, 16]) + + @fails_leakcheck + def test_permutations(self): + gen_perms = perms(list(range(4))) + permutations = list(gen_perms) + self.assertEqual(len(permutations), 4 * 3 * 2 * 1) + self.assertIn([0, 1, 2, 3], permutations) + self.assertIn([3, 2, 1, 0], permutations) + res = [] + for ii in zip(perms(list(range(4))), perms(list(range(3)))): + res.append(ii) + self.assertEqual( + res, + [([0, 1, 2, 3], [0, 1, 2]), ([0, 1, 3, 2], [0, 2, 1]), + ([0, 2, 1, 3], [1, 0, 2]), ([0, 2, 3, 1], [1, 2, 0]), + ([0, 3, 1, 2], [2, 0, 1]), ([0, 3, 2, 1], [2, 1, 0])]) + # XXX Test to make sure we are working as a generator expression + + def test_genlet_simple(self): + for g in [g1, g2, g3]: + seen = [] + for _ in range(3): + for j in g(5, seen): + seen.append(j) + self.assertEqual(seen, 3 * [1, 0, 2, 1, 3, 2, 4, 3, 5, 4]) + + def test_genlet_bad(self): + try: + Yield(10) + except RuntimeError: + pass + + def test_nested_genlets(self): + seen = [] + for ii in ax(5): + seen.append(ii) diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_greenlet.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_greenlet.py new file mode 100644 index 00000000..0adcc1ee --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_greenlet.py @@ -0,0 +1,1252 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import gc +import sys +import time +import threading + +from abc import ABCMeta, abstractmethod + +import greenlet +from greenlet import greenlet as RawGreenlet +from . import TestCase +from .leakcheck import fails_leakcheck + + +# We manually manage locks in many tests +# pylint:disable=consider-using-with +# pylint:disable=too-many-public-methods + +class SomeError(Exception): + pass + + +def fmain(seen): + try: + greenlet.getcurrent().parent.switch() + except: + seen.append(sys.exc_info()[0]) + raise + raise SomeError + + +def send_exception(g, exc): + # note: send_exception(g, exc) can be now done with g.throw(exc). + # the purpose of this test is to explicitly check the propagation rules. + def crasher(exc): + raise exc + g1 = RawGreenlet(crasher, parent=g) + g1.switch(exc) + + +class TestGreenlet(TestCase): + + def _do_simple_test(self): + lst = [] + + def f(): + lst.append(1) + greenlet.getcurrent().parent.switch() + lst.append(3) + g = RawGreenlet(f) + lst.append(0) + g.switch() + lst.append(2) + g.switch() + lst.append(4) + self.assertEqual(lst, list(range(5))) + + def test_simple(self): + self._do_simple_test() + + def test_switch_no_run_raises_AttributeError(self): + g = RawGreenlet() + with self.assertRaises(AttributeError) as exc: + g.switch() + + self.assertIn("run", str(exc.exception)) + + def test_throw_no_run_raises_AttributeError(self): + g = RawGreenlet() + with self.assertRaises(AttributeError) as exc: + g.throw(SomeError) + + self.assertIn("run", str(exc.exception)) + + def test_parent_equals_None(self): + g = RawGreenlet(parent=None) + self.assertIsNotNone(g) + self.assertIs(g.parent, greenlet.getcurrent()) + + def test_run_equals_None(self): + g = RawGreenlet(run=None) + self.assertIsNotNone(g) + self.assertIsNone(g.run) + + def test_two_children(self): + lst = [] + + def f(): + lst.append(1) + greenlet.getcurrent().parent.switch() + lst.extend([1, 1]) + g = RawGreenlet(f) + h = RawGreenlet(f) + g.switch() + self.assertEqual(len(lst), 1) + h.switch() + self.assertEqual(len(lst), 2) + h.switch() + self.assertEqual(len(lst), 4) + self.assertEqual(h.dead, True) + g.switch() + self.assertEqual(len(lst), 6) + self.assertEqual(g.dead, True) + + def test_two_recursive_children(self): + lst = [] + + def f(): + lst.append('b') + greenlet.getcurrent().parent.switch() + + def g(): + lst.append('a') + g = RawGreenlet(f) + g.switch() + lst.append('c') + + g = RawGreenlet(g) + self.assertEqual(sys.getrefcount(g), 2) + g.switch() + self.assertEqual(lst, ['a', 'b', 'c']) + # Just the one in this frame, plus the one on the stack we pass to the function + self.assertEqual(sys.getrefcount(g), 2) + + def test_threads(self): + success = [] + + def f(): + self._do_simple_test() + success.append(True) + ths = [threading.Thread(target=f) for i in range(10)] + for th in ths: + th.start() + for th in ths: + th.join(10) + self.assertEqual(len(success), len(ths)) + + def test_exception(self): + seen = [] + g1 = RawGreenlet(fmain) + g2 = RawGreenlet(fmain) + g1.switch(seen) + g2.switch(seen) + g2.parent = g1 + + self.assertEqual(seen, []) + #with self.assertRaises(SomeError): + # p("***Switching back") + # g2.switch() + # Creating this as a bound method can reveal bugs that + # are hidden on newer versions of Python that avoid creating + # bound methods for direct expressions; IOW, don't use the `with` + # form! + self.assertRaises(SomeError, g2.switch) + self.assertEqual(seen, [SomeError]) + + value = g2.switch() + self.assertEqual(value, ()) + self.assertEqual(seen, [SomeError]) + + value = g2.switch(25) + self.assertEqual(value, 25) + self.assertEqual(seen, [SomeError]) + + + def test_send_exception(self): + seen = [] + g1 = RawGreenlet(fmain) + g1.switch(seen) + self.assertRaises(KeyError, send_exception, g1, KeyError) + self.assertEqual(seen, [KeyError]) + + def test_dealloc(self): + seen = [] + g1 = RawGreenlet(fmain) + g2 = RawGreenlet(fmain) + g1.switch(seen) + g2.switch(seen) + self.assertEqual(seen, []) + del g1 + gc.collect() + self.assertEqual(seen, [greenlet.GreenletExit]) + del g2 + gc.collect() + self.assertEqual(seen, [greenlet.GreenletExit, greenlet.GreenletExit]) + + def test_dealloc_catches_GreenletExit_throws_other(self): + def run(): + try: + greenlet.getcurrent().parent.switch() + except greenlet.GreenletExit: + raise SomeError from None + + g = RawGreenlet(run) + g.switch() + # Destroying the only reference to the greenlet causes it + # to get GreenletExit; when it in turn raises, even though we're the parent + # we don't get the exception, it just gets printed. + # When we run on 3.8 only, we can use sys.unraisablehook + oldstderr = sys.stderr + try: + from cStringIO import StringIO + except ImportError: + from io import StringIO + stderr = sys.stderr = StringIO() + try: + del g + finally: + sys.stderr = oldstderr + + v = stderr.getvalue() + self.assertIn("Exception", v) + self.assertIn('ignored', v) + self.assertIn("SomeError", v) + + + def test_dealloc_other_thread(self): + seen = [] + someref = [] + + bg_glet_created_running_and_no_longer_ref_in_bg = threading.Event() + fg_ref_released = threading.Event() + bg_should_be_clear = threading.Event() + ok_to_exit_bg_thread = threading.Event() + + def f(): + g1 = RawGreenlet(fmain) + g1.switch(seen) + someref.append(g1) + del g1 + gc.collect() + + bg_glet_created_running_and_no_longer_ref_in_bg.set() + fg_ref_released.wait(3) + + RawGreenlet() # trigger release + bg_should_be_clear.set() + ok_to_exit_bg_thread.wait(3) + RawGreenlet() # One more time + + t = threading.Thread(target=f) + t.start() + bg_glet_created_running_and_no_longer_ref_in_bg.wait(10) + + self.assertEqual(seen, []) + self.assertEqual(len(someref), 1) + del someref[:] + gc.collect() + # g1 is not released immediately because it's from another thread + self.assertEqual(seen, []) + fg_ref_released.set() + bg_should_be_clear.wait(3) + try: + self.assertEqual(seen, [greenlet.GreenletExit]) + finally: + ok_to_exit_bg_thread.set() + t.join(10) + del seen[:] + del someref[:] + + def test_frame(self): + def f1(): + f = sys._getframe(0) # pylint:disable=protected-access + self.assertEqual(f.f_back, None) + greenlet.getcurrent().parent.switch(f) + return "meaning of life" + g = RawGreenlet(f1) + frame = g.switch() + self.assertTrue(frame is g.gr_frame) + self.assertTrue(g) + + from_g = g.switch() + self.assertFalse(g) + self.assertEqual(from_g, 'meaning of life') + self.assertEqual(g.gr_frame, None) + + def test_thread_bug(self): + def runner(x): + g = RawGreenlet(lambda: time.sleep(x)) + g.switch() + t1 = threading.Thread(target=runner, args=(0.2,)) + t2 = threading.Thread(target=runner, args=(0.3,)) + t1.start() + t2.start() + t1.join(10) + t2.join(10) + + def test_switch_kwargs(self): + def run(a, b): + self.assertEqual(a, 4) + self.assertEqual(b, 2) + return 42 + x = RawGreenlet(run).switch(a=4, b=2) + self.assertEqual(x, 42) + + def test_switch_kwargs_to_parent(self): + def run(x): + greenlet.getcurrent().parent.switch(x=x) + greenlet.getcurrent().parent.switch(2, x=3) + return x, x ** 2 + g = RawGreenlet(run) + self.assertEqual({'x': 3}, g.switch(3)) + self.assertEqual(((2,), {'x': 3}), g.switch()) + self.assertEqual((3, 9), g.switch()) + + def test_switch_to_another_thread(self): + data = {} + created_event = threading.Event() + done_event = threading.Event() + + def run(): + data['g'] = RawGreenlet(lambda: None) + created_event.set() + done_event.wait(10) + thread = threading.Thread(target=run) + thread.start() + created_event.wait(10) + with self.assertRaises(greenlet.error): + data['g'].switch() + done_event.set() + thread.join(10) + # XXX: Should handle this automatically + data.clear() + + def test_exc_state(self): + def f(): + try: + raise ValueError('fun') + except: # pylint:disable=bare-except + exc_info = sys.exc_info() + RawGreenlet(h).switch() + self.assertEqual(exc_info, sys.exc_info()) + + def h(): + self.assertEqual(sys.exc_info(), (None, None, None)) + + RawGreenlet(f).switch() + + def test_instance_dict(self): + def f(): + greenlet.getcurrent().test = 42 + def deldict(g): + del g.__dict__ + def setdict(g, value): + g.__dict__ = value + g = RawGreenlet(f) + self.assertEqual(g.__dict__, {}) + g.switch() + self.assertEqual(g.test, 42) + self.assertEqual(g.__dict__, {'test': 42}) + g.__dict__ = g.__dict__ + self.assertEqual(g.__dict__, {'test': 42}) + self.assertRaises(TypeError, deldict, g) + self.assertRaises(TypeError, setdict, g, 42) + + def test_running_greenlet_has_no_run(self): + has_run = [] + def func(): + has_run.append( + hasattr(greenlet.getcurrent(), 'run') + ) + + g = RawGreenlet(func) + g.switch() + self.assertEqual(has_run, [False]) + + def test_deepcopy(self): + import copy + self.assertRaises(TypeError, copy.copy, RawGreenlet()) + self.assertRaises(TypeError, copy.deepcopy, RawGreenlet()) + + def test_parent_restored_on_kill(self): + hub = RawGreenlet(lambda: None) + main = greenlet.getcurrent() + result = [] + def worker(): + try: + # Wait to be killed by going back to the test. + main.switch() + except greenlet.GreenletExit: + # Resurrect and switch to parent + result.append(greenlet.getcurrent().parent) + result.append(greenlet.getcurrent()) + hub.switch() + g = RawGreenlet(worker, parent=hub) + g.switch() + # delete the only reference, thereby raising GreenletExit + del g + self.assertTrue(result) + self.assertIs(result[0], main) + self.assertIs(result[1].parent, hub) + # Delete them, thereby breaking the cycle between the greenlet + # and the frame, which otherwise would never be collectable + # XXX: We should be able to automatically fix this. + del result[:] + hub = None + main = None + + def test_parent_return_failure(self): + # No run causes AttributeError on switch + g1 = RawGreenlet() + # Greenlet that implicitly switches to parent + g2 = RawGreenlet(lambda: None, parent=g1) + # AttributeError should propagate to us, no fatal errors + with self.assertRaises(AttributeError): + g2.switch() + + def test_throw_exception_not_lost(self): + class mygreenlet(RawGreenlet): + def __getattribute__(self, name): + try: + raise Exception() + except: # pylint:disable=bare-except + pass + return RawGreenlet.__getattribute__(self, name) + g = mygreenlet(lambda: None) + self.assertRaises(SomeError, g.throw, SomeError()) + + @fails_leakcheck + def _do_test_throw_to_dead_thread_doesnt_crash(self, wait_for_cleanup=False): + result = [] + def worker(): + greenlet.getcurrent().parent.switch() + + def creator(): + g = RawGreenlet(worker) + g.switch() + result.append(g) + if wait_for_cleanup: + # Let this greenlet eventually be cleaned up. + g.switch() + greenlet.getcurrent() + t = threading.Thread(target=creator) + t.start() + t.join(10) + del t + # But, depending on the operating system, the thread + # deallocator may not actually have run yet! So we can't be + # sure about the error message unless we wait. + if wait_for_cleanup: + self.wait_for_pending_cleanups() + with self.assertRaises(greenlet.error) as exc: + result[0].throw(SomeError) + + if not wait_for_cleanup: + self.assertIn( + str(exc.exception), [ + "cannot switch to a different thread (which happens to have exited)", + "cannot switch to a different thread" + ] + ) + else: + self.assertEqual( + str(exc.exception), + "cannot switch to a different thread (which happens to have exited)", + ) + + if hasattr(result[0].gr_frame, 'clear'): + # The frame is actually executing (it thinks), we can't clear it. + with self.assertRaises(RuntimeError): + result[0].gr_frame.clear() + # Unfortunately, this doesn't actually clear the references, they're in the + # fast local array. + if not wait_for_cleanup: + result[0].gr_frame.f_locals.clear() + else: + self.assertIsNone(result[0].gr_frame) + + del creator + worker = None + del result[:] + # XXX: we ought to be able to automatically fix this. + # See issue 252 + self.expect_greenlet_leak = True # direct us not to wait for it to go away + + @fails_leakcheck + def test_throw_to_dead_thread_doesnt_crash(self): + self._do_test_throw_to_dead_thread_doesnt_crash() + + def test_throw_to_dead_thread_doesnt_crash_wait(self): + self._do_test_throw_to_dead_thread_doesnt_crash(True) + + @fails_leakcheck + def test_recursive_startup(self): + class convoluted(RawGreenlet): + def __init__(self): + RawGreenlet.__init__(self) + self.count = 0 + def __getattribute__(self, name): + if name == 'run' and self.count == 0: + self.count = 1 + self.switch(43) + return RawGreenlet.__getattribute__(self, name) + def run(self, value): + while True: + self.parent.switch(value) + g = convoluted() + self.assertEqual(g.switch(42), 43) + # Exits the running greenlet, otherwise it leaks + # XXX: We should be able to automatically fix this + #g.throw(greenlet.GreenletExit) + #del g + self.expect_greenlet_leak = True + + def test_threaded_updatecurrent(self): + # released when main thread should execute + lock1 = threading.Lock() + lock1.acquire() + # released when another thread should execute + lock2 = threading.Lock() + lock2.acquire() + class finalized(object): + def __del__(self): + # happens while in green_updatecurrent() in main greenlet + # should be very careful not to accidentally call it again + # at the same time we must make sure another thread executes + lock2.release() + lock1.acquire() + # now ts_current belongs to another thread + def deallocator(): + greenlet.getcurrent().parent.switch() + def fthread(): + lock2.acquire() + greenlet.getcurrent() + del g[0] + lock1.release() + lock2.acquire() + greenlet.getcurrent() + lock1.release() + main = greenlet.getcurrent() + g = [RawGreenlet(deallocator)] + g[0].bomb = finalized() + g[0].switch() + t = threading.Thread(target=fthread) + t.start() + # let another thread grab ts_current and deallocate g[0] + lock2.release() + lock1.acquire() + # this is the corner stone + # getcurrent() will notice that ts_current belongs to another thread + # and start the update process, which would notice that g[0] should + # be deallocated, and that will execute an object's finalizer. Now, + # that object will let another thread run so it can grab ts_current + # again, which would likely crash the interpreter if there's no + # check for this case at the end of green_updatecurrent(). This test + # passes if getcurrent() returns correct result, but it's likely + # to randomly crash if it's not anyway. + self.assertEqual(greenlet.getcurrent(), main) + # wait for another thread to complete, just in case + t.join(10) + + def test_dealloc_switch_args_not_lost(self): + seen = [] + def worker(): + # wait for the value + value = greenlet.getcurrent().parent.switch() + # delete all references to ourself + del worker[0] + initiator.parent = greenlet.getcurrent().parent + # switch to main with the value, but because + # ts_current is the last reference to us we + # return here immediately, where we resurrect ourself. + try: + greenlet.getcurrent().parent.switch(value) + finally: + seen.append(greenlet.getcurrent()) + def initiator(): + return 42 # implicitly falls thru to parent + + worker = [RawGreenlet(worker)] + + worker[0].switch() # prime worker + initiator = RawGreenlet(initiator, worker[0]) + value = initiator.switch() + self.assertTrue(seen) + self.assertEqual(value, 42) + + def test_tuple_subclass(self): + # The point of this test is to see what happens when a custom + # tuple subclass is used as an object passed directly to the C + # function ``green_switch``; part of ``green_switch`` checks + # the ``len()`` of the ``args`` tuple, and that can call back + # into Python. Here, when it calls back into Python, we + # recursively enter ``green_switch`` again. + + # This test is really only relevant on Python 2. The builtin + # `apply` function directly passes the given args tuple object + # to the underlying function, whereas the Python 3 version + # unpacks and repacks into an actual tuple. This could still + # happen using the C API on Python 3 though. We should write a + # builtin version of apply() ourself. + def _apply(func, a, k): + func(*a, **k) + + class mytuple(tuple): + def __len__(self): + greenlet.getcurrent().switch() + return tuple.__len__(self) + args = mytuple() + kwargs = dict(a=42) + def switchapply(): + _apply(greenlet.getcurrent().parent.switch, args, kwargs) + g = RawGreenlet(switchapply) + self.assertEqual(g.switch(), kwargs) + + def test_abstract_subclasses(self): + AbstractSubclass = ABCMeta( + 'AbstractSubclass', + (RawGreenlet,), + {'run': abstractmethod(lambda self: None)}) + + class BadSubclass(AbstractSubclass): + pass + + class GoodSubclass(AbstractSubclass): + def run(self): + pass + + GoodSubclass() # should not raise + self.assertRaises(TypeError, BadSubclass) + + def test_implicit_parent_with_threads(self): + if not gc.isenabled(): + return # cannot test with disabled gc + N = gc.get_threshold()[0] + if N < 50: + return # cannot test with such a small N + def attempt(): + lock1 = threading.Lock() + lock1.acquire() + lock2 = threading.Lock() + lock2.acquire() + recycled = [False] + def another_thread(): + lock1.acquire() # wait for gc + greenlet.getcurrent() # update ts_current + lock2.release() # release gc + t = threading.Thread(target=another_thread) + t.start() + class gc_callback(object): + def __del__(self): + lock1.release() + lock2.acquire() + recycled[0] = True + class garbage(object): + def __init__(self): + self.cycle = self + self.callback = gc_callback() + l = [] + x = range(N*2) + current = greenlet.getcurrent() + g = garbage() + for _ in x: + g = None # lose reference to garbage + if recycled[0]: + # gc callback called prematurely + t.join(10) + return False + last = RawGreenlet() + if recycled[0]: + break # yes! gc called in green_new + l.append(last) # increase allocation counter + else: + # gc callback not called when expected + gc.collect() + if recycled[0]: + t.join(10) + return False + self.assertEqual(last.parent, current) + for g in l: + self.assertEqual(g.parent, current) + return True + for _ in range(5): + if attempt(): + break + + def test_issue_245_reference_counting_subclass_no_threads(self): + # https://github.com/python-greenlet/greenlet/issues/245 + # Before the fix, this crashed pretty reliably on + # Python 3.10, at least on macOS; but much less reliably on other + # interpreters (memory layout must have changed). + # The threaded test crashed more reliably on more interpreters. + from greenlet import getcurrent + from greenlet import GreenletExit + + class Greenlet(RawGreenlet): + pass + + initial_refs = sys.getrefcount(Greenlet) + # This has to be an instance variable because + # Python 2 raises a SyntaxError if we delete a local + # variable referenced in an inner scope. + self.glets = [] # pylint:disable=attribute-defined-outside-init + + def greenlet_main(): + try: + getcurrent().parent.switch() + except GreenletExit: + self.glets.append(getcurrent()) + + # Before the + for _ in range(10): + Greenlet(greenlet_main).switch() + + del self.glets + self.assertEqual(sys.getrefcount(Greenlet), initial_refs) + + def test_issue_245_reference_counting_subclass_threads(self): + # https://github.com/python-greenlet/greenlet/issues/245 + from threading import Thread + from threading import Event + + from greenlet import getcurrent + + class MyGreenlet(RawGreenlet): + pass + + glets = [] + ref_cleared = Event() + + def greenlet_main(): + getcurrent().parent.switch() + + def thread_main(greenlet_running_event): + mine = MyGreenlet(greenlet_main) + glets.append(mine) + # The greenlets being deleted must be active + mine.switch() + # Don't keep any reference to it in this thread + del mine + # Let main know we published our greenlet. + greenlet_running_event.set() + # Wait for main to let us know the references are + # gone and the greenlet objects no longer reachable + ref_cleared.wait(10) + # The creating thread must call getcurrent() (or a few other + # greenlet APIs) because that's when the thread-local list of dead + # greenlets gets cleared. + getcurrent() + + # We start with 3 references to the subclass: + # - This module + # - Its __mro__ + # - The __subclassess__ attribute of greenlet + # - (If we call gc.get_referents(), we find four entries, including + # some other tuple ``(greenlet)`` that I'm not sure about but must be part + # of the machinery.) + # + # On Python 3.10 it's often enough to just run 3 threads; on Python 2.7, + # more threads are needed, and the results are still + # non-deterministic. Presumably the memory layouts are different + initial_refs = sys.getrefcount(MyGreenlet) + thread_ready_events = [] + for _ in range( + initial_refs + 45 + ): + event = Event() + thread = Thread(target=thread_main, args=(event,)) + thread_ready_events.append(event) + thread.start() + + + for done_event in thread_ready_events: + done_event.wait(10) + + + del glets[:] + ref_cleared.set() + # Let any other thread run; it will crash the interpreter + # if not fixed (or silently corrupt memory and we possibly crash + # later). + self.wait_for_pending_cleanups() + self.assertEqual(sys.getrefcount(MyGreenlet), initial_refs) + + def test_falling_off_end_switches_to_unstarted_parent_raises_error(self): + def no_args(): + return 13 + + parent_never_started = RawGreenlet(no_args) + + def leaf(): + return 42 + + child = RawGreenlet(leaf, parent_never_started) + + # Because the run function takes to arguments + with self.assertRaises(TypeError): + child.switch() + + def test_falling_off_end_switches_to_unstarted_parent_works(self): + def one_arg(x): + return (x, 24) + + parent_never_started = RawGreenlet(one_arg) + + def leaf(): + return 42 + + child = RawGreenlet(leaf, parent_never_started) + + result = child.switch() + self.assertEqual(result, (42, 24)) + + def test_switch_to_dead_greenlet_with_unstarted_perverse_parent(self): + class Parent(RawGreenlet): + def __getattribute__(self, name): + if name == 'run': + raise SomeError + + + parent_never_started = Parent() + seen = [] + child = RawGreenlet(lambda: seen.append(42), parent_never_started) + # Because we automatically start the parent when the child is + # finished + with self.assertRaises(SomeError): + child.switch() + + self.assertEqual(seen, [42]) + + with self.assertRaises(SomeError): + child.switch() + self.assertEqual(seen, [42]) + + def test_switch_to_dead_greenlet_reparent(self): + seen = [] + parent_never_started = RawGreenlet(lambda: seen.append(24)) + child = RawGreenlet(lambda: seen.append(42)) + + child.switch() + self.assertEqual(seen, [42]) + + child.parent = parent_never_started + # This actually is the same as switching to the parent. + result = child.switch() + self.assertIsNone(result) + self.assertEqual(seen, [42, 24]) + + def test_can_access_f_back_of_suspended_greenlet(self): + # On Python 3.12, they added a ->previous field to + # _PyInterpreterFrame that has to be cleared when a frame is inactive. + # If we got that wrong, this immediately crashes. + main = greenlet.getcurrent() + + def Hub(): + main.switch() + + hub = RawGreenlet(Hub) + # start it + hub.switch() + # now it is suspended + self.assertIsNotNone(hub.gr_frame) + # The next line is what would crash + self.assertIsNone(hub.gr_frame.f_back) + + + + +class TestGreenletSetParentErrors(TestCase): + def test_threaded_reparent(self): + data = {} + created_event = threading.Event() + done_event = threading.Event() + + def run(): + data['g'] = RawGreenlet(lambda: None) + created_event.set() + done_event.wait(10) + + def blank(): + greenlet.getcurrent().parent.switch() + + thread = threading.Thread(target=run) + thread.start() + created_event.wait(10) + g = RawGreenlet(blank) + g.switch() + with self.assertRaises(ValueError) as exc: + g.parent = data['g'] + done_event.set() + thread.join(10) + + self.assertEqual(str(exc.exception), "parent cannot be on a different thread") + + def test_unexpected_reparenting(self): + another = [] + def worker(): + g = RawGreenlet(lambda: None) + another.append(g) + g.switch() + t = threading.Thread(target=worker) + t.start() + t.join(10) + # The first time we switch (running g_initialstub(), which is + # when we look up the run attribute) we attempt to change the + # parent to one from another thread (which also happens to be + # dead). ``g_initialstub()`` should detect this and raise a + # greenlet error. + # + # EXCEPT: With the fix for #252, this is actually detected + # sooner, when setting the parent itself. Prior to that fix, + # the main greenlet from the background thread kept a valid + # value for ``run_info``, and appeared to be a valid parent + # until we actually started the greenlet. But now that it's + # cleared, this test is catching whether ``green_setparent`` + # can detect the dead thread. + # + # Further refactoring once again changes this back to a greenlet.error + # + # We need to wait for the cleanup to happen, but we're + # deliberately leaking a main greenlet here. + self.wait_for_pending_cleanups(initial_main_greenlets=self.main_greenlets_before_test + 1) + + class convoluted(RawGreenlet): + def __getattribute__(self, name): + if name == 'run': + self.parent = another[0] # pylint:disable=attribute-defined-outside-init + return RawGreenlet.__getattribute__(self, name) + g = convoluted(lambda: None) + with self.assertRaises(greenlet.error) as exc: + g.switch() + self.assertEqual(str(exc.exception), + "cannot switch to a different thread (which happens to have exited)") + del another[:] + + def test_unexpected_reparenting_thread_running(self): + # Like ``test_unexpected_reparenting``, except the background thread is + # actually still alive. + another = [] + switched_to_greenlet = threading.Event() + keep_main_alive = threading.Event() + def worker(): + g = RawGreenlet(lambda: None) + another.append(g) + g.switch() + switched_to_greenlet.set() + keep_main_alive.wait(10) + class convoluted(RawGreenlet): + def __getattribute__(self, name): + if name == 'run': + self.parent = another[0] # pylint:disable=attribute-defined-outside-init + return RawGreenlet.__getattribute__(self, name) + + t = threading.Thread(target=worker) + t.start() + + switched_to_greenlet.wait(10) + try: + g = convoluted(lambda: None) + + with self.assertRaises(greenlet.error) as exc: + g.switch() + self.assertEqual(str(exc.exception), "cannot switch to a different thread") + finally: + keep_main_alive.set() + t.join(10) + # XXX: Should handle this automatically. + del another[:] + + def test_cannot_delete_parent(self): + worker = RawGreenlet(lambda: None) + self.assertIs(worker.parent, greenlet.getcurrent()) + + with self.assertRaises(AttributeError) as exc: + del worker.parent + self.assertEqual(str(exc.exception), "can't delete attribute") + + def test_cannot_delete_parent_of_main(self): + with self.assertRaises(AttributeError) as exc: + del greenlet.getcurrent().parent + self.assertEqual(str(exc.exception), "can't delete attribute") + + + def test_main_greenlet_parent_is_none(self): + # assuming we're in a main greenlet here. + self.assertIsNone(greenlet.getcurrent().parent) + + def test_set_parent_wrong_types(self): + def bg(): + # Go back to main. + greenlet.getcurrent().parent.switch() + + def check(glet): + for p in None, 1, self, "42": + with self.assertRaises(TypeError) as exc: + glet.parent = p + + self.assertEqual( + str(exc.exception), + "GreenletChecker: Expected any type of greenlet, not " + type(p).__name__) + + # First, not running + g = RawGreenlet(bg) + self.assertFalse(g) + check(g) + + # Then when running. + g.switch() + self.assertTrue(g) + check(g) + + # Let it finish + g.switch() + + + def test_trivial_cycle(self): + glet = RawGreenlet(lambda: None) + with self.assertRaises(ValueError) as exc: + glet.parent = glet + self.assertEqual(str(exc.exception), "cyclic parent chain") + + def test_trivial_cycle_main(self): + # This used to produce a ValueError, but we catch it earlier than that now. + with self.assertRaises(AttributeError) as exc: + greenlet.getcurrent().parent = greenlet.getcurrent() + self.assertEqual(str(exc.exception), "cannot set the parent of a main greenlet") + + def test_deeper_cycle(self): + g1 = RawGreenlet(lambda: None) + g2 = RawGreenlet(lambda: None) + g3 = RawGreenlet(lambda: None) + + g1.parent = g2 + g2.parent = g3 + with self.assertRaises(ValueError) as exc: + g3.parent = g1 + self.assertEqual(str(exc.exception), "cyclic parent chain") + + +class TestRepr(TestCase): + + def assertEndsWith(self, got, suffix): + self.assertTrue(got.endswith(suffix), (got, suffix)) + + def test_main_while_running(self): + r = repr(greenlet.getcurrent()) + self.assertEndsWith(r, " current active started main>") + + def test_main_in_background(self): + main = greenlet.getcurrent() + def run(): + return repr(main) + + g = RawGreenlet(run) + r = g.switch() + self.assertEndsWith(r, ' suspended active started main>') + + def test_initial(self): + r = repr(RawGreenlet()) + self.assertEndsWith(r, ' pending>') + + def test_main_from_other_thread(self): + main = greenlet.getcurrent() + + class T(threading.Thread): + original_main = thread_main = None + main_glet = None + def run(self): + self.original_main = repr(main) + self.main_glet = greenlet.getcurrent() + self.thread_main = repr(self.main_glet) + + t = T() + t.start() + t.join(10) + + self.assertEndsWith(t.original_main, ' suspended active started main>') + self.assertEndsWith(t.thread_main, ' current active started main>') + # give the machinery time to notice the death of the thread, + # and clean it up. Note that we don't use + # ``expect_greenlet_leak`` or wait_for_pending_cleanups, + # because at this point we know we have an extra greenlet + # still reachable. + for _ in range(3): + time.sleep(0.001) + + # In the past, main greenlets, even from dead threads, never + # really appear dead. We have fixed that, and we also report + # that the thread is dead in the repr. (Do this multiple times + # to make sure that we don't self-modify and forget our state + # in the C++ code). + for _ in range(3): + self.assertTrue(t.main_glet.dead) + r = repr(t.main_glet) + self.assertEndsWith(r, ' (thread exited) dead>') + + def test_dead(self): + g = RawGreenlet(lambda: None) + g.switch() + self.assertEndsWith(repr(g), ' dead>') + self.assertNotIn('suspended', repr(g)) + self.assertNotIn('started', repr(g)) + self.assertNotIn('active', repr(g)) + + def test_formatting_produces_native_str(self): + # https://github.com/python-greenlet/greenlet/issues/218 + # %s formatting on Python 2 was producing unicode, not str. + + g_dead = RawGreenlet(lambda: None) + g_not_started = RawGreenlet(lambda: None) + g_cur = greenlet.getcurrent() + + for g in g_dead, g_not_started, g_cur: + + self.assertIsInstance( + '%s' % (g,), + str + ) + self.assertIsInstance( + '%r' % (g,), + str, + ) + + +class TestMainGreenlet(TestCase): + # Tests some implementation details, and relies on some + # implementation details. + + def _check_current_is_main(self): + # implementation detail + assert 'main' in repr(greenlet.getcurrent()) + + t = type(greenlet.getcurrent()) + assert 'main' not in repr(t) + return t + + def test_main_greenlet_type_can_be_subclassed(self): + main_type = self._check_current_is_main() + subclass = type('subclass', (main_type,), {}) + self.assertIsNotNone(subclass) + + def test_main_greenlet_is_greenlet(self): + self._check_current_is_main() + self.assertIsInstance(greenlet.getcurrent(), RawGreenlet) + + + +class TestBrokenGreenlets(TestCase): + # Tests for things that used to, or still do, terminate the interpreter. + # This often means doing unsavory things. + + def test_failed_to_initialstub(self): + def func(): + raise AssertionError("Never get here") + + + g = greenlet._greenlet.UnswitchableGreenlet(func) + g.force_switch_error = True + + with self.assertRaisesRegex(SystemError, + "Failed to switch stacks into a greenlet for the first time."): + g.switch() + + def test_failed_to_switch_into_running(self): + runs = [] + def func(): + runs.append(1) + greenlet.getcurrent().parent.switch() + runs.append(2) + greenlet.getcurrent().parent.switch() + runs.append(3) # pragma: no cover + + g = greenlet._greenlet.UnswitchableGreenlet(func) + g.switch() + self.assertEqual(runs, [1]) + g.switch() + self.assertEqual(runs, [1, 2]) + g.force_switch_error = True + + with self.assertRaisesRegex(SystemError, + "Failed to switch stacks into a running greenlet."): + g.switch() + + # If we stopped here, we would fail the leakcheck, because we've left + # the ``inner_bootstrap()`` C frame and its descendents hanging around, + # which have a bunch of Python references. They'll never get cleaned up + # if we don't let the greenlet finish. + g.force_switch_error = False + g.switch() + self.assertEqual(runs, [1, 2, 3]) + + def test_failed_to_slp_switch_into_running(self): + ex = self.assertScriptRaises('fail_slp_switch.py') + + self.assertIn('fail_slp_switch is running', ex.output) + self.assertIn(ex.returncode, self.get_expected_returncodes_for_aborted_process()) + + def test_reentrant_switch_two_greenlets(self): + # Before we started capturing the arguments in g_switch_finish, this could crash. + output = self.run_script('fail_switch_two_greenlets.py') + self.assertIn('In g1_run', output) + self.assertIn('TRACE', output) + self.assertIn('LEAVE TRACE', output) + self.assertIn('Falling off end of main', output) + self.assertIn('Falling off end of g1_run', output) + self.assertIn('Falling off end of g2', output) + + def test_reentrant_switch_three_greenlets(self): + # On debug builds of greenlet, this used to crash with an assertion error; + # on non-debug versions, it ran fine (which it should not do!). + # Now it always crashes correctly with a TypeError + ex = self.assertScriptRaises('fail_switch_three_greenlets.py', exitcodes=(1,)) + + self.assertIn('TypeError', ex.output) + self.assertIn('positional arguments', ex.output) + + def test_reentrant_switch_three_greenlets2(self): + # This actually passed on debug and non-debug builds. It + # should probably have been triggering some debug assertions + # but it didn't. + # + # I think the fixes for the above test also kicked in here. + output = self.run_script('fail_switch_three_greenlets2.py') + self.assertIn( + "RESULTS: [('trace', 'switch'), " + "('trace', 'switch'), ('g2 arg', 'g2 from tracefunc'), " + "('trace', 'switch'), ('main g1', 'from g2_run'), ('trace', 'switch'), " + "('g1 arg', 'g1 from main'), ('trace', 'switch'), ('main g2', 'from g1_run'), " + "('trace', 'switch'), ('g1 from parent', 'g1 from main 2'), ('trace', 'switch'), " + "('main g1.2', 'g1 done'), ('trace', 'switch'), ('g2 from parent', ()), " + "('trace', 'switch'), ('main g2.2', 'g2 done')]", + output + ) + + def test_reentrant_switch_GreenletAlreadyStartedInPython(self): + output = self.run_script('fail_initialstub_already_started.py') + + self.assertIn( + "RESULTS: ['Begin C', 'Switch to b from B.__getattribute__ in C', " + "('Begin B', ()), '_B_run switching to main', ('main from c', 'From B'), " + "'B.__getattribute__ back from main in C', ('Begin A', (None,)), " + "('A dead?', True, 'B dead?', True, 'C dead?', False), " + "'C done', ('main from c.2', None)]", + output + ) + + def test_reentrant_switch_run_callable_has_del(self): + output = self.run_script('fail_clearing_run_switches.py') + self.assertIn( + "RESULTS [" + "('G.__getattribute__', 'run'), ('RunCallable', '__del__'), " + "('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')" + "]", + output + ) + +if __name__ == '__main__': + import unittest + unittest.main() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_greenlet_trash.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_greenlet_trash.py new file mode 100644 index 00000000..8d9716e9 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_greenlet_trash.py @@ -0,0 +1,178 @@ +# -*- coding: utf-8 -*- +""" +Tests for greenlets interacting with the CPython trash can API. + +The CPython trash can API is not designed to be re-entered from a +single thread. But this can happen using greenlets, if something +during the object deallocation process switches greenlets, and this second +greenlet then causes the trash can to get entered again. Here, we do this +very explicitly, but in other cases (like gevent) it could be arbitrarily more +complicated: for example, a weakref callback might try to acquire a lock that's +already held by another greenlet; that would allow a greenlet switch to occur. + +See https://github.com/gevent/gevent/issues/1909 + +This test is fragile and relies on details of the CPython +implementation (like most of the rest of this package): + + - We enter the trashcan and deferred deallocation after + ``_PyTrash_UNWIND_LEVEL`` calls. This constant, defined in + CPython's object.c, is generally 50. That's basically how many objects are required to + get us into the deferred deallocation situation. + + - The test fails by hitting an ``assert()`` in object.c; if the + build didn't enable assert, then we don't catch this. + + - If the test fails in that way, the interpreter crashes. +""" +from __future__ import print_function, absolute_import, division + +import unittest + +class TestTrashCanReEnter(unittest.TestCase): + + def test_it(self): + # Try several times to trigger it, because it isn't 100% + # reliable. + for _ in range(10): + self.check_it() + + def check_it(self): # pylint:disable=too-many-statements + import greenlet + from greenlet._greenlet import get_tstate_trash_delete_nesting # pylint:disable=no-name-in-module + + main = greenlet.getcurrent() + + assert get_tstate_trash_delete_nesting() == 0 + + # We expect to be in deferred deallocation after this many + # deallocations have occurred. TODO: I wish we had a better way to do + # this --- that was before get_tstate_trash_delete_nesting; perhaps + # we can use that API to do better? + TRASH_UNWIND_LEVEL = 50 + # How many objects to put in a container; it's the container that + # queues objects for deferred deallocation. + OBJECTS_PER_CONTAINER = 500 + + class Dealloc: # define the class here because we alter class variables each time we run. + """ + An object with a ``__del__`` method. When it starts getting deallocated + from a deferred trash can run, it switches greenlets, allocates more objects + which then also go in the trash can. If we don't save state appropriately, + nesting gets out of order and we can crash the interpreter. + """ + + #: Has our deallocation actually run and switched greenlets? + #: When it does, this will be set to the current greenlet. This should + #: be happening in the main greenlet, so we check that down below. + SPAWNED = False + + #: Has the background greenlet run? + BG_RAN = False + + BG_GLET = None + + #: How many of these things have ever been allocated. + CREATED = 0 + + #: How many of these things have ever been deallocated. + DESTROYED = 0 + + #: How many were destroyed not in the main greenlet. There should always + #: be some. + #: If the test is broken or things change in the trashcan implementation, + #: this may not be correct. + DESTROYED_BG = 0 + + def __init__(self, sequence_number): + """ + :param sequence_number: The ordinal of this object during + one particular creation run. This is used to detect (guess, really) + when we have entered the trash can's deferred deallocation. + """ + self.i = sequence_number + Dealloc.CREATED += 1 + + def __del__(self): + if self.i == TRASH_UNWIND_LEVEL and not self.SPAWNED: + Dealloc.SPAWNED = greenlet.getcurrent() + other = Dealloc.BG_GLET = greenlet.greenlet(background_greenlet) + x = other.switch() + assert x == 42 + # It's important that we don't switch back to the greenlet, + # we leave it hanging there in an incomplete state. But we don't let it + # get collected, either. If we complete it now, while we're still + # in the scope of the initial trash can, things work out and we + # don't see the problem. We need this greenlet to complete + # at some point in the future, after we've exited this trash can invocation. + del other + elif self.i == 40 and greenlet.getcurrent() is not main: + Dealloc.BG_RAN = True + try: + main.switch(42) + except greenlet.GreenletExit as ex: + # We expect this; all references to us go away + # while we're still running, and we need to finish deleting + # ourself. + Dealloc.BG_RAN = type(ex) + del ex + + # Record the fact that we're dead last of all. This ensures that + # we actually get returned too. + Dealloc.DESTROYED += 1 + if greenlet.getcurrent() is not main: + Dealloc.DESTROYED_BG += 1 + + + def background_greenlet(): + # We direct through a second function, instead of + # directly calling ``make_some()``, so that we have complete + # control over when these objects are destroyed: we need them + # to be destroyed in the context of the background greenlet + t = make_some() + del t # Triggere deletion. + + def make_some(): + t = () + i = OBJECTS_PER_CONTAINER + while i: + # Nest the tuples; it's the recursion that gets us + # into trash. + t = (Dealloc(i), t) + i -= 1 + return t + + + some = make_some() + self.assertEqual(Dealloc.CREATED, OBJECTS_PER_CONTAINER) + self.assertEqual(Dealloc.DESTROYED, 0) + + # If we're going to crash, it should be on the following line. + # We only crash if ``assert()`` is enabled, of course. + del some + + # For non-debug builds of CPython, we won't crash. The best we can do is check + # the nesting level explicitly. + self.assertEqual(0, get_tstate_trash_delete_nesting()) + + # Discard this, raising GreenletExit into where it is waiting. + Dealloc.BG_GLET = None + # The same nesting level maintains. + self.assertEqual(0, get_tstate_trash_delete_nesting()) + + # We definitely cleaned some up in the background + self.assertGreater(Dealloc.DESTROYED_BG, 0) + + # Make sure all the cleanups happened. + self.assertIs(Dealloc.SPAWNED, main) + self.assertTrue(Dealloc.BG_RAN) + self.assertEqual(Dealloc.BG_RAN, greenlet.GreenletExit) + self.assertEqual(Dealloc.CREATED, Dealloc.DESTROYED ) + self.assertEqual(Dealloc.CREATED, OBJECTS_PER_CONTAINER * 2) + + import gc + gc.collect() + + +if __name__ == '__main__': + unittest.main() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_leaks.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_leaks.py new file mode 100644 index 00000000..b398e8a3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_leaks.py @@ -0,0 +1,447 @@ +# -*- coding: utf-8 -*- +""" +Testing scenarios that may have leaked. +""" +from __future__ import print_function, absolute_import, division + +import sys +import gc + +import time +import weakref +import threading + +import psutil + +import greenlet +from . import TestCase +from .leakcheck import fails_leakcheck +from .leakcheck import ignores_leakcheck +from .leakcheck import RUNNING_ON_MANYLINUX + +try: + from sys import intern +except ImportError: + # Python 2 + pass + +assert greenlet.GREENLET_USE_GC # Option to disable this was removed in 1.0 + +class HasFinalizerTracksInstances(object): + EXTANT_INSTANCES = set() + def __init__(self, msg): + self.msg = intern(msg) + self.EXTANT_INSTANCES.add(id(self)) + def __del__(self): + self.EXTANT_INSTANCES.remove(id(self)) + def __repr__(self): + return "" % ( + id(self), self.msg + ) + @classmethod + def reset(cls): + cls.EXTANT_INSTANCES.clear() + + +class TestLeaks(TestCase): + + def test_arg_refs(self): + args = ('a', 'b', 'c') + refcount_before = sys.getrefcount(args) + # pylint:disable=unnecessary-lambda + g = greenlet.greenlet( + lambda *args: greenlet.getcurrent().parent.switch(*args)) + for _ in range(100): + g.switch(*args) + self.assertEqual(sys.getrefcount(args), refcount_before) + + def test_kwarg_refs(self): + kwargs = {} + # pylint:disable=unnecessary-lambda + g = greenlet.greenlet( + lambda **kwargs: greenlet.getcurrent().parent.switch(**kwargs)) + for _ in range(100): + g.switch(**kwargs) + self.assertEqual(sys.getrefcount(kwargs), 2) + + + @staticmethod + def __recycle_threads(): + # By introducing a thread that does sleep we allow other threads, + # that have triggered their __block condition, but did not have a + # chance to deallocate their thread state yet, to finally do so. + # The way it works is by requiring a GIL switch (different thread), + # which does a GIL release (sleep), which might do a GIL switch + # to finished threads and allow them to clean up. + def worker(): + time.sleep(0.001) + t = threading.Thread(target=worker) + t.start() + time.sleep(0.001) + t.join(10) + + def test_threaded_leak(self): + gg = [] + def worker(): + # only main greenlet present + gg.append(weakref.ref(greenlet.getcurrent())) + for _ in range(2): + t = threading.Thread(target=worker) + t.start() + t.join(10) + del t + greenlet.getcurrent() # update ts_current + self.__recycle_threads() + greenlet.getcurrent() # update ts_current + gc.collect() + greenlet.getcurrent() # update ts_current + for g in gg: + self.assertIsNone(g()) + + def test_threaded_adv_leak(self): + gg = [] + def worker(): + # main and additional *finished* greenlets + ll = greenlet.getcurrent().ll = [] + def additional(): + ll.append(greenlet.getcurrent()) + for _ in range(2): + greenlet.greenlet(additional).switch() + gg.append(weakref.ref(greenlet.getcurrent())) + for _ in range(2): + t = threading.Thread(target=worker) + t.start() + t.join(10) + del t + greenlet.getcurrent() # update ts_current + self.__recycle_threads() + greenlet.getcurrent() # update ts_current + gc.collect() + greenlet.getcurrent() # update ts_current + for g in gg: + self.assertIsNone(g()) + + def assertClocksUsed(self): + used = greenlet._greenlet.get_clocks_used_doing_optional_cleanup() + self.assertGreaterEqual(used, 0) + # we don't lose the value + greenlet._greenlet.enable_optional_cleanup(True) + used2 = greenlet._greenlet.get_clocks_used_doing_optional_cleanup() + self.assertEqual(used, used2) + self.assertGreater(greenlet._greenlet.CLOCKS_PER_SEC, 1) + + def _check_issue251(self, + manually_collect_background=True, + explicit_reference_to_switch=False): + # See https://github.com/python-greenlet/greenlet/issues/251 + # Killing a greenlet (probably not the main one) + # in one thread from another thread would + # result in leaking a list (the ts_delkey list). + # We no longer use lists to hold that stuff, though. + + # For the test to be valid, even empty lists have to be tracked by the + # GC + + assert gc.is_tracked([]) + HasFinalizerTracksInstances.reset() + greenlet.getcurrent() + greenlets_before = self.count_objects(greenlet.greenlet, exact_kind=False) + + background_glet_running = threading.Event() + background_glet_killed = threading.Event() + background_greenlets = [] + + # XXX: Switching this to a greenlet subclass that overrides + # run results in all callers failing the leaktest; that + # greenlet instance is leaked. There's a bound method for + # run() living on the stack of the greenlet in g_initialstub, + # and since we don't manually switch back to the background + # greenlet to let it "fall off the end" and exit the + # g_initialstub function, it never gets cleaned up. Making the + # garbage collector aware of this bound method (making it an + # attribute of the greenlet structure and traversing into it) + # doesn't help, for some reason. + def background_greenlet(): + # Throw control back to the main greenlet. + jd = HasFinalizerTracksInstances("DELETING STACK OBJECT") + greenlet._greenlet.set_thread_local( + 'test_leaks_key', + HasFinalizerTracksInstances("DELETING THREAD STATE")) + # Explicitly keeping 'switch' in a local variable + # breaks this test in all versions + if explicit_reference_to_switch: + s = greenlet.getcurrent().parent.switch + s([jd]) + else: + greenlet.getcurrent().parent.switch([jd]) + + bg_main_wrefs = [] + + def background_thread(): + glet = greenlet.greenlet(background_greenlet) + bg_main_wrefs.append(weakref.ref(glet.parent)) + + background_greenlets.append(glet) + glet.switch() # Be sure it's active. + # Control is ours again. + del glet # Delete one reference from the thread it runs in. + background_glet_running.set() + background_glet_killed.wait(10) + + # To trigger the background collection of the dead + # greenlet, thus clearing out the contents of the list, we + # need to run some APIs. See issue 252. + if manually_collect_background: + greenlet.getcurrent() + + + t = threading.Thread(target=background_thread) + t.start() + background_glet_running.wait(10) + greenlet.getcurrent() + lists_before = self.count_objects(list, exact_kind=True) + + assert len(background_greenlets) == 1 + self.assertFalse(background_greenlets[0].dead) + # Delete the last reference to the background greenlet + # from a different thread. This puts it in the background thread's + # ts_delkey list. + del background_greenlets[:] + background_glet_killed.set() + + # Now wait for the background thread to die. + t.join(10) + del t + # As part of the fix for 252, we need to cycle the ceval.c + # interpreter loop to be sure it has had a chance to process + # the pending call. + self.wait_for_pending_cleanups() + + lists_after = self.count_objects(list, exact_kind=True) + greenlets_after = self.count_objects(greenlet.greenlet, exact_kind=False) + + # On 2.7, we observe that lists_after is smaller than + # lists_before. No idea what lists got cleaned up. All the + # Python 3 versions match exactly. + self.assertLessEqual(lists_after, lists_before) + # On versions after 3.6, we've successfully cleaned up the + # greenlet references thanks to the internal "vectorcall" + # protocol; prior to that, there is a reference path through + # the ``greenlet.switch`` method still on the stack that we + # can't reach to clean up. The C code goes through terrific + # lengths to clean that up. + if not explicit_reference_to_switch and greenlet._greenlet.get_clocks_used_doing_optional_cleanup() is not None: + # If cleanup was disabled, though, we may not find it. + self.assertEqual(greenlets_after, greenlets_before) + if manually_collect_background: + # TODO: Figure out how to make this work! + # The one on the stack is still leaking somehow + # in the non-manually-collect state. + self.assertEqual(HasFinalizerTracksInstances.EXTANT_INSTANCES, set()) + else: + # The explicit reference prevents us from collecting it + # and it isn't always found by the GC either for some + # reason. The entire frame is leaked somehow, on some + # platforms (e.g., MacPorts builds of Python (all + # versions!)), but not on other platforms (the linux and + # windows builds on GitHub actions and Appveyor). So we'd + # like to write a test that proves that the main greenlet + # sticks around, and we can on my machine (macOS 11.6, + # MacPorts builds of everything) but we can't write that + # same test on other platforms. However, hopefully iteration + # done by leakcheck will find it. + pass + + if greenlet._greenlet.get_clocks_used_doing_optional_cleanup() is not None: + self.assertClocksUsed() + + def test_issue251_killing_cross_thread_leaks_list(self): + self._check_issue251() + + def test_issue251_with_cleanup_disabled(self): + greenlet._greenlet.enable_optional_cleanup(False) + try: + self._check_issue251() + finally: + greenlet._greenlet.enable_optional_cleanup(True) + + @fails_leakcheck + def test_issue251_issue252_need_to_collect_in_background(self): + # Between greenlet 1.1.2 and the next version, this was still + # failing because the leak of the list still exists when we + # don't call a greenlet API before exiting the thread. The + # proximate cause is that neither of the two greenlets from + # the background thread are actually being destroyed, even + # though the GC is in fact visiting both objects. It's not + # clear where that leak is? For some reason the thread-local + # dict holding it isn't being cleaned up. + # + # The leak, I think, is in the CPYthon internal function that + # calls into green_switch(). The argument tuple is still on + # the C stack somewhere and can't be reached? That doesn't + # make sense, because the tuple should be collectable when + # this object goes away. + # + # Note that this test sometimes spuriously passes on Linux, + # for some reason, but I've never seen it pass on macOS. + self._check_issue251(manually_collect_background=False) + + @fails_leakcheck + def test_issue251_issue252_need_to_collect_in_background_cleanup_disabled(self): + self.expect_greenlet_leak = True + greenlet._greenlet.enable_optional_cleanup(False) + try: + self._check_issue251(manually_collect_background=False) + finally: + greenlet._greenlet.enable_optional_cleanup(True) + + @fails_leakcheck + def test_issue251_issue252_explicit_reference_not_collectable(self): + self._check_issue251( + manually_collect_background=False, + explicit_reference_to_switch=True) + + UNTRACK_ATTEMPTS = 100 + + def _only_test_some_versions(self): + # We're only looking for this problem specifically on 3.11, + # and this set of tests is relatively fragile, depending on + # OS and memory management details. So we want to run it on 3.11+ + # (obviously) but not every older 3.x version in order to reduce + # false negatives. At the moment, those false results seem to have + # resolved, so we are actually running this on 3.8+ + assert sys.version_info[0] >= 3 + if sys.version_info[:2] < (3, 8): + self.skipTest('Only observed on 3.11') + if RUNNING_ON_MANYLINUX: + self.skipTest("Slow and not worth repeating here") + + @ignores_leakcheck + # Because we're just trying to track raw memory, not objects, and running + # the leakcheck makes an already slow test slower. + def test_untracked_memory_doesnt_increase(self): + # See https://github.com/gevent/gevent/issues/1924 + # and https://github.com/python-greenlet/greenlet/issues/328 + self._only_test_some_versions() + def f(): + return 1 + + ITER = 10000 + def run_it(): + for _ in range(ITER): + greenlet.greenlet(f).switch() + + # Establish baseline + for _ in range(3): + run_it() + + # uss: (Linux, macOS, Windows): aka "Unique Set Size", this is + # the memory which is unique to a process and which would be + # freed if the process was terminated right now. + uss_before = psutil.Process().memory_full_info().uss + + for count in range(self.UNTRACK_ATTEMPTS): + uss_before = max(uss_before, psutil.Process().memory_full_info().uss) + run_it() + + uss_after = psutil.Process().memory_full_info().uss + if uss_after <= uss_before and count > 1: + break + + self.assertLessEqual(uss_after, uss_before) + + def _check_untracked_memory_thread(self, deallocate_in_thread=True): + self._only_test_some_versions() + # Like the above test, but what if there are a bunch of + # unfinished greenlets in a thread that dies? + # Does it matter if we deallocate in the thread or not? + EXIT_COUNT = [0] + + def f(): + try: + greenlet.getcurrent().parent.switch() + except greenlet.GreenletExit: + EXIT_COUNT[0] += 1 + raise + return 1 + + ITER = 10000 + def run_it(): + glets = [] + for _ in range(ITER): + # Greenlet starts, switches back to us. + # We keep a strong reference to the greenlet though so it doesn't + # get a GreenletExit exception. + g = greenlet.greenlet(f) + glets.append(g) + g.switch() + + return glets + + test = self + + class ThreadFunc: + uss_before = uss_after = 0 + glets = () + ITER = 2 + def __call__(self): + self.uss_before = psutil.Process().memory_full_info().uss + + for _ in range(self.ITER): + self.glets += tuple(run_it()) + + for g in self.glets: + test.assertIn('suspended active', str(g)) + # Drop them. + if deallocate_in_thread: + self.glets = () + self.uss_after = psutil.Process().memory_full_info().uss + + # Establish baseline + uss_before = uss_after = None + for count in range(self.UNTRACK_ATTEMPTS): + EXIT_COUNT[0] = 0 + thread_func = ThreadFunc() + t = threading.Thread(target=thread_func) + t.start() + t.join(30) + self.assertFalse(t.is_alive()) + + if uss_before is None: + uss_before = thread_func.uss_before + + uss_before = max(uss_before, thread_func.uss_before) + if deallocate_in_thread: + self.assertEqual(thread_func.glets, ()) + self.assertEqual(EXIT_COUNT[0], ITER * thread_func.ITER) + + del thread_func # Deallocate the greenlets; but this won't raise into them + del t + if not deallocate_in_thread: + self.assertEqual(EXIT_COUNT[0], 0) + if deallocate_in_thread: + self.wait_for_pending_cleanups() + + uss_after = psutil.Process().memory_full_info().uss + # See if we achieve a non-growth state at some point. Break when we do. + if uss_after <= uss_before and count > 1: + break + + self.wait_for_pending_cleanups() + uss_after = psutil.Process().memory_full_info().uss + self.assertLessEqual(uss_after, uss_before, "after attempts %d" % (count,)) + + @ignores_leakcheck + # Because we're just trying to track raw memory, not objects, and running + # the leakcheck makes an already slow test slower. + def test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_thread(self): + self._check_untracked_memory_thread(deallocate_in_thread=True) + + @ignores_leakcheck + # Because the main greenlets from the background threads do not exit in a timely fashion, + # we fail the object-based leakchecks. + def test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main(self): + self._check_untracked_memory_thread(deallocate_in_thread=False) + +if __name__ == '__main__': + __import__('unittest').main() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_stack_saved.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_stack_saved.py new file mode 100644 index 00000000..b362bf95 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_stack_saved.py @@ -0,0 +1,19 @@ +import greenlet +from . import TestCase + + +class Test(TestCase): + + def test_stack_saved(self): + main = greenlet.getcurrent() + self.assertEqual(main._stack_saved, 0) + + def func(): + main.switch(main._stack_saved) + + g = greenlet.greenlet(func) + x = g.switch() + self.assertGreater(x, 0) + self.assertGreater(g._stack_saved, 0) + g.switch() + self.assertEqual(g._stack_saved, 0) diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_throw.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_throw.py new file mode 100644 index 00000000..90d657a2 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_throw.py @@ -0,0 +1,129 @@ +import sys + + +from greenlet import greenlet +from . import TestCase + +def switch(*args): + return greenlet.getcurrent().parent.switch(*args) + + +class ThrowTests(TestCase): + def test_class(self): + def f(): + try: + switch("ok") + except RuntimeError: + switch("ok") + return + switch("fail") + g = greenlet(f) + res = g.switch() + self.assertEqual(res, "ok") + res = g.throw(RuntimeError) + self.assertEqual(res, "ok") + + def test_val(self): + def f(): + try: + switch("ok") + except RuntimeError: + val = sys.exc_info()[1] + if str(val) == "ciao": + switch("ok") + return + switch("fail") + + g = greenlet(f) + res = g.switch() + self.assertEqual(res, "ok") + res = g.throw(RuntimeError("ciao")) + self.assertEqual(res, "ok") + + g = greenlet(f) + res = g.switch() + self.assertEqual(res, "ok") + res = g.throw(RuntimeError, "ciao") + self.assertEqual(res, "ok") + + def test_kill(self): + def f(): + switch("ok") + switch("fail") + g = greenlet(f) + res = g.switch() + self.assertEqual(res, "ok") + res = g.throw() + self.assertTrue(isinstance(res, greenlet.GreenletExit)) + self.assertTrue(g.dead) + res = g.throw() # immediately eaten by the already-dead greenlet + self.assertTrue(isinstance(res, greenlet.GreenletExit)) + + def test_throw_goes_to_original_parent(self): + main = greenlet.getcurrent() + + def f1(): + try: + main.switch("f1 ready to catch") + except IndexError: + return "caught" + else: + return "normal exit" + + def f2(): + main.switch("from f2") + + g1 = greenlet(f1) + g2 = greenlet(f2, parent=g1) + with self.assertRaises(IndexError): + g2.throw(IndexError) + self.assertTrue(g2.dead) + self.assertTrue(g1.dead) + + g1 = greenlet(f1) + g2 = greenlet(f2, parent=g1) + res = g1.switch() + self.assertEqual(res, "f1 ready to catch") + res = g2.throw(IndexError) + self.assertEqual(res, "caught") + self.assertTrue(g2.dead) + self.assertTrue(g1.dead) + + g1 = greenlet(f1) + g2 = greenlet(f2, parent=g1) + res = g1.switch() + self.assertEqual(res, "f1 ready to catch") + res = g2.switch() + self.assertEqual(res, "from f2") + res = g2.throw(IndexError) + self.assertEqual(res, "caught") + self.assertTrue(g2.dead) + self.assertTrue(g1.dead) + + def test_non_traceback_param(self): + with self.assertRaises(TypeError) as exc: + greenlet.getcurrent().throw( + Exception, + Exception(), + self + ) + self.assertEqual(str(exc.exception), + "throw() third argument must be a traceback object") + + def test_instance_of_wrong_type(self): + with self.assertRaises(TypeError) as exc: + greenlet.getcurrent().throw( + Exception(), + BaseException() + ) + + self.assertEqual(str(exc.exception), + "instance exception may not have a separate value") + + def test_not_throwable(self): + with self.assertRaises(TypeError) as exc: + greenlet.getcurrent().throw( + "abc" + ) + self.assertEqual(str(exc.exception), + "exceptions must be classes, or instances, not str") diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_tracing.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_tracing.py new file mode 100644 index 00000000..c044d4b6 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_tracing.py @@ -0,0 +1,291 @@ +from __future__ import print_function +import sys +import greenlet +import unittest + +from . import TestCase +from . import PY312 + +# https://discuss.python.org/t/cpython-3-12-greenlet-and-tracing-profiling-how-to-not-crash-and-get-correct-results/33144/2 +DEBUG_BUILD_PY312 = ( + PY312 and hasattr(sys, 'gettotalrefcount'), + "Broken on debug builds of Python 3.12" +) + +class SomeError(Exception): + pass + +class GreenletTracer(object): + oldtrace = None + + def __init__(self, error_on_trace=False): + self.actions = [] + self.error_on_trace = error_on_trace + + def __call__(self, *args): + self.actions.append(args) + if self.error_on_trace: + raise SomeError + + def __enter__(self): + self.oldtrace = greenlet.settrace(self) + return self.actions + + def __exit__(self, *args): + greenlet.settrace(self.oldtrace) + + +class TestGreenletTracing(TestCase): + """ + Tests of ``greenlet.settrace()`` + """ + + def test_a_greenlet_tracing(self): + main = greenlet.getcurrent() + def dummy(): + pass + def dummyexc(): + raise SomeError() + + with GreenletTracer() as actions: + g1 = greenlet.greenlet(dummy) + g1.switch() + g2 = greenlet.greenlet(dummyexc) + self.assertRaises(SomeError, g2.switch) + + self.assertEqual(actions, [ + ('switch', (main, g1)), + ('switch', (g1, main)), + ('switch', (main, g2)), + ('throw', (g2, main)), + ]) + + def test_b_exception_disables_tracing(self): + main = greenlet.getcurrent() + def dummy(): + main.switch() + g = greenlet.greenlet(dummy) + g.switch() + with GreenletTracer(error_on_trace=True) as actions: + self.assertRaises(SomeError, g.switch) + self.assertEqual(greenlet.gettrace(), None) + + self.assertEqual(actions, [ + ('switch', (main, g)), + ]) + + def test_set_same_tracer_twice(self): + # https://github.com/python-greenlet/greenlet/issues/332 + # Our logic in asserting that the tracefunction should + # gain a reference was incorrect if the same tracefunction was set + # twice. + tracer = GreenletTracer() + with tracer: + greenlet.settrace(tracer) + + +class PythonTracer(object): + oldtrace = None + + def __init__(self): + self.actions = [] + + def __call__(self, frame, event, arg): + # Record the co_name so we have an idea what function we're in. + self.actions.append((event, frame.f_code.co_name)) + + def __enter__(self): + self.oldtrace = sys.setprofile(self) + return self.actions + + def __exit__(self, *args): + sys.setprofile(self.oldtrace) + +def tpt_callback(): + return 42 + +class TestPythonTracing(TestCase): + """ + Tests of the interaction of ``sys.settrace()`` + with greenlet facilities. + + NOTE: Most of this is probably CPython specific. + """ + + maxDiff = None + + def test_trace_events_trivial(self): + with PythonTracer() as actions: + tpt_callback() + # If we use the sys.settrace instead of setprofile, we get + # this: + + # self.assertEqual(actions, [ + # ('call', 'tpt_callback'), + # ('call', '__exit__'), + # ]) + + self.assertEqual(actions, [ + ('return', '__enter__'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) + + def _trace_switch(self, glet): + with PythonTracer() as actions: + glet.switch() + return actions + + def _check_trace_events_func_already_set(self, glet): + actions = self._trace_switch(glet) + self.assertEqual(actions, [ + ('return', '__enter__'), + ('c_call', '_trace_switch'), + ('call', 'run'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('return', 'run'), + ('c_return', '_trace_switch'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) + + def test_trace_events_into_greenlet_func_already_set(self): + def run(): + return tpt_callback() + + self._check_trace_events_func_already_set(greenlet.greenlet(run)) + + def test_trace_events_into_greenlet_subclass_already_set(self): + class X(greenlet.greenlet): + def run(self): + return tpt_callback() + self._check_trace_events_func_already_set(X()) + + def _check_trace_events_from_greenlet_sets_profiler(self, g, tracer): + g.switch() + tpt_callback() + tracer.__exit__() + self.assertEqual(tracer.actions, [ + ('return', '__enter__'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('return', 'run'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) + + + def test_trace_events_from_greenlet_func_sets_profiler(self): + tracer = PythonTracer() + def run(): + tracer.__enter__() + return tpt_callback() + + self._check_trace_events_from_greenlet_sets_profiler(greenlet.greenlet(run), + tracer) + + def test_trace_events_from_greenlet_subclass_sets_profiler(self): + tracer = PythonTracer() + class X(greenlet.greenlet): + def run(self): + tracer.__enter__() + return tpt_callback() + + self._check_trace_events_from_greenlet_sets_profiler(X(), tracer) + + @unittest.skipIf(*DEBUG_BUILD_PY312) + def test_trace_events_multiple_greenlets_switching(self): + tracer = PythonTracer() + + g1 = None + g2 = None + + def g1_run(): + tracer.__enter__() + tpt_callback() + g2.switch() + tpt_callback() + return 42 + + def g2_run(): + tpt_callback() + tracer.__exit__() + tpt_callback() + g1.switch() + + g1 = greenlet.greenlet(g1_run) + g2 = greenlet.greenlet(g2_run) + + x = g1.switch() + self.assertEqual(x, 42) + tpt_callback() # ensure not in the trace + self.assertEqual(tracer.actions, [ + ('return', '__enter__'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('c_call', 'g1_run'), + ('call', 'g2_run'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) + + @unittest.skipIf(*DEBUG_BUILD_PY312) + def test_trace_events_multiple_greenlets_switching_siblings(self): + # Like the first version, but get both greenlets running first + # as "siblings" and then establish the tracing. + tracer = PythonTracer() + + g1 = None + g2 = None + + def g1_run(): + greenlet.getcurrent().parent.switch() + tracer.__enter__() + tpt_callback() + g2.switch() + tpt_callback() + return 42 + + def g2_run(): + greenlet.getcurrent().parent.switch() + + tpt_callback() + tracer.__exit__() + tpt_callback() + g1.switch() + + g1 = greenlet.greenlet(g1_run) + g2 = greenlet.greenlet(g2_run) + + # Start g1 + g1.switch() + # And it immediately returns control to us. + # Start g2 + g2.switch() + # Which also returns. Now kick of the real part of the + # test. + x = g1.switch() + self.assertEqual(x, 42) + + tpt_callback() # ensure not in the trace + self.assertEqual(tracer.actions, [ + ('return', '__enter__'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('c_call', 'g1_run'), + ('call', 'tpt_callback'), + ('return', 'tpt_callback'), + ('call', '__exit__'), + ('c_call', '__exit__'), + ]) + + +if __name__ == '__main__': + unittest.main() diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_version.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_version.py new file mode 100644 index 00000000..96c17cf1 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_version.py @@ -0,0 +1,41 @@ +#! /usr/bin/env python +from __future__ import absolute_import +from __future__ import print_function + +import sys +import os +from unittest import TestCase as NonLeakingTestCase + +import greenlet + +# No reason to run this multiple times under leakchecks, +# it doesn't do anything. +class VersionTests(NonLeakingTestCase): + def test_version(self): + def find_dominating_file(name): + if os.path.exists(name): + return name + + tried = [] + here = os.path.abspath(os.path.dirname(__file__)) + for i in range(10): + up = ['..'] * i + path = [here] + up + [name] + fname = os.path.join(*path) + fname = os.path.abspath(fname) + tried.append(fname) + if os.path.exists(fname): + return fname + raise AssertionError("Could not find file " + name + "; checked " + str(tried)) + + try: + setup_py = find_dominating_file('setup.py') + except AssertionError as e: + self.skipTest("Unable to find setup.py; must be out of tree. " + str(e)) + + + invoke_setup = "%s %s --version" % (sys.executable, setup_py) + with os.popen(invoke_setup) as f: + sversion = f.read().strip() + + self.assertEqual(sversion, greenlet.__version__) diff --git a/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_weakref.py b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_weakref.py new file mode 100644 index 00000000..916ef8ae --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/greenlet/tests/test_weakref.py @@ -0,0 +1,35 @@ +import gc +import weakref +import unittest + +import greenlet +from . import TestCase + +class WeakRefTests(TestCase): + def test_dead_weakref(self): + def _dead_greenlet(): + g = greenlet.greenlet(lambda: None) + g.switch() + return g + o = weakref.ref(_dead_greenlet()) + gc.collect() + self.assertEqual(o(), None) + + def test_inactive_weakref(self): + o = weakref.ref(greenlet.greenlet()) + gc.collect() + self.assertEqual(o(), None) + + def test_dealloc_weakref(self): + seen = [] + def worker(): + try: + greenlet.getcurrent().parent.switch() + finally: + seen.append(g()) + g = greenlet.greenlet(worker) + g.switch() + g2 = greenlet.greenlet(lambda: None, g) + g = weakref.ref(g2) + g2 = None + self.assertEqual(seen, [None]) diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/LICENSE b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/METADATA new file mode 100644 index 00000000..639bbea9 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/METADATA @@ -0,0 +1,138 @@ +Metadata-Version: 2.1 +Name: importlib-metadata +Version: 6.8.0 +Summary: Read metadata from Python packages +Home-page: https://github.com/python/importlib_metadata +Author: Jason R. Coombs +Author-email: jaraco@jaraco.com +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Requires-Python: >=3.8 +License-File: LICENSE +Requires-Dist: zipp (>=0.5) +Requires-Dist: typing-extensions (>=3.6.4) ; python_version < "3.8" +Provides-Extra: docs +Requires-Dist: sphinx (>=3.5) ; extra == 'docs' +Requires-Dist: jaraco.packaging (>=9) ; extra == 'docs' +Requires-Dist: rst.linker (>=1.9) ; extra == 'docs' +Requires-Dist: furo ; extra == 'docs' +Requires-Dist: sphinx-lint ; extra == 'docs' +Requires-Dist: jaraco.tidelift (>=1.4) ; extra == 'docs' +Provides-Extra: perf +Requires-Dist: ipython ; extra == 'perf' +Provides-Extra: testing +Requires-Dist: pytest (>=6) ; extra == 'testing' +Requires-Dist: pytest-checkdocs (>=2.4) ; extra == 'testing' +Requires-Dist: pytest-cov ; extra == 'testing' +Requires-Dist: pytest-enabler (>=2.2) ; extra == 'testing' +Requires-Dist: pytest-ruff ; extra == 'testing' +Requires-Dist: packaging ; extra == 'testing' +Requires-Dist: pyfakefs ; extra == 'testing' +Requires-Dist: flufl.flake8 ; extra == 'testing' +Requires-Dist: pytest-perf (>=0.9.2) ; extra == 'testing' +Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing' +Requires-Dist: pytest-mypy (>=0.9.1) ; (platform_python_implementation != "PyPy") and extra == 'testing' +Requires-Dist: importlib-resources (>=1.3) ; (python_version < "3.9") and extra == 'testing' + +.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg + :target: https://pypi.org/project/importlib_metadata + +.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg + +.. image:: https://github.com/python/importlib_metadata/workflows/tests/badge.svg + :target: https://github.com/python/importlib_metadata/actions?query=workflow%3A%22tests%22 + :alt: tests + +.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json + :target: https://github.com/astral-sh/ruff + :alt: Ruff + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + :alt: Code style: Black + +.. image:: https://readthedocs.org/projects/importlib-metadata/badge/?version=latest + :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest + +.. image:: https://img.shields.io/badge/skeleton-2023-informational + :target: https://blog.jaraco.com/skeleton + +.. image:: https://tidelift.com/badges/package/pypi/importlib-metadata + :target: https://tidelift.com/subscription/pkg/pypi-importlib-metadata?utm_source=pypi-importlib-metadata&utm_medium=readme + +Library to access the metadata for a Python package. + +This package supplies third-party access to the functionality of +`importlib.metadata `_ +including improvements added to subsequent Python versions. + + +Compatibility +============= + +New features are introduced in this third-party library and later merged +into CPython. The following table indicates which versions of this library +were contributed to different versions in the standard library: + +.. list-table:: + :header-rows: 1 + + * - importlib_metadata + - stdlib + * - 6.5 + - 3.12 + * - 4.13 + - 3.11 + * - 4.6 + - 3.10 + * - 1.4 + - 3.8 + + +Usage +===== + +See the `online documentation `_ +for usage details. + +`Finder authors +`_ can +also add support for custom package installers. See the above documentation +for details. + + +Caveats +======= + +This project primarily supports third-party packages installed by PyPA +tools (or other conforming packages). It does not support: + +- Packages in the stdlib. +- Packages installed without metadata. + +Project details +=============== + + * Project home: https://github.com/python/importlib_metadata + * Report bugs at: https://github.com/python/importlib_metadata/issues + * Code hosting: https://github.com/python/importlib_metadata + * Documentation: https://importlib-metadata.readthedocs.io/ + +For Enterprise +============== + +Available as part of the Tidelift Subscription. + +This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use. + +`Learn more `_. + +Security Contact +================ + +To report a security vulnerability, please use the +`Tidelift security contact `_. +Tidelift will coordinate the fix and disclosure. diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/RECORD new file mode 100644 index 00000000..caaa8f85 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/RECORD @@ -0,0 +1,25 @@ +importlib_metadata-6.8.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +importlib_metadata-6.8.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +importlib_metadata-6.8.0.dist-info/METADATA,sha256=X79qGRh7gqvuaL_utK5X-MnwHJuIWke0e3eAx0IiLhc,5067 +importlib_metadata-6.8.0.dist-info/RECORD,, +importlib_metadata-6.8.0.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 +importlib_metadata-6.8.0.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19 +importlib_metadata/__init__.py,sha256=EiH0qTKP_6oa6pRGJgPrq0kvjnL3hJ18BJH8VaAYSBA,30749 +importlib_metadata/__pycache__/__init__.cpython-39.pyc,, +importlib_metadata/__pycache__/_adapters.cpython-39.pyc,, +importlib_metadata/__pycache__/_collections.cpython-39.pyc,, +importlib_metadata/__pycache__/_compat.cpython-39.pyc,, +importlib_metadata/__pycache__/_functools.cpython-39.pyc,, +importlib_metadata/__pycache__/_itertools.cpython-39.pyc,, +importlib_metadata/__pycache__/_meta.cpython-39.pyc,, +importlib_metadata/__pycache__/_py39compat.cpython-39.pyc,, +importlib_metadata/__pycache__/_text.cpython-39.pyc,, +importlib_metadata/_adapters.py,sha256=i8S6Ib1OQjcILA-l4gkzktMZe18TaeUNI49PLRp6OBU,2454 +importlib_metadata/_collections.py,sha256=CJ0OTCHIjWA0ZIVS4voORAsn2R4R2cQBEtPsZEJpASY,743 +importlib_metadata/_compat.py,sha256=zhjcWMfA9SNExFVVVBozOYbuiok0A4tdMsNk9ZDZi-A,1554 +importlib_metadata/_functools.py,sha256=PsY2-4rrKX4RVeRC1oGp1lB1pmC9eKN88_f-bD9uOoA,2895 +importlib_metadata/_itertools.py,sha256=cvr_2v8BRbxcIl5x5ldfqdHjhI8Yi8s8yk50G_nm6jQ,2068 +importlib_metadata/_meta.py,sha256=kypMW_-xSStooSm0WpJc6eupjT-Ipc2ZBIl23PyC3No,1613 +importlib_metadata/_py39compat.py,sha256=2Tk5twb_VgLCY-1NEAQjdZp_S9OFMC-pUzP2isuaPsQ,1098 +importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166 +importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/WHEEL new file mode 100644 index 00000000..1f37c02f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/top_level.txt b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/top_level.txt new file mode 100644 index 00000000..bbb07547 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata-6.8.0.dist-info/top_level.txt @@ -0,0 +1 @@ +importlib_metadata diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__init__.py b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__init__.py new file mode 100644 index 00000000..6ba414e5 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__init__.py @@ -0,0 +1,1015 @@ +import os +import re +import abc +import csv +import sys +import zipp +import email +import inspect +import pathlib +import operator +import textwrap +import warnings +import functools +import itertools +import posixpath +import collections + +from . import _adapters, _meta, _py39compat +from ._collections import FreezableDefaultDict, Pair +from ._compat import ( + NullFinder, + StrPath, + install, + pypy_partial, +) +from ._functools import method_cache, pass_none +from ._itertools import always_iterable, unique_everseen +from ._meta import PackageMetadata, SimplePath + +from contextlib import suppress +from importlib import import_module +from importlib.abc import MetaPathFinder +from itertools import starmap +from typing import Iterable, List, Mapping, Optional, Set, cast + +__all__ = [ + 'Distribution', + 'DistributionFinder', + 'PackageMetadata', + 'PackageNotFoundError', + 'distribution', + 'distributions', + 'entry_points', + 'files', + 'metadata', + 'packages_distributions', + 'requires', + 'version', +] + + +class PackageNotFoundError(ModuleNotFoundError): + """The package was not found.""" + + def __str__(self) -> str: + return f"No package metadata was found for {self.name}" + + @property + def name(self) -> str: # type: ignore[override] + (name,) = self.args + return name + + +class Sectioned: + """ + A simple entry point config parser for performance + + >>> for item in Sectioned.read(Sectioned._sample): + ... print(item) + Pair(name='sec1', value='# comments ignored') + Pair(name='sec1', value='a = 1') + Pair(name='sec1', value='b = 2') + Pair(name='sec2', value='a = 2') + + >>> res = Sectioned.section_pairs(Sectioned._sample) + >>> item = next(res) + >>> item.name + 'sec1' + >>> item.value + Pair(name='a', value='1') + >>> item = next(res) + >>> item.value + Pair(name='b', value='2') + >>> item = next(res) + >>> item.name + 'sec2' + >>> item.value + Pair(name='a', value='2') + >>> list(res) + [] + """ + + _sample = textwrap.dedent( + """ + [sec1] + # comments ignored + a = 1 + b = 2 + + [sec2] + a = 2 + """ + ).lstrip() + + @classmethod + def section_pairs(cls, text): + return ( + section._replace(value=Pair.parse(section.value)) + for section in cls.read(text, filter_=cls.valid) + if section.name is not None + ) + + @staticmethod + def read(text, filter_=None): + lines = filter(filter_, map(str.strip, text.splitlines())) + name = None + for value in lines: + section_match = value.startswith('[') and value.endswith(']') + if section_match: + name = value.strip('[]') + continue + yield Pair(name, value) + + @staticmethod + def valid(line: str): + return line and not line.startswith('#') + + +class DeprecatedTuple: + """ + Provide subscript item access for backward compatibility. + + >>> recwarn = getfixture('recwarn') + >>> ep = EntryPoint(name='name', value='value', group='group') + >>> ep[:] + ('name', 'value', 'group') + >>> ep[0] + 'name' + >>> len(recwarn) + 1 + """ + + # Do not remove prior to 2023-05-01 or Python 3.13 + _warn = functools.partial( + warnings.warn, + "EntryPoint tuple interface is deprecated. Access members by name.", + DeprecationWarning, + stacklevel=pypy_partial(2), + ) + + def __getitem__(self, item): + self._warn() + return self._key()[item] + + +class EntryPoint(DeprecatedTuple): + """An entry point as defined by Python packaging conventions. + + See `the packaging docs on entry points + `_ + for more information. + + >>> ep = EntryPoint( + ... name=None, group=None, value='package.module:attr [extra1, extra2]') + >>> ep.module + 'package.module' + >>> ep.attr + 'attr' + >>> ep.extras + ['extra1', 'extra2'] + """ + + pattern = re.compile( + r'(?P[\w.]+)\s*' + r'(:\s*(?P[\w.]+)\s*)?' + r'((?P\[.*\])\s*)?$' + ) + """ + A regular expression describing the syntax for an entry point, + which might look like: + + - module + - package.module + - package.module:attribute + - package.module:object.attribute + - package.module:attr [extra1, extra2] + + Other combinations are possible as well. + + The expression is lenient about whitespace around the ':', + following the attr, and following any extras. + """ + + name: str + value: str + group: str + + dist: Optional['Distribution'] = None + + def __init__(self, name: str, value: str, group: str) -> None: + vars(self).update(name=name, value=value, group=group) + + def load(self): + """Load the entry point from its definition. If only a module + is indicated by the value, return that module. Otherwise, + return the named object. + """ + match = self.pattern.match(self.value) + module = import_module(match.group('module')) + attrs = filter(None, (match.group('attr') or '').split('.')) + return functools.reduce(getattr, attrs, module) + + @property + def module(self) -> str: + match = self.pattern.match(self.value) + assert match is not None + return match.group('module') + + @property + def attr(self) -> str: + match = self.pattern.match(self.value) + assert match is not None + return match.group('attr') + + @property + def extras(self) -> List[str]: + match = self.pattern.match(self.value) + assert match is not None + return re.findall(r'\w+', match.group('extras') or '') + + def _for(self, dist): + vars(self).update(dist=dist) + return self + + def matches(self, **params): + """ + EntryPoint matches the given parameters. + + >>> ep = EntryPoint(group='foo', name='bar', value='bing:bong [extra1, extra2]') + >>> ep.matches(group='foo') + True + >>> ep.matches(name='bar', value='bing:bong [extra1, extra2]') + True + >>> ep.matches(group='foo', name='other') + False + >>> ep.matches() + True + >>> ep.matches(extras=['extra1', 'extra2']) + True + >>> ep.matches(module='bing') + True + >>> ep.matches(attr='bong') + True + """ + attrs = (getattr(self, param) for param in params) + return all(map(operator.eq, params.values(), attrs)) + + def _key(self): + return self.name, self.value, self.group + + def __lt__(self, other): + return self._key() < other._key() + + def __eq__(self, other): + return self._key() == other._key() + + def __setattr__(self, name, value): + raise AttributeError("EntryPoint objects are immutable.") + + def __repr__(self): + return ( + f'EntryPoint(name={self.name!r}, value={self.value!r}, ' + f'group={self.group!r})' + ) + + def __hash__(self) -> int: + return hash(self._key()) + + +class EntryPoints(tuple): + """ + An immutable collection of selectable EntryPoint objects. + """ + + __slots__ = () + + def __getitem__(self, name: str) -> EntryPoint: # type: ignore[override] + """ + Get the EntryPoint in self matching name. + """ + try: + return next(iter(self.select(name=name))) + except StopIteration: + raise KeyError(name) + + def select(self, **params): + """ + Select entry points from self that match the + given parameters (typically group and/or name). + """ + return EntryPoints(ep for ep in self if _py39compat.ep_matches(ep, **params)) + + @property + def names(self) -> Set[str]: + """ + Return the set of all names of all entry points. + """ + return {ep.name for ep in self} + + @property + def groups(self) -> Set[str]: + """ + Return the set of all groups of all entry points. + """ + return {ep.group for ep in self} + + @classmethod + def _from_text_for(cls, text, dist): + return cls(ep._for(dist) for ep in cls._from_text(text)) + + @staticmethod + def _from_text(text): + return ( + EntryPoint(name=item.value.name, value=item.value.value, group=item.name) + for item in Sectioned.section_pairs(text or '') + ) + + +class PackagePath(pathlib.PurePosixPath): + """A reference to a path in a package""" + + hash: Optional["FileHash"] + size: int + dist: "Distribution" + + def read_text(self, encoding: str = 'utf-8') -> str: # type: ignore[override] + with self.locate().open(encoding=encoding) as stream: + return stream.read() + + def read_binary(self) -> bytes: + with self.locate().open('rb') as stream: + return stream.read() + + def locate(self) -> pathlib.Path: + """Return a path-like object for this path""" + return self.dist.locate_file(self) + + +class FileHash: + def __init__(self, spec: str) -> None: + self.mode, _, self.value = spec.partition('=') + + def __repr__(self) -> str: + return f'' + + +class DeprecatedNonAbstract: + def __new__(cls, *args, **kwargs): + all_names = { + name for subclass in inspect.getmro(cls) for name in vars(subclass) + } + abstract = { + name + for name in all_names + if getattr(getattr(cls, name), '__isabstractmethod__', False) + } + if abstract: + warnings.warn( + f"Unimplemented abstract methods {abstract}", + DeprecationWarning, + stacklevel=2, + ) + return super().__new__(cls) + + +class Distribution(DeprecatedNonAbstract): + """A Python distribution package.""" + + @abc.abstractmethod + def read_text(self, filename) -> Optional[str]: + """Attempt to load metadata file given by the name. + + :param filename: The name of the file in the distribution info. + :return: The text if found, otherwise None. + """ + + @abc.abstractmethod + def locate_file(self, path: StrPath) -> pathlib.Path: + """ + Given a path to a file in this distribution, return a path + to it. + """ + + @classmethod + def from_name(cls, name: str) -> "Distribution": + """Return the Distribution for the given package name. + + :param name: The name of the distribution package to search for. + :return: The Distribution instance (or subclass thereof) for the named + package, if found. + :raises PackageNotFoundError: When the named package's distribution + metadata cannot be found. + :raises ValueError: When an invalid value is supplied for name. + """ + if not name: + raise ValueError("A distribution name is required.") + try: + return next(iter(cls.discover(name=name))) + except StopIteration: + raise PackageNotFoundError(name) + + @classmethod + def discover(cls, **kwargs) -> Iterable["Distribution"]: + """Return an iterable of Distribution objects for all packages. + + Pass a ``context`` or pass keyword arguments for constructing + a context. + + :context: A ``DistributionFinder.Context`` object. + :return: Iterable of Distribution objects for all packages. + """ + context = kwargs.pop('context', None) + if context and kwargs: + raise ValueError("cannot accept context and kwargs") + context = context or DistributionFinder.Context(**kwargs) + return itertools.chain.from_iterable( + resolver(context) for resolver in cls._discover_resolvers() + ) + + @staticmethod + def at(path: StrPath) -> "Distribution": + """Return a Distribution for the indicated metadata path + + :param path: a string or path-like object + :return: a concrete Distribution instance for the path + """ + return PathDistribution(pathlib.Path(path)) + + @staticmethod + def _discover_resolvers(): + """Search the meta_path for resolvers.""" + declared = ( + getattr(finder, 'find_distributions', None) for finder in sys.meta_path + ) + return filter(None, declared) + + @property + def metadata(self) -> _meta.PackageMetadata: + """Return the parsed metadata for this Distribution. + + The returned object will have keys that name the various bits of + metadata. See PEP 566 for details. + """ + opt_text = ( + self.read_text('METADATA') + or self.read_text('PKG-INFO') + # This last clause is here to support old egg-info files. Its + # effect is to just end up using the PathDistribution's self._path + # (which points to the egg-info file) attribute unchanged. + or self.read_text('') + ) + text = cast(str, opt_text) + return _adapters.Message(email.message_from_string(text)) + + @property + def name(self) -> str: + """Return the 'Name' metadata for the distribution package.""" + return self.metadata['Name'] + + @property + def _normalized_name(self): + """Return a normalized version of the name.""" + return Prepared.normalize(self.name) + + @property + def version(self) -> str: + """Return the 'Version' metadata for the distribution package.""" + return self.metadata['Version'] + + @property + def entry_points(self) -> EntryPoints: + return EntryPoints._from_text_for(self.read_text('entry_points.txt'), self) + + @property + def files(self) -> Optional[List[PackagePath]]: + """Files in this distribution. + + :return: List of PackagePath for this distribution or None + + Result is `None` if the metadata file that enumerates files + (i.e. RECORD for dist-info, or installed-files.txt or + SOURCES.txt for egg-info) is missing. + Result may be empty if the metadata exists but is empty. + """ + + def make_file(name, hash=None, size_str=None): + result = PackagePath(name) + result.hash = FileHash(hash) if hash else None + result.size = int(size_str) if size_str else None + result.dist = self + return result + + @pass_none + def make_files(lines): + return starmap(make_file, csv.reader(lines)) + + @pass_none + def skip_missing_files(package_paths): + return list(filter(lambda path: path.locate().exists(), package_paths)) + + return skip_missing_files( + make_files( + self._read_files_distinfo() + or self._read_files_egginfo_installed() + or self._read_files_egginfo_sources() + ) + ) + + def _read_files_distinfo(self): + """ + Read the lines of RECORD + """ + text = self.read_text('RECORD') + return text and text.splitlines() + + def _read_files_egginfo_installed(self): + """ + Read installed-files.txt and return lines in a similar + CSV-parsable format as RECORD: each file must be placed + relative to the site-packages directory and must also be + quoted (since file names can contain literal commas). + + This file is written when the package is installed by pip, + but it might not be written for other installation methods. + Assume the file is accurate if it exists. + """ + text = self.read_text('installed-files.txt') + # Prepend the .egg-info/ subdir to the lines in this file. + # But this subdir is only available from PathDistribution's + # self._path. + subdir = getattr(self, '_path', None) + if not text or not subdir: + return + + paths = ( + (subdir / name) + .resolve() + .relative_to(self.locate_file('').resolve()) + .as_posix() + for name in text.splitlines() + ) + return map('"{}"'.format, paths) + + def _read_files_egginfo_sources(self): + """ + Read SOURCES.txt and return lines in a similar CSV-parsable + format as RECORD: each file name must be quoted (since it + might contain literal commas). + + Note that SOURCES.txt is not a reliable source for what + files are installed by a package. This file is generated + for a source archive, and the files that are present + there (e.g. setup.py) may not correctly reflect the files + that are present after the package has been installed. + """ + text = self.read_text('SOURCES.txt') + return text and map('"{}"'.format, text.splitlines()) + + @property + def requires(self) -> Optional[List[str]]: + """Generated requirements specified for this Distribution""" + reqs = self._read_dist_info_reqs() or self._read_egg_info_reqs() + return reqs and list(reqs) + + def _read_dist_info_reqs(self): + return self.metadata.get_all('Requires-Dist') + + def _read_egg_info_reqs(self): + source = self.read_text('requires.txt') + return pass_none(self._deps_from_requires_text)(source) + + @classmethod + def _deps_from_requires_text(cls, source): + return cls._convert_egg_info_reqs_to_simple_reqs(Sectioned.read(source)) + + @staticmethod + def _convert_egg_info_reqs_to_simple_reqs(sections): + """ + Historically, setuptools would solicit and store 'extra' + requirements, including those with environment markers, + in separate sections. More modern tools expect each + dependency to be defined separately, with any relevant + extras and environment markers attached directly to that + requirement. This method converts the former to the + latter. See _test_deps_from_requires_text for an example. + """ + + def make_condition(name): + return name and f'extra == "{name}"' + + def quoted_marker(section): + section = section or '' + extra, sep, markers = section.partition(':') + if extra and markers: + markers = f'({markers})' + conditions = list(filter(None, [markers, make_condition(extra)])) + return '; ' + ' and '.join(conditions) if conditions else '' + + def url_req_space(req): + """ + PEP 508 requires a space between the url_spec and the quoted_marker. + Ref python/importlib_metadata#357. + """ + # '@' is uniquely indicative of a url_req. + return ' ' * ('@' in req) + + for section in sections: + space = url_req_space(section.value) + yield section.value + space + quoted_marker(section.name) + + +class DistributionFinder(MetaPathFinder): + """ + A MetaPathFinder capable of discovering installed distributions. + """ + + class Context: + """ + Keyword arguments presented by the caller to + ``distributions()`` or ``Distribution.discover()`` + to narrow the scope of a search for distributions + in all DistributionFinders. + + Each DistributionFinder may expect any parameters + and should attempt to honor the canonical + parameters defined below when appropriate. + """ + + name = None + """ + Specific name for which a distribution finder should match. + A name of ``None`` matches all distributions. + """ + + def __init__(self, **kwargs): + vars(self).update(kwargs) + + @property + def path(self) -> List[str]: + """ + The sequence of directory path that a distribution finder + should search. + + Typically refers to Python installed package paths such as + "site-packages" directories and defaults to ``sys.path``. + """ + return vars(self).get('path', sys.path) + + @abc.abstractmethod + def find_distributions(self, context=Context()) -> Iterable[Distribution]: + """ + Find distributions. + + Return an iterable of all Distribution instances capable of + loading the metadata for packages matching the ``context``, + a DistributionFinder.Context instance. + """ + + +class FastPath: + """ + Micro-optimized class for searching a path for + children. + + >>> FastPath('').children() + ['...'] + """ + + @functools.lru_cache() # type: ignore + def __new__(cls, root): + return super().__new__(cls) + + def __init__(self, root): + self.root = root + + def joinpath(self, child): + return pathlib.Path(self.root, child) + + def children(self): + with suppress(Exception): + return os.listdir(self.root or '.') + with suppress(Exception): + return self.zip_children() + return [] + + def zip_children(self): + zip_path = zipp.Path(self.root) + names = zip_path.root.namelist() + self.joinpath = zip_path.joinpath + + return dict.fromkeys(child.split(posixpath.sep, 1)[0] for child in names) + + def search(self, name): + return self.lookup(self.mtime).search(name) + + @property + def mtime(self): + with suppress(OSError): + return os.stat(self.root).st_mtime + self.lookup.cache_clear() + + @method_cache + def lookup(self, mtime): + return Lookup(self) + + +class Lookup: + def __init__(self, path: FastPath): + base = os.path.basename(path.root).lower() + base_is_egg = base.endswith(".egg") + self.infos = FreezableDefaultDict(list) + self.eggs = FreezableDefaultDict(list) + + for child in path.children(): + low = child.lower() + if low.endswith((".dist-info", ".egg-info")): + # rpartition is faster than splitext and suitable for this purpose. + name = low.rpartition(".")[0].partition("-")[0] + normalized = Prepared.normalize(name) + self.infos[normalized].append(path.joinpath(child)) + elif base_is_egg and low == "egg-info": + name = base.rpartition(".")[0].partition("-")[0] + legacy_normalized = Prepared.legacy_normalize(name) + self.eggs[legacy_normalized].append(path.joinpath(child)) + + self.infos.freeze() + self.eggs.freeze() + + def search(self, prepared): + infos = ( + self.infos[prepared.normalized] + if prepared + else itertools.chain.from_iterable(self.infos.values()) + ) + eggs = ( + self.eggs[prepared.legacy_normalized] + if prepared + else itertools.chain.from_iterable(self.eggs.values()) + ) + return itertools.chain(infos, eggs) + + +class Prepared: + """ + A prepared search for metadata on a possibly-named package. + """ + + normalized = None + legacy_normalized = None + + def __init__(self, name): + self.name = name + if name is None: + return + self.normalized = self.normalize(name) + self.legacy_normalized = self.legacy_normalize(name) + + @staticmethod + def normalize(name): + """ + PEP 503 normalization plus dashes as underscores. + """ + return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_') + + @staticmethod + def legacy_normalize(name): + """ + Normalize the package name as found in the convention in + older packaging tools versions and specs. + """ + return name.lower().replace('-', '_') + + def __bool__(self): + return bool(self.name) + + +@install +class MetadataPathFinder(NullFinder, DistributionFinder): + """A degenerate finder for distribution packages on the file system. + + This finder supplies only a find_distributions() method for versions + of Python that do not have a PathFinder find_distributions(). + """ + + def find_distributions( + self, context=DistributionFinder.Context() + ) -> Iterable["PathDistribution"]: + """ + Find distributions. + + Return an iterable of all Distribution instances capable of + loading the metadata for packages matching ``context.name`` + (or all names if ``None`` indicated) along the paths in the list + of directories ``context.path``. + """ + found = self._search_paths(context.name, context.path) + return map(PathDistribution, found) + + @classmethod + def _search_paths(cls, name, paths): + """Find metadata directories in paths heuristically.""" + prepared = Prepared(name) + return itertools.chain.from_iterable( + path.search(prepared) for path in map(FastPath, paths) + ) + + def invalidate_caches(cls) -> None: + FastPath.__new__.cache_clear() + + +class PathDistribution(Distribution): + def __init__(self, path: SimplePath) -> None: + """Construct a distribution. + + :param path: SimplePath indicating the metadata directory. + """ + self._path = path + + def read_text(self, filename: StrPath) -> Optional[str]: + with suppress( + FileNotFoundError, + IsADirectoryError, + KeyError, + NotADirectoryError, + PermissionError, + ): + return self._path.joinpath(filename).read_text(encoding='utf-8') + + return None + + read_text.__doc__ = Distribution.read_text.__doc__ + + def locate_file(self, path: StrPath) -> pathlib.Path: + return self._path.parent / path + + @property + def _normalized_name(self): + """ + Performance optimization: where possible, resolve the + normalized name from the file system path. + """ + stem = os.path.basename(str(self._path)) + return ( + pass_none(Prepared.normalize)(self._name_from_stem(stem)) + or super()._normalized_name + ) + + @staticmethod + def _name_from_stem(stem): + """ + >>> PathDistribution._name_from_stem('foo-3.0.egg-info') + 'foo' + >>> PathDistribution._name_from_stem('CherryPy-3.0.dist-info') + 'CherryPy' + >>> PathDistribution._name_from_stem('face.egg-info') + 'face' + >>> PathDistribution._name_from_stem('foo.bar') + """ + filename, ext = os.path.splitext(stem) + if ext not in ('.dist-info', '.egg-info'): + return + name, sep, rest = filename.partition('-') + return name + + +def distribution(distribution_name: str) -> Distribution: + """Get the ``Distribution`` instance for the named package. + + :param distribution_name: The name of the distribution package as a string. + :return: A ``Distribution`` instance (or subclass thereof). + """ + return Distribution.from_name(distribution_name) + + +def distributions(**kwargs) -> Iterable[Distribution]: + """Get all ``Distribution`` instances in the current environment. + + :return: An iterable of ``Distribution`` instances. + """ + return Distribution.discover(**kwargs) + + +def metadata(distribution_name: str) -> _meta.PackageMetadata: + """Get the metadata for the named package. + + :param distribution_name: The name of the distribution package to query. + :return: A PackageMetadata containing the parsed metadata. + """ + return Distribution.from_name(distribution_name).metadata + + +def version(distribution_name: str) -> str: + """Get the version string for the named package. + + :param distribution_name: The name of the distribution package to query. + :return: The version string for the package as defined in the package's + "Version" metadata key. + """ + return distribution(distribution_name).version + + +_unique = functools.partial( + unique_everseen, + key=_py39compat.normalized_name, +) +""" +Wrapper for ``distributions`` to return unique distributions by name. +""" + + +def entry_points(**params) -> EntryPoints: + """Return EntryPoint objects for all installed packages. + + Pass selection parameters (group or name) to filter the + result to entry points matching those properties (see + EntryPoints.select()). + + :return: EntryPoints for all installed packages. + """ + eps = itertools.chain.from_iterable( + dist.entry_points for dist in _unique(distributions()) + ) + return EntryPoints(eps).select(**params) + + +def files(distribution_name: str) -> Optional[List[PackagePath]]: + """Return a list of files for the named package. + + :param distribution_name: The name of the distribution package to query. + :return: List of files composing the distribution. + """ + return distribution(distribution_name).files + + +def requires(distribution_name: str) -> Optional[List[str]]: + """ + Return a list of requirements for the named package. + + :return: An iterable of requirements, suitable for + packaging.requirement.Requirement. + """ + return distribution(distribution_name).requires + + +def packages_distributions() -> Mapping[str, List[str]]: + """ + Return a mapping of top-level packages to their + distributions. + + >>> import collections.abc + >>> pkgs = packages_distributions() + >>> all(isinstance(dist, collections.abc.Sequence) for dist in pkgs.values()) + True + """ + pkg_to_dist = collections.defaultdict(list) + for dist in distributions(): + for pkg in _top_level_declared(dist) or _top_level_inferred(dist): + pkg_to_dist[pkg].append(dist.metadata['Name']) + return dict(pkg_to_dist) + + +def _top_level_declared(dist): + return (dist.read_text('top_level.txt') or '').split() + + +def _topmost(name: PackagePath) -> Optional[str]: + """ + Return the top-most parent as long as there is a parent. + """ + top, *rest = name.parts + return top if rest else None + + +def _get_toplevel_name(name: PackagePath) -> str: + """ + Infer a possibly importable module name from a name presumed on + sys.path. + + >>> _get_toplevel_name(PackagePath('foo.py')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo.pyc')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo/__init__.py')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo.pth')) + 'foo.pth' + >>> _get_toplevel_name(PackagePath('foo.dist-info')) + 'foo.dist-info' + """ + return _topmost(name) or ( + # python/typeshed#10328 + inspect.getmodulename(name) # type: ignore + or str(name) + ) + + +def _top_level_inferred(dist): + opt_names = set(map(_get_toplevel_name, always_iterable(dist.files))) + + def importable_name(name): + return '.' not in name + + return filter(importable_name, opt_names) diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..656e7acdb6f6d639cca7ff85933e0b34c3d123d5 GIT binary patch literal 37055 zcmd6Q36xw{T3)?ZYgeyowPi_`?We`=E{{}_-FnM?clqys|NY)q8y_#G@b^={`>1pG8>!Uq@gn}0!^JTi?sPhpvQxIv zOjY!+Q8DD&teEnfuB7ERQ_0A0wvv_KTqP&J`AS}X3zdTWj#NhEw^%94?`UOIe#a_f z@;hD`m*0uXg#1ocCT-JBH>X;gDw|rz%4Q>ldzt1;>yFADtu2);a-D77+1gs! z+S*px*4kd#-ny%Dm)y@aceL)V+}*mTa*tf+oA%Pi;a$aoS-u2rg(Y~#R_8HXKaT5d_I6xvcM8jgaOVl!xy#;xJ3H|HVO-s9 z--D}raCHP%_u3Y&EawRF9>w)edl#;EIVD^_iR<0=9$fE1?qj&R&%Pg5_v7j~u4e5y zT+QL?DQ7#bOZEe}e!$u4Jh`4(H!3G^?<4kJ+}rCMMR_NkQ_fL)-{(!cZ0~+h*kj z=W%)eG5c{meG$3$JNuj`wxv)mYdT~t)W=8mg4>iu0?@=IO?Y?I+h}!~4l6AgUcp`Mbd=+|I3LG@w(3?}ZF{xp;Kl@BVn*Fq+{vSjs#WWh za$e!tpw`R_4Y%v%U#xXHjg=*@@KUGSXs^_oUiz$qUe{}Gw>0LBokT9xSXkvlZ#sUZ zi&s;Ct~cYicfQ>{-CkX>Pbt+_-k2SKc|3mQdSlK?R{>=0#!43>ve;-ku2*W0F ztetz4vm|flfi(qn4_@nSf90ZM`E9VS)?90)-L)3kxAHB+%PFV3s#fYmt>BO6CXN$0 z+%Y7!v6fm+eJ=F{6UCbIy0!(Z2FF5XJ1eJJU6{lua3 zA9K;)^A|hkPqweFG}|@XJ^wTY)wP}>q=0QJ7E$^95^g#xSI)oCSUB$j$@T@1Jg+gO z*;o+tCz$tFtBsXLw^}WCu6g-t6=PkkKFSWTCn=-1W7xo!{fvq3^96z+>^?hx-nee8 zVJ_Y>=7EQqnp$#inQAYxsRx*_b2=#p_YUF2L3LVw%II4TCzY)?LX$f)Qqd43Gl7f*jC(@=N zn6WXsJ%_AGbi0wY&6~!J+|5)a?-T^_Qb4p3r)ZDbIXnNRfvZuc=#1F~Am)f&6hs`i zv%r`!Z{(~~=e%?5+BX5bMGJq&EmtUkCDX@}>4R}!S!^r;xj;XZAQHLP}JK zJ9_k}JODzptj3BJ7F||O&7O-ct8R^yrgTVNE0@cx)#@lr(>cCelKUizbA<4bS=XsQ zIJ?)nQfsc_YB!Ovg~qv7V`-(W9DDYC-l$netOwsO(*iOb9GdB1R5wdvrm({x6Sx)i z4NWCHL8lwa9n$CUMS;>0YsGn^JBLDa4+ug&D6`*^RrfvdR$1U6w_-4=MU4!)8kB|x zZcxq8k`|(p0(iWCNr?s@oc(YOj#twJL5~1(?sX}t*ODKi$vGl}zRSx&WC(N0sE1cF zyn5V%Vh%>d$hd}i>q43^*Z9ZtEDoVM+i_wWw)tj?v}cXv7u5c3^CTu6CRApAfMD@e zmj_AGTI%&ZBv;E2Fjoy_;>_rpH`4gc+%#nbm>mExtUrw*UjsI+x7Gs2IKXQUeBy$KpTylM*E{U%aKZ6 z&#q8!M0#ij;o3?$rk5wSu!^%b5&ODW^{2C3Q^Rl-!ylaLg(pWLmXu{bC>7 z)Ny3FjKih;lQOp$8KYp#AT1iE(VK|i#(^L^XYmRABeP875Y%NUYpM1G-~|-EX^d$c zyKU?)8R`W*R4*~<iV=mzvODnhCnV$29A*Y5p=SyQlC&I|$>Po%aZi7DNef7;Nuq9B6Kr*FG(?PkA9bVIq)F^6J z=a_twNi;Dd?0*dp{w@w75y1Y549J6t|J+~Z@`_IfFrWPB7+?8aB!MjXF;E05FIt+c z~YMLF=rf4CLnXt z;6deQBD_PB2k%Vc&Xj}FBp*#5yt_%8Ju1`M+)>%A%^Z~(ZQQ8bq0JhVE!v<_xlqh1z91iy)jfaqi4DQF638gW;jrdj+Hm zqvHA#^sM7p7rLS5#!L|YT?@JqGOBA@UUp>y9KP7?cHBez_lE^S31SW9wp!ZncAR=+ zu>m5&;`htj`?RvU|LBFPlt7KG1rZk$M}%!=jZunz3Lx(U0yQVlk$K4W!R*)PGQE$? z>Lxj5t<)c?b-T(sNA6vFaIYo52VYMR3O}b*(f4*F?m3+@OVXKmmUtw^YS5gU)pdb1 z>9d2gnzZzunS1igVcn{u=gwa(zy6WZdG~?2Lrn05g~sleo}A-dUGmZM=gJS9f1UYD zPwt5rt(O(LH?MX8=e-Qo{Zb}+tQ_1{b4co<72?rA7z}cw zpC{OSqM;NwD4X7(Y)YZW=t8`_ks-@pH?EsqD2#Fq5va4*rf8JK6Z3kyo4--$jzAzX zZ>G_yT<_aofC<1NuE#LjT2yVQcTm1$-ZTUwt!Ec80h-sW8nBf{B0&Jk*&y>UXc5Wv z3}b16fqN}&;6VAcuK!lqdI`_f)rRZr4NC~KIl>ZbtG%!cA-5c6@N&A&d1(JY4lm^y zZ=M!Np#!J6;|Ho#g~0MiERkB{y%oF+wb3 zmZ72K7w}vZ`BZkom@u{*y~)_9F^8H(mc+1;Z>4bve(k|Ya@f{jR9ZFM?a!sY92f_g z6$2=^CXKn3Q60RZq;(-a1(pxFo5U@7>(}v$2>&T_!Wc7pn_`XBK>WYc!WNr$l?l8G zan>c44?g`Z9PyUK!9_3+w1X0xK#I(KV@P$=M0LPR>>@z$^iA5vGV{Ik`KurCa+*-6 z6%+#5JPAV2R2Y6R0~_{MJwJyv{~F%?k2vDZj{{OyF(9UdLrpOyA|+J%D6VKSVyHzt zRTq)?5{kZ&97~8W;0AxdHgN8zjHx8P@o55pted2aB85vr_vzFk)J^EIg*Ah^E9gSX zSEoQLAUK)p5Pi|6bZrmtG@NS@zF0D=VEy2XUTT0#(l`W`gE<%QN)mu!f~qf!F1Fhs z|H7tb7iuaJS{J}o4=uF8S~uWGQNd-u8FR5RwG7HUuc+0C6zP_PFZ@;OeXlZOjR-o{ zCPniZDVuZ}I`xKa`d}^B2zF!`3;kdP=&62WmT-L&b=4|z>Pn@0q40Sh$Nnpx z=?OP8ZS{m|QCDT6OMlPffr&x_F(6JMsljYa zV02~FgFpw7UJ7&|z?r4`T*Au=ZuaxDT(#PSxjq}KI!@j6(+^QO$gl3{r`glDnDkLI z)aYEURtp=}$ftGEu;7p9M6nY%#1Ybk0<&&>IasF9(caEzaC~{ewQ3ZjTdmbDU1DVz zvnGxMsp)uf#F^xyLQIhBYbVq~SIY*~>S(O7TcXP7w+ONfU_(A=F-`xz>&ApM2AudD zeB1an@tgSqO$^!j-c(eqR_%L*zy{7UO>1r&r43Pt&I{NJ;cuB>YYV6~WlkHJcXRLd zl0v1v{y*yn` zaNTKU{U~ouR;#rYc+0frgiZ?6+=fT$5|b-T9%DkeO|_WZ$%L$1U1#!@OgI_TS26i} zOx|YlStMQ>b_(?mcp0I9oXO0z@!<0~#QRq?GE=lUW$q}zKu|EJ%$alncBiSVK4!9o zOySN#+W*ffzFo(W_#>@6hQp;q5@_Yr$!)WeabS_M({M>=>?|}}>f3o}*sxE*uakxL z9QW*uChkHT7o8f~xIJ!9yh-2Cgfppw5O6+aZvwJSd!rGqxxEv@?x84$vjuu^v#Bl1 zR(sKc-w+p^MlthKFweALE`S4}5g!~Sjsc26bQI*GwXnB^@&{)C#9l~5>-c{Sb2*dh zrmr0^V9+sA-3(X<=J+R4E9L=2eo#8;JrRl~Pdik%5p?hW#b@azu;u;Xrb!Lu;^A-;#Qc8&IQTrA4M3;< z5gt4d0xc$Kx@Fy-4+XWHe&>-G*kYn%P~?Dk!^uJnaCabCOVETHkn3)W+NLSPpwp4; zq)+swDELJEy6H#6kcq9at+1tKxy#vU`ehW{b%AqG|S1e(jDZ2dp={m$qn?rt= z$Nfk!)9xWnqj#1J2`Q-CGW3_%bONQrOd|Oqq-rPF zIkprY*mrxS;oTboQf;&_#i1qMGT`vZA$5E!?j2_x>=eDMWAF50A}Ux>IC%4=O~V8) z1hQ4#X1nV`w4%VJJ1AZV(oZc~ZRgnyCO4UUjLAP{@+uQHBG&mxcp`z`%GPm+;IhbM z%&CzAoOLrfeH0l6!(4S7i9f>Z7!H>$352A;bzvi>&&k?pI3;rUh10^$;x~uiO>kr6 zAtad+{*tBOWRJozK}Q8#d(P?aMY6H6;4A+eTD+@-$(lpUDfD0VsRGn^mcZ&ySVQ$2+i;i*V{J45p8m& z01*78aT3Z!hjF3ZSwufdMW5Yz-CQ$om^V|efgjnBjxwqBv;i*hV9G5Y5Glz>eFDFM zS=vyyP|B?|e6R54cO5SSC3r<#%YnMX43K)d@FEX5!ba#?mT7(_K-!c6-S>_dY$Uoz z@(eOg_ATrWCy4IP4fN(FdqYFr@ZRhl(i_<47Swm6lz_p1FV15~CX{4UnheWEO zYBVflcMddK=Nh0Q9EB4&M6-lUDilPFuSRdy=TjO1_B9)q9AEGi-){FJ4BkWyG?8@9 z8`W^HGWc+qj-3A#k%Lr^!--&F)9qmf=p0CAo^>s{S!v0g7dD(?) zUB^}5$8%c4FCs3F!KU4dQfmxy(e(T_WPX;-nZOBj8*@ywnrXNe6`$2{B>o7jV>n!r zzF<;1uvQ}w5=yPjK*$WPvzTzyTQUd?C-p3-Z^sMsR3hmJ8$K5}<7FhogkQwY8k|8 zWRDy}6xo9?OkbBz+37DZybea^sl!2eba6O`tX@I8KMq;9jiW%4AHnOIbqtZXL>aAZ z&^oQN!-!2r9}B*a@n^T>?O1=KK_=v1XR(BD!I((BzEXfuR5Z7Ogl}5&RlOQw4H%0ydodWY?Q< zxVw-@bGNg(fz8wgyw=kSO0bsyF>_|%4s>fitaZ#xwR&3pZM=WW7eY8IZy8$piV%Q} zUuNT3XAXg2)9>`|{n(0xeKN8VzPg}TOPA|f>f^|(K7pi^m#B2iTEz6gTh>A(c8w1g zm=KNNSX+g$mGQpPeZ;SE8mkBSEXU}VCATsH#Ylo{-AW;-4WS;8Jp}5IJ${1k$Ta;K zoGr4!lsZyI&M3T_OBYS^om`e74+RE2d?}ah-Tj`UfM)bf7MAOc`!&`bG$>9XehyD{ z{Xd2?Cm8L5p?EzoUx;tVaJb|>EoY)+}*kLMT@%}Y2;!h+1+55fZMv=E~Ok&aGUBD*XOu*k1{w-(|;=;PA1 zqfpO3Bn|_~$0vuZSNuHG@|j;sfPl#JL^B!65vl!$w0~Q_Pld{AEJBpPDuBI~*yrgD zw-~w+y)!RV9aEfU4zIwP*oGLbmq|k*;L8G}O_{wdCu55xBC+ijSTLo7K^D9b*v^Ge zcv>8PzBDXyanx-_c*QCV9sW9ZSOnf`#Ju^5zNueC7y7&P{kXRt>(`tDO3AiG$v-gh&RU<3IkN~ zRfP?3X*eFmVHlt|@zr%|3MM|P-ytj$$dqV@tRkZFG6xG^z}SeJ%4si_!e+7wc32$k zGJccyhG-eDtp?n5Eni|ytjsxNy><~UVIsej8I&`dM2bXJ;pD4}b>CXRB$DMYVXi|; z*Z3+|0*E=*ucroM^$I+C4O@#>j62~9re*`I3?T9$&JOXfXB|)Arab05{?Z@2?AwNO zUNNdmeIv2)n~-<~j7q(YY#NwS47Q7MBxCw}_BI1rAdumj(EwL0Q zXJ(jrKt!PUG>XHWM?#AZMW~zRXJFY;JJt-fqYL4QHuASpoic@{#Z&|NXp;R5?B~nb z8#xiM=tw9)7t7xi1G5NFxf(6lfqDaY()LXgKj>Kkm2~`#j%B57)5nmw)Bg;@daasu z;R534NYgG{urLN(qGrK!d9|$|U#O*3y@-RugM5$}SFv_tWhor(8gKJ;KjMuecgVkW z2qSpmLcCpiu~_*;RAXP9P&hfns{i47#;W;8Z4+pxja}rP##1F%Sk8-v5+FEMSa8K_KbI$R|7g%-AooLw9uGmnA$ShkEY{>*bG?zU zW9k`{TY~IuJJ2!^^4DMQzsK_*V!gCmrP4XN%hSEY_?Cy%o`4X6PYB5XJcbjRy=e04 z?2t2rW%_4aha&4(7!`vcEJUw$L8K9aiQE(}LiFbFK;(46&q74j=moZwfK7zjuizbE zCzg@oElswqs|}Fsi?u5bDKVqB5PeC;B$EXZtBv+5!tWX1*o~|}Eo@60OE~|Fq-j8$Wgwzy@P!i2-;kJph zK2j6(CoyWAHpFciwIWVv`m<#PLCNer=93wY!|Xf&HrqcAePX`P7Rz3SxiPKTyrCvQ zN({dipn59Z+mski4$eS32{~yeMG5WVV6d+c#JP|lVsT^(GEons@2_MIloJ+O#_TAZ zffpa&a6`iVHCU)3wHKQOTK{tN2& zH-h&4c<@`XcF!c*?ZauHx#4uCGgbrqhRG=nPDDD2#n)3XoP^8G%iTA+z*_n-v{yt> ze+W?3PGtGrusvpPTcSPjG82s=22hjbulpPlyYOjv;BAohH%B1sX^)`@da$d(j-;bT z80v}Wb>l7L2G+-PPU05^c==7=3}OvNY85o-G}KB)Z-X-Qsd907Ow*S`7T5X{yL@GU z3{L37z{_N@;RgHifaS6FrrG-*CD-aqHl7WU%(R4$qGuJ3P zW$WcrCtiB_q^3(~&pxW!P@@%kfdxbeVX^ngYaAWi4&Ofe(#Kvtaq6txCQ)^kmgLVsubv<;(~m}zH1Y-l;<#ybSKj44m`t>Quhj*R)cs@GSoco;pY$W6A8gyF|5h`U$I$q z{|9Q^V7LMY<17vdx}dD7WhX5B0MIed(@8TkJH)Y*S4fKk2iHy93gTYA2lp9yPK;0t zeD7miUg2=F)>^P@N56#f)TfZ6ckI2|?_O#kh(@EO3{O0c!!L@C6|SWY1fFr9ABlK3 zu!v!Lu*koNL9_hfS_5i04@?_pzh|H(z=tU4Az~osq<44xE@m5VVrh#%Nxi#=7UrnEwP&D(gOHK~^d1Q5$;;@nkT6;COR}gbQ<%Za=^JRa zFox$*_$@zdX_#p9r+A)6OLX{g1_I5_#E`_{WnHE{NJ{bZE$*X~ zUQd4pJyQ3)Ww^U+5R^}+z)*D1Ayx^HO^8DVLaLox&VUG!@8xSh2^fd{l8%St7$de+ zi#4mTG)%;Gj*TW7kix^)Pn>-fdxg%x@lR);JHTis}8&{_qz0r8c^ z@R7kvIZcG?LAHf`j2tAfISDL2Sfq;hZ!A+nYorJSx*nrEcZ8|^ZK=5HJBQl6^ z>{8hm6(1TgIzZD%6W6U)%|)nO`1&j4l=2pSuc`*D%PZE^z!2uoK=PCjL|k>)X>_9H zPQo#;AgZx+5rR2(gh4NZlE|9GCLFvkv5AyJv4A=zf**HXut|YH&=^=LR>?QXs2W`? z@FOvbI8twO*rI6Auwa(DV3Oi-I^=LXgu~@TgZ6j-b;uKI#$7H@|vBL0d>;!aKr zDr=dn`Ilo1b~&=))EJ;NLzKqbnO$FYeHUCsGBLX-SaEjhH3T`0lmQLmRONDo?nR%X zeu+7S{QOUxO|WTXbE(l{hL#Vw)3dq1$mM$veDEeFrZJ(wfI6kY_Pis3! z%U&TKBrdvmX&*Ew>|f)!kk-T6kp*|>obpl`wt6go$J*Z#LXoku9nG(|6^RjIZxL6- zXzFmbMlx-G(N=8{ghw(4qy*vfAP^uj;q;Bo>CqV2)Vn|y@MJ;iXK}9R5Yw3bzj@iG zOaB?}JwWs&wx!0vaFW)=IKv5MmCv9D5SB8w&7ELEG){x&+p|N1hHw z0f3QhxU`YjUn~vU%s~;QB0hzn%KCx^xgR76h!c3U2lss0Dr0nSTVf!ml| z?iYvDeR%SC*!whshmxjBziETwV;V0?SI2OoLx-p&Y6WrpWq)I_eQY`!u$v9wdebU& zlbG-=V#l+-BExO1 z+D^yS2ALp}m|+4S=Je3_BT*Wye<}nc_ATkRqYaMDfV(bKyh%riJfbcDri7}mE_nA< zK~12#cdLnk20y9ly{rTobmZi5l!JD2lvJK`pbztNxOX}Px!I@YYy^n}*x6>z8;-Bm z%|VynOnpY{$oc z88k4YGS2{$+DeD<@6~ihtoPQ{_G;4x?P@ma;P<5S%m~{R{3)uYm*vxB=Z~k%GC28G z>djTgCSr=U;dkbiHdtqHrJ>p@%mVtQF2N)d$t#eDT$+$5TlgFOxMk}_RwXf5FduO1 z3rHM{7ZDLIY&@_EyX7Dp5*~JnVc}K`L5a<4dvz0PDBX&NcqF?bQig4Z!~$Ym7JDe>0*KBAb3_Oh zq(|os+4U@<&k2;ln2MGmilj#M_5|a~J_p(S3y{X4dG?CZW9!HfYu9aKmqy$YUhG3* zZ$flpbi$V9`LBl9Z1kRsQ_b=Rnl_P)lq@#Uexf|Z!p%5jgQm4qCubYiwSWTCTxeF>U{OoNPig_8u^V_|cwJE3Dq)JA?@ zB*@#wq1(os`fAkIGoP?}S-}HvxF5zHq41*ldYNVHjRR@!C~m{VOyq}8!0C8c)hVc4 zDTaV@VWlmGB!L9j8`n|{maH)ICkRQBcA7z^aExK4Pw&~k4onl}CqSA&306u|#9Hb~ zYKH1&y7zX7i=4+|lRxlSFrVpubs;4}oHUeS617LD$pT+?7A?J7 z$^OAz9d|$U@T1A>w+%!z9urJN?0*_ls~;=JSv&5d1!z|-M9SP>4}ghM5l^b4DQQ#3 z%C15{lGHTE6*~l{d`yr==q7IBU17Ieg8E!I#$$!_SOI@zTn9h=7|)mH`oqm=-NTCH zg}OHpM7(K=ql0+GDI#ol1Q{crpeRK;!v0tJU<;F9Ve%@I|GVvJ!b2!LcXx0Fp0A))=Bay7Xh%;I*!C2 z3C%Ga?qMYHAUkY83?s&y2)@N8#aJ`BjLlcqQ;P=oFhbB-24QOCxLE{~jriNJ()HbY zPNvau>qR)SXtmaH1W@=pLG%LzEOB^~ErxP7xC(t!dfQrGlOAX+hvFCx_aKsZW4WwT zf}>NiORR2U7$PlAq;;jx+aAZeWQarUDj*)x0IW~!i>vSz5->nNf{knagpq|WUAU0w z#a!uv1ZpG$E5b+uJ`P_6J4A@RYF`z?0swU+QUp{dj7v&_D14KaANU{#I|e9*nNHEv zGnhs6CtsAHOhCZ{GYAq%_@;WM6HfxR-amC?F^F{ULh zF`&?Y>9siH`bQoFI<50zs#~OT!_YwrAUkggoOq`tU&Ot) z!hsp--TNK`!}?0aVWeMsRyoL;QVRtZqR;YUbw-r+*YSYZAkG(1*3nF^K-$RrA3Vxu$kW>W4-v+e4HXOb_ozADKMCZOZl?_HwV84yLa61#> z#^hCs)eId)GMW|EPdgl#0GvU zXi%^)W1wPW)`XMZPHym9O>r@ut`=j45f3np=ds}qDfoAX6>>e157v-g57Zcv>Iu{s z#BzXh#N44jfF}|i7O&q!fF1#!BvoF43J+<}_YQ4F@N_`cAZnh#;WniiU1(yTwXn#B z+Y_gjGo39oWWC?ILwZc{9u|1QR0DJ!lK+$Om3>P9?JaX&wNWRQGBLQq8#(m`BPzL! z%WPxMOnNbC_9wW#u^wEX0U`}EnR$ia>G!e!+Gkxf$`Io3j}J$XD**>$TsRz**@EF< zm=>1+)36Sc4Yq3rVo0bKl``xGZPGU;hQ2-zG4Y8qtINYe0)L5K_y|yOP4P{Hk!%Y* zBozA6iti}&7R%$(O5qnv+vpA9sH#bgfk&7JUosiMK>9@fB}!1A!bxu~#J@P;B9%Vc z+&S-Mkfjr$nOC4WUwp`n4CcOxSnyL|I4DEMd>@EcV8PO|8>p}k8`U1X`NJFtqE`y~ zGNQ7~-W@|*H83+c9D3)=pGhyXIeKLyl*^$%-X+m}{5*ys<$%Ha+kwACw)Uw?DT zXwHwbIRr5TtjVw;`lSRmAaAsK^&~EQ>;}|>S#i@?&JMxx#OhTvI>$)sm>`JNkL;3{ zf9b5=RAiR`n42GKG%vuOB)w64`DC{zlPk8k zgv@$rv_=GYuNXx^dYk&o?B~aV+P_Ssw9p`~o-guW)>RkHtvKHbswlshw!KL`?}keY zWKAJ^I)e*@YfNDv@Vg8ivNFXbA2-07uw)&~7w7=QQwMRKLk=KCEJx1Ikrq-0-$NvC z6x8D!lH*K%1GT7s$K*GeyvgJcA3TKw3e;ZQ;MY!c6sdkuo=5XjrY0xz?-2^5d#SYf z?u0q@B{T2;W_#m)zcm@2A6(YVS*yu}(1oaYIg>g#BY%l?5Jm-K;trXk8&CCP$QDfX zV6QD0X0V9_JTxipf~|ctkeUlP#}*PIHIK+P5|pmVtw&`a&fY1JfRED)3}l47tUDqC zGYk}ZQ6ct-hREDTIN?I`+CCz>9jHZGn@N8309}b9kJv*kj$(CMYBi;%Iq&F2B{Sq& zc$_0-P|ooUwt$rDFGt91&?9<;faK^6Wsp=(|C}(?f)f_n8X4|owdsuCu?RC!MEJ*Z zN;yLI7;r_wN!zP$rWrbP18cg2y;%JX#w`44tMx;0iR-vx9njKgA_m>YP8!tdT?=a= zVc>zs9Qzf8dS)+oZeJCfLo05qqka@s0vmhyfpvd%K|O}Mj4;t(%P8S~jAID4kUkK+ zS`@%eP+<>)#yA7gKsfmVXC%X2*iEsiq&^X7vpO8EAND=YM_TQKsLl2E})%4CWpx>+!2r&s@2J`_9SlUr z4dqqd<1os8LF#Gtb{JhCJNRSbG-(gD?+h%|+;XM}`*blc6S$5?i9ZhYF&yqmBylRC z^>Emg@l6rfmD3Oq7-gN6?=Q*Dd}6-Ex0vumzPAKQQ6Q!8rfFlQL4wjavEsS>PwWNz7$d(gBohe#BO8k4F5 ztP?7WCqkrg8~M0W=bm!>A|C3F6+aoB^+F2hSWu8RRKym)S;Z9OQcC`I%$T;{?M_p z+b{&+4YoX^2m#ebbZ9~ge%})z^$?Iyi{3|&NZD9^HUuCE&<|6ob3$7BWhfaLiZd9Q z6R1X0OCzlRd7eolxDii@jVK^nDlIPOcYD_RH6`hsKp81^f>pT_NVG|(A+FN)=eAMnvLO{L1WEf$8 z1`jr~31r6wGn1E~?svu}gsk&v9S;(Jg5kI$R<3}o4{TQy?AF13HT0%M*fVUouv~Ns zRcyH`JBD$4Bbr;WW0*4`*iEA=&9aluls3HLe3O`1r$PQFWH!#LUqI~%y2!x^2Z&tN zw>nDHSa0z}ur%6A`d?!1mBbR(=rf)H-3e^%1M>?X9ikA%KkhO0=crr#5|aqnf`{a` zkAy>=X(vw%4y1DzxmpTHqrV%k!=h$SaASkHbI8b8&P8+l5w%LU3* zZx6FJ9*SEJMe|J0%jQ_>yHGL|IkBtAE=~v^JxyvS78Y;Qv+nVeK>)Zmx_l0Ac+<$% z_W<8Ub(AcxXs_s;0vRz+h|WQ^h4p%`xK1*$YW3g?UoKf)U#ECzWAtqJN;k`3{$$?%P%Lz*5_WW*lQ z5p0$Xy|7 z6p@co6jf))Qtvx5uz~eyJDXUO=r|)h+r~sNS;&w08bu+B{6d`Y+E_{q)p0>=(8k76 z%7zcKxxze+sr(E+mp2U~>BK0Eq#`+*-ln(~B8aR>J4z1!c#d-7S|L9^cpdx^Y7|DE$00*N8X()X z$PU^>aRKorh;LE8&=Y|L z^HY!|kY8z#;mVXiY(lN^T^D@lKw?IJ6!AdE*?oKnD(uG7>mh)0l5qe)A-5;p(0-U@ z%6>-g4+HS{3VN_P$=^JXUV*~8K_g;QE%=h2Z`ksm%<6ywN}0P})yw&JMSCZ}l^Eii z%#`~H(P6;kgRcyMnU`=zhMJ;;Iv$08gePs0GP4fgL~~c|sHMQU4p*&KJ}JvkNnOq* zW?s5xVle$^m{VNUFCW+pzHlHm6Hd#4xTPSNM)p6_+tkA;0csRPsag6vMO>0jYFASS&vXWuokX{#{&v?!S@8?Q8Nt8_rEVr4SCLWw9pi_G}y|1t`w|J4ADK7={@_w z;Yy$?!OFwsF@pq3_Lz9Z1Lt)ppc=BNL7-qSB5yy9q~DTfz5wnO)z7W|5hLImm*UJYIlXqFcSENaAADypBw$;- z{t$4vDabnjoY)czy<-?nUqczal8tJxuUC>y#S6d!m(_;;?g+pgO23-UpzGMvFkCWL zemQn7S%DftVD8%p0(|g&Aq4Ug0$s_drevK?+cGGMe5Rzc zOH&rysQyl{;65SQ$p%TrxAT4h@Sv-d|y_~CQY9S$b&3*RBxCttn|q#B8B z1RNV01o5#B2oNQB9kmZ`7JRzJEhF+=s^R0#r6qp4-Y3#-zbQA&2SPX30AgujZH~3= z?Ju-^)(;)kI|(w6817Jo{#v~YN+czQ-xyQ>8SpEOAhaQBpEv49Z!*$Eui>ze3yb&w zgQ~y)t8DbXO^KUu2}2jbW=@C6gm>c|Y#4#!)0I(llgq#aNTfvA`RvkCKRMci2mgX2 zFQR*q9@-iBWEJlZ%mHG-2^^y7(}vB!sLq&e`WpdYq0V^NUaqCnyC3;0{T1F+YfSpY z#@Er{Ut}9dds2qtwfY8}CK|xXnL!#rV;Ri@pM+9QrBO|Zln@mm8;da-zjzFF94l)X(Z`3HX22*UA7kq>*oWGWmqsD#RkkeIdN_9Qgr)x~ zyC7CJ>{6f>kTubMTt~_Rod81>r{eV7j z@ZG=ii>S2zSAKba@R8WRPSeYs?!|Zuiqg+c!&im0C?a*bm& z^k8x%w8C4$gMM6_9<2U1iFLx(vCgDuz@mOo{S^;GZejnTJ<uo8z86b5 zu3ziQegx7>MWep3YrWS?T7P+9gnOkCkgjsVmdUIYn=UuK|6{fxhqqJ4j0sVQ_evkr z7Lgtcl_2N;#0!v1baYQ14=Z`xZ*>p`$H7!${UA+Nqe%Egnc!3EirS>!VWwCO_pH>QnB*f`H5BbA z9@qELs)Mf|_yMNjdN#G08OFnFGDt<)R&PL*;}^2&Z@9CU$h;b3L>MBQ)BHvzBd3nw zLTuuNh=a|F^c+2kTq*YrB=X@qSi3g(hlzB`*qWO{I)$(&{co9tsj0Dv;}dsHtxY{R zJu^|5*gW-jQdg%AOzfZ7GqDSc#&%9UIyEv~m>!ub@}u^dcXA^WlUql&7PoIIWM&Fe G+x`y*ByFSs literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_adapters.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_adapters.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec88f5cf3f1f1b96ae538239cfab5a22d848d323 GIT binary patch literal 2962 zcmai0O>Y~=8J^i)l1qw|WaYz+nLF&zaqd#L#0ebSex1ebIyvq++NsBJA^SLwg&htL+^D=I= z8Vt|hzWPM|xz5<%sq^|%Mduz~U7!$5@RWsZChD@%U+gcPxZ#rETddu9g;Uwa zD~__wZR0_n3MtlNEzxThN5xT8#L6UbI(qQSL6IiC!~`38CWAZ+lr%$?1qX3DlsZUs zAY`FrFE&yHaVCPpBuxVqCt3!-mPhxM%9ZZCa;8UV6ZiI0c_7ms+3@;PnRaxFhGc|8 z=tx(3va$<={>o3B6CPG&t?&2i!ubpTlI?Ke3h%TTHbg~KPg%H7j@5*J>W9s;T^9|s zTVg>pF~2C6L`y85GVHYcCG%K#1$Zpk+UHX1cvrR?wy~DRS|>Y+RHMbm+d5CBk$QDK z(Z>3lX>4|KH5e^ys=P0IX7!6Fk47zY4iYi_YP2}--hXaXJZe3W&xVPbO<$RJF)dXF zlvlQfMUg8&xH>x_tgRnq@gV8JC0?$Q-5x^$1k~Fm$IlQY{?+W4ahc3FA$^!beL}2X&@~_lUc* zhfpAN9^=)ED8}rJouiDvp)IBsFw}PJQlw-NCo0;LvA|i@pS5stPs?=2da>FC9Q%h< zt2eQ3QoMy0K979CsqdjNWe2!$3~mTMWa^r6PS}JQZD;g{MlgMT z6C=2XSIc7z8w9U##_TEr7|Y$! zduzFZs+s_56Fhma_UX-=L6QlXnb;(GW_e@e&s+v-`$j%Dhbk^?6-th;pc<7@qQ6Pv zsw(GyL6(&9BHS$FALgchOp25m+Z-NnUz_h#2QCZ6#Z z(47;$sYYkP{60g+b3M1-h~m&i(2&&eh3}Q213&{^Q?{5Y-es=5DMWkIaj*KFT zmcIN9jWK({`s@I1c`?l_Srr~-?=a%N;QNlcVVpA;wB_gUIAXv%XJ-}4$mm07#_&BZ zQP~K6D9B;1gdVwF{n6Ka)$*uawO0ni)FeeJBM43eI%r!XXT)i09VL;hARoq7()^He z7MPjFJ!C2MA?z!u6FO#JeUEx`t+aLI+)NV!Ww=c|^)7^<$(Q-){h6owI?pcHJzqnq zKqNh5UF0uCs7yJbKAj&^9$2OXk9K*42~F6sTC+B4zJ5S^g`^#MTtdSdQ8dWK5Z8@t zGm4%K<8(UXYH8GM+Mf9AAc4o%jqp?avs#IPntVI)cD#FRurhhN3M_bvI_32+o x#3|(;?5*C%cZyVMa`Cx%yyj^C&IHc8B(KwJ`0z7+5VfY~LD=Y8)qhs~{{VcH&yO256t?F_l4f^XQ7S+x2XkshqJh1DgxaW5SCj(^NQg@|mE|2fiMP(oV0#ue z+S^uYPy7w-asLhe44;rVpq{z)#CuM58`Kq+{N~NG-)H-KpDp(G`UKh^e}1k0P6+u6 zf3{l}ejY)0UxATCQbQ)>36Y6RpA(rXa!k+DNdl2f<`Bshd6mjsc3vkC&m{ec6x}zF zOU5PI?UrtS+yER!CRCD1BIzW3L1r|r&;x{sJIP;=j7&O!)(LmMwMwnTkx>U~CR*bU zbm_%sl#o7y_QTApifPZZV^TS7aVGOMYpgm^m1lmT*s}G)>$+m~EG7w<8nKuJFeU)Q z0)}I{(q0S0%DQsiwk0Ng&RknA)_HCl`3hCGR#$TXP&O_z?8n)o(TGXO9qN+{5(;molmvNV%T09|udQ@l``VgN}7@ zcffdZ1{L=7oE$^-&geN-FByj}pV@k)sv-^DxdP(64Y_L@Wy22VOYIySmh&PBnNwyK z(r4=Qf`%KMmqs|p`2~49fBen#XQ!;2E}H2<{cB}vA>H)JQZ$ZzC(38SFQ6P{y=E^>yqgJlPx6oeO2xaS~mZ*>Eo z#%K@1PD|rL=GAY0>qwE=yb;!^PjR8BxMbDG?F?ghT;vv2WKkRzWf^wjodEeRYH1mU z-*FVZ$PpImE_8<%v_}(aF|z6-@$5vHRuwrwy_0^}+2{=4uSjQzlcjGPqhj`T3xVp^ OwH+Y^>(#Q`AN>nKKYwcg literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_compat.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_compat.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23066f053fda58e32c803ec974eeaf2a3661d213 GIT binary patch literal 2061 zcmZuy-EP}96ecOzRvahjf^=((0pn6&n1|K-!%%D}iWVu_U36)IpeW|K&}fmi6-%N@ z(&=oZzyS9_+RMGgut(UXt_JL?uds`5=TNTGtYbn-q{zc_zVAE7Vr#2Sp#A>mRkhP3 z)t9aN6(@^wllG!JQob?cDZqgHUJ{5R`l zmJa>#x3B8?^=?=N;B2+A_O@z@vQ&kv&abYCYcp|u6F?gznf;X*)WzS!{ci^ktTJ{m zDF?UolOoeX+QFS%l$L)7fkOO%N22p`Fos1{91rfM!+}kmx>Dlzv9g0SM?ApS7~PP< ziO*s@B3!SW8>D9w=>h!_5^d8aP4Mk?WAL)3a1SPuO7@IA1u9R7qepDXZjndPQ+h&w z3Lfvu0LTm%zxnv@q{lUmYf?&+<|3JUS^4wd4Uzxl!&&$X$wFgAKtNWTV(@+2x0k(;EJ+o=MB^ZFJw z5yz=EHFa;v7*p{Oy1fJg#tt};Wgyv<=?jj+JXkV}{h(^cajxYoQ*m5fibqB-R1u%D zpni7BfR?HqBt1S8Zv)8eqhr6b#zyGP8s4@8E!vJiXjRFvXOv zg|iVg&QZU1Mm_M|tLFx8d>;lyuy8@qqWwUHl3|%zQYcsQe0f+ccY#CUc%eW;909VB&nOjy-hNt>I&(Z1pf~t@R#_{W;l6c4sbj^u z2i>A4(pRPfA2cu%3NyADTT!csKmnaJv;sujmlC!n4VlvkG~khc>p&AYJkjcYw0r~{AMC-CB_h-lbg^o)Md z8SMMGXBP%Xp3@hg;38$Fi4lY9B_YQoG@gPy8*`ekGcy`%KELJZ!U|5{fws#*2%iVOUeuSd( zsJmS;ZEKCA7^|k6mrza&f`h2TZy7Lx7QB=_u-= llQ*1QlT$_4YDHd0X<6hjqVUH$K@>z=(a!c})Na$=;9m_X8{Yr` literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_functools.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_functools.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..931aa0644a517413524df37aeba015dfebdd40f2 GIT binary patch literal 3150 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 gnMG5oE;(}dhc3M}zDSgu#< literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_meta.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_meta.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b5a22bb4993af7b182f19a62cb71ce9a8e4ecff GIT binary patch literal 2878 zcmbtV&2Aev5MJ(&wEDBGF%u1x~b#|8< zF6C6Z#*g6_@N4uj_Eey!Uitt%b%v|IT0#vclsV>*!Od(qGT9< zA~QQ2U>?ED7!YPK5*ab^3Bk1qYtuJl%eP|Nw`0e5;*wvA%YHd_eK)T76=Lu*vpx{N z`qW@Hb50HBaPqx3n_G{QL2mDc zJ(asZDJ}ygWNtqXGvHsQDilc&<>gm{l>ZvY+79?(ak1b*)m4wD{NKYUY*?5 zr!yMXKms+a@-@B=x>0`x|2+bCh;=#rp(fpLL$b zL7I8b(4IOHiPsZx+Bt+xo}6@^huuyVD!!c-{$!mnPK8ua*roBvw|jcElMeDSr4dgk zt)M$55Q7Y_U-*)pkxa|XZBQJ`B@pXrVY~nX*K;2wmtj|bN6VC}xV|>tC_Zrw*t||@ zPb4Y`lZ?_j?2Ns*HSfh#5L~g|^1(-Ya(#g(HA)Y;!VjbrT^~DgbKa4O+~rR@je=ZR zVAQ1)EJ{i-Kx2!W^A-!CcFW4`B#3!lJ_y1{bdQS&Sa5kfaQ#1Tac&iFaRbEUO(c_a zllnm{_&9v1!Wnb8cF`F)?_I&5yftq`eg=D6QzM_MFE4{rG>D?xQ=Ri^Jd(M@7=daw zhkI3TG=9-F?16IcB#8Pv^MWiBy)aOmdGAAYa%tcD`Dy6Yt{Rr1k(C_*|G&-@uM9FnfnOm6xfawYm$qnG; zCK3cgiHRT)G$kU4&J9_^6*eUa7-~q&H;Hk|-BgN{OEr+#Jmu#|rWvePn8p%Yi3>Bs zh`VITYQk^TGRX~?w``N#hX0;p5-r&Sq5lk2{s?CF2FMu881XHxF$_@vkjw<+vY4%r z?BafbaENGt%77Od;Sjeq;*IgGrqQF3SNEYyM|=+&`tX^4+s9rUCSe>zUe@nsT;Yqt z3m-ur-$5}?@^}4ELK1cd9&YRccFVBaN9-=18@i+;APeM``{enkV`DPRgjY8R_gI7p zdh$KS2U|a2#@f{Xo$>iqAVRhlSb~nMWS_I}gwp#n#x`b*&4|bb$XrrA0JfKOCd**Ou#$Ivy$yO?o2aGEIn|e4gM271#h9&~-R$Y1^B)>p{jRH}di5{gzg?xqk zx?sM+)wf8#M)Dn!Z6u2-lkxaYH_0g#5I^zsp78F7E0L z5{_+5lEMj*o%GXNhX7JB3hpu;R*i( ziqjJyk`x(Y<+Xqr2Ju zh2@aQH7n0w?QSQ%o$cP^hy4e}-70DmJS}yq3ZDI<*2yuQ`)Q>i9nGxTw6_Zl^{z?_ zjW#CGW;~F32F2J0oGu5MCEPvS)ee$*a76aWOY)2`qG^4P68kg_!DhUplpN8|Ot+4R zZN_`IyoLUrXswek)FZDj?m7_+FY3)-w?kYzs!$LXJeMIdInUBL-W_kbhiY5bY0Xur zr(B0Z6<2gvf;vcr42Q$yG)juZo-!PEn{%Os)kf3=yC6#rQW$2Q}Qq~)r zHjL|TS)22V!j7-Lg2}69l$k>V+Myi>)=-BCJF*0egAEEU_k7Mq*kAJex_=nqcZO za^aFydN>h0ua4a;W({y~(c0RwOim75M|siERohS(E~Bm=b&Q`RLXDHec)BjrVgmM4 z0ozi*f5=H0p5<&U#>GKyz%Xp2RMs4Gob*ik;C8OWER%QaXIOQRFn7&i&Z-l*Yn?xr CgD-Xf literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_text.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/__pycache__/_text.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f15b258bcc13dab7d03e6ec4bfc91428dc7b85a0 GIT binary patch literal 3093 zcmb7GOK%%D5GHpeTUKPpc{Go<2R0XJ0oT10D3H`{^FSUz9zflosH}8LEop1x)$WF* zY{zjVK;D?fsGg{4RiIrGiTH{|l!**byepMQUnn>9lI z!$J9}z~EPSbqg9n1dT|W2uHXP?K^FUl1D^TM0KBts&x0})l zmD_<#4GWTf$`!1TZw5SKTRj;w(~~TTqql66tB{*8iCL(vrNz44yS%*2G+SZ?q*k*h zqbOlpiHbzin^?BQnvbpU4=c19epdroESiwBr6s0MS)|!_r)he~BVAIZ7sFV{?N;*z zpuiCQSeVg^I*me8$W|@t<^pT7Eo>3{tJ3;J87W$Qp0)~47uag^(cNdy?&1a>r9FdTbu#`HrFP6^ONr1IhZb-<3-D!W07xnd9Ml&#WbCiz`uz^{rC;Zb7!$ zs(w{O2))cRf|7}~rB!zQpUHsr`CDcr&;jf)Ee+@kqJf4iFR<sAEa@wG52i3-JXSqg-K(OR#TQ=Gw3pTaS5AK)1bn5T-bR$gQ1j5wkh87Rfbp zyP#CbLS8XV8=Z*)uqH~heuB6;CPvEzHn8>Xe_kgPf!~@?nlp2<>`nu-T#DaN!?2KY zL`b&4v1ei4VBdxJKD>G!nq6{04#_UXc7v>tBl`S^X4NR!lIqCGDq2QsSrteGL!vIg zj!%EzzukGMp%Oa1wDTa@ilc-J-FXC+r`cm3Y;ZW5V|!M0)?re{o1Ld&w*yC>{60nb zy40PppF+V#Vb_PFoCAaT55AGxW-)!6P5FLgeBXk!=;_X-!u`cudJexTD@0WRx|+fU zE~VTP>yB!`5G}5Q#fQ+>r&>hmIV?I~Vo|>F{U>KyMCmy!x?f^3mcIY=Op7QD@PZvZ z*dMb6<7AL8^pNbqm24yG0Y!RT_tZ242NS3ZdTQUR4NN1Yk(6;Y&cxAzHgHagr0#(yklWz3`~6m zT7N_J!;D{_z*HzXfomcryBHO^M>nB*Ji7Dsg9PqpEE~qtRC0yqsjZ)1JgU&6Qwiw8 z8Srw9#o3uFVFA&Jw2TT_joE zY;iE?7~liEz=uQlf9)PR@7-PZpt4JLox@QDdezKPGMmOvr!bP)l+*#7Nf~_tticZq zuVR6=Yj$L$%4&VSZ3o$O$_>oK#~ncH9A1r>2)#P#Lax?P-+;`z;mv1I1TpVJfn{~y z?>> dd = FreezableDefaultDict(list) + >>> dd[0].append('1') + >>> dd.freeze() + >>> dd[1] + [] + >>> len(dd) + 1 + """ + + def __missing__(self, key): + return getattr(self, '_frozen', super().__missing__)(key) + + def freeze(self): + self._frozen = lambda key: self.default_factory() + + +class Pair(collections.namedtuple('Pair', 'name value')): + @classmethod + def parse(cls, text): + return cls(*map(str.strip, text.split("=", 1))) diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_compat.py b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_compat.py new file mode 100644 index 00000000..c0f15c78 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_compat.py @@ -0,0 +1,67 @@ +import os +import sys +import platform + +from typing import Union + + +__all__ = ['install', 'NullFinder'] + + +def install(cls): + """ + Class decorator for installation on sys.meta_path. + + Adds the backport DistributionFinder to sys.meta_path and + attempts to disable the finder functionality of the stdlib + DistributionFinder. + """ + sys.meta_path.append(cls()) + disable_stdlib_finder() + return cls + + +def disable_stdlib_finder(): + """ + Give the backport primacy for discovering path-based distributions + by monkey-patching the stdlib O_O. + + See #91 for more background for rationale on this sketchy + behavior. + """ + + def matches(finder): + return getattr( + finder, '__module__', None + ) == '_frozen_importlib_external' and hasattr(finder, 'find_distributions') + + for finder in filter(matches, sys.meta_path): # pragma: nocover + del finder.find_distributions + + +class NullFinder: + """ + A "Finder" (aka "MetaClassFinder") that never finds any modules, + but may find distributions. + """ + + @staticmethod + def find_spec(*args, **kwargs): + return None + + +def pypy_partial(val): + """ + Adjust for variable stacklevel on partial under PyPy. + + Workaround for #327. + """ + is_pypy = platform.python_implementation() == 'PyPy' + return val + is_pypy + + +if sys.version_info >= (3, 9): + StrPath = Union[str, os.PathLike[str]] +else: + # PathLike is only subscriptable at runtime in 3.9+ + StrPath = Union[str, "os.PathLike[str]"] # pragma: no cover diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_functools.py b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_functools.py new file mode 100644 index 00000000..71f66bd0 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_functools.py @@ -0,0 +1,104 @@ +import types +import functools + + +# from jaraco.functools 3.3 +def method_cache(method, cache_wrapper=None): + """ + Wrap lru_cache to support storing the cache data in the object instances. + + Abstracts the common paradigm where the method explicitly saves an + underscore-prefixed protected property on first call and returns that + subsequently. + + >>> class MyClass: + ... calls = 0 + ... + ... @method_cache + ... def method(self, value): + ... self.calls += 1 + ... return value + + >>> a = MyClass() + >>> a.method(3) + 3 + >>> for x in range(75): + ... res = a.method(x) + >>> a.calls + 75 + + Note that the apparent behavior will be exactly like that of lru_cache + except that the cache is stored on each instance, so values in one + instance will not flush values from another, and when an instance is + deleted, so are the cached values for that instance. + + >>> b = MyClass() + >>> for x in range(35): + ... res = b.method(x) + >>> b.calls + 35 + >>> a.method(0) + 0 + >>> a.calls + 75 + + Note that if method had been decorated with ``functools.lru_cache()``, + a.calls would have been 76 (due to the cached value of 0 having been + flushed by the 'b' instance). + + Clear the cache with ``.cache_clear()`` + + >>> a.method.cache_clear() + + Same for a method that hasn't yet been called. + + >>> c = MyClass() + >>> c.method.cache_clear() + + Another cache wrapper may be supplied: + + >>> cache = functools.lru_cache(maxsize=2) + >>> MyClass.method2 = method_cache(lambda self: 3, cache_wrapper=cache) + >>> a = MyClass() + >>> a.method2() + 3 + + Caution - do not subsequently wrap the method with another decorator, such + as ``@property``, which changes the semantics of the function. + + See also + http://code.activestate.com/recipes/577452-a-memoize-decorator-for-instance-methods/ + for another implementation and additional justification. + """ + cache_wrapper = cache_wrapper or functools.lru_cache() + + def wrapper(self, *args, **kwargs): + # it's the first call, replace the method with a cached, bound method + bound_method = types.MethodType(method, self) + cached_method = cache_wrapper(bound_method) + setattr(self, method.__name__, cached_method) + return cached_method(*args, **kwargs) + + # Support cache clear even before cache has been created. + wrapper.cache_clear = lambda: None + + return wrapper + + +# From jaraco.functools 3.3 +def pass_none(func): + """ + Wrap func so it's not called if its first param is None + + >>> print_text = pass_none(print) + >>> print_text('text') + text + >>> print_text(None) + """ + + @functools.wraps(func) + def wrapper(param, *args, **kwargs): + if param is not None: + return func(param, *args, **kwargs) + + return wrapper diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_itertools.py b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_itertools.py new file mode 100644 index 00000000..d4ca9b91 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_itertools.py @@ -0,0 +1,73 @@ +from itertools import filterfalse + + +def unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +# copied from more_itertools 8.8 +def always_iterable(obj, base_type=(str, bytes)): + """If *obj* is iterable, return an iterator over its items:: + + >>> obj = (1, 2, 3) + >>> list(always_iterable(obj)) + [1, 2, 3] + + If *obj* is not iterable, return a one-item iterable containing *obj*:: + + >>> obj = 1 + >>> list(always_iterable(obj)) + [1] + + If *obj* is ``None``, return an empty iterable: + + >>> obj = None + >>> list(always_iterable(None)) + [] + + By default, binary and text strings are not considered iterable:: + + >>> obj = 'foo' + >>> list(always_iterable(obj)) + ['foo'] + + If *base_type* is set, objects for which ``isinstance(obj, base_type)`` + returns ``True`` won't be considered iterable. + + >>> obj = {'a': 1} + >>> list(always_iterable(obj)) # Iterate over the dict's keys + ['a'] + >>> list(always_iterable(obj, base_type=dict)) # Treat dicts as a unit + [{'a': 1}] + + Set *base_type* to ``None`` to avoid any special handling and treat objects + Python considers iterable as iterable: + + >>> obj = 'foo' + >>> list(always_iterable(obj, base_type=None)) + ['f', 'o', 'o'] + """ + if obj is None: + return iter(()) + + if (base_type is not None) and isinstance(obj, base_type): + return iter((obj,)) + + try: + return iter(obj) + except TypeError: + return iter((obj,)) diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_meta.py b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_meta.py new file mode 100644 index 00000000..f670016d --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_meta.py @@ -0,0 +1,63 @@ +from typing import Protocol +from typing import Any, Dict, Iterator, List, Optional, TypeVar, Union, overload + + +_T = TypeVar("_T") + + +class PackageMetadata(Protocol): + def __len__(self) -> int: + ... # pragma: no cover + + def __contains__(self, item: str) -> bool: + ... # pragma: no cover + + def __getitem__(self, key: str) -> str: + ... # pragma: no cover + + def __iter__(self) -> Iterator[str]: + ... # pragma: no cover + + @overload + def get(self, name: str, failobj: None = None) -> Optional[str]: + ... # pragma: no cover + + @overload + def get(self, name: str, failobj: _T) -> Union[str, _T]: + ... # pragma: no cover + + # overload per python/importlib_metadata#435 + @overload + def get_all(self, name: str, failobj: None = None) -> Optional[List[Any]]: + ... # pragma: no cover + + @overload + def get_all(self, name: str, failobj: _T) -> Union[List[Any], _T]: + """ + Return all values associated with a possibly multi-valued key. + """ + + @property + def json(self) -> Dict[str, Union[str, List[str]]]: + """ + A JSON-compatible form of the metadata. + """ + + +class SimplePath(Protocol[_T]): + """ + A minimal subset of pathlib.Path required by PathDistribution. + """ + + def joinpath(self, other: Union[str, _T]) -> _T: + ... # pragma: no cover + + def __truediv__(self, other: Union[str, _T]) -> _T: + ... # pragma: no cover + + @property + def parent(self) -> _T: + ... # pragma: no cover + + def read_text(self) -> str: + ... # pragma: no cover diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_py39compat.py b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_py39compat.py new file mode 100644 index 00000000..cde4558f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_py39compat.py @@ -0,0 +1,35 @@ +""" +Compatibility layer with Python 3.8/3.9 +""" +from typing import TYPE_CHECKING, Any, Optional + +if TYPE_CHECKING: # pragma: no cover + # Prevent circular imports on runtime. + from . import Distribution, EntryPoint +else: + Distribution = EntryPoint = Any + + +def normalized_name(dist: Distribution) -> Optional[str]: + """ + Honor name normalization for distributions that don't provide ``_normalized_name``. + """ + try: + return dist._normalized_name + except AttributeError: + from . import Prepared # -> delay to prevent circular imports. + + return Prepared.normalize(getattr(dist, "name", None) or dist.metadata['Name']) + + +def ep_matches(ep: EntryPoint, **params) -> bool: + """ + Workaround for ``EntryPoint`` objects without the ``matches`` method. + """ + try: + return ep.matches(**params) + except AttributeError: + from . import EntryPoint # -> delay to prevent circular imports. + + # Reconstruct the EntryPoint object to make sure it is compatible. + return EntryPoint(ep.name, ep.value, ep.group).matches(**params) diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_text.py b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_text.py new file mode 100644 index 00000000..c88cfbb2 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/_text.py @@ -0,0 +1,99 @@ +import re + +from ._functools import method_cache + + +# from jaraco.text 3.5 +class FoldedCase(str): + """ + A case insensitive string class; behaves just like str + except compares equal when the only variation is case. + + >>> s = FoldedCase('hello world') + + >>> s == 'Hello World' + True + + >>> 'Hello World' == s + True + + >>> s != 'Hello World' + False + + >>> s.index('O') + 4 + + >>> s.split('O') + ['hell', ' w', 'rld'] + + >>> sorted(map(FoldedCase, ['GAMMA', 'alpha', 'Beta'])) + ['alpha', 'Beta', 'GAMMA'] + + Sequence membership is straightforward. + + >>> "Hello World" in [s] + True + >>> s in ["Hello World"] + True + + You may test for set inclusion, but candidate and elements + must both be folded. + + >>> FoldedCase("Hello World") in {s} + True + >>> s in {FoldedCase("Hello World")} + True + + String inclusion works as long as the FoldedCase object + is on the right. + + >>> "hello" in FoldedCase("Hello World") + True + + But not if the FoldedCase object is on the left: + + >>> FoldedCase('hello') in 'Hello World' + False + + In that case, use in_: + + >>> FoldedCase('hello').in_('Hello World') + True + + >>> FoldedCase('hello') > FoldedCase('Hello') + False + """ + + def __lt__(self, other): + return self.lower() < other.lower() + + def __gt__(self, other): + return self.lower() > other.lower() + + def __eq__(self, other): + return self.lower() == other.lower() + + def __ne__(self, other): + return self.lower() != other.lower() + + def __hash__(self): + return hash(self.lower()) + + def __contains__(self, other): + return super().lower().__contains__(other.lower()) + + def in_(self, other): + "Does self appear in other?" + return self in FoldedCase(other) + + # cache lower since it's likely to be called frequently. + @method_cache + def lower(self): + return super().lower() + + def index(self, sub): + return self.lower().index(sub.lower()) + + def split(self, splitter=' ', maxsplit=0): + pattern = re.compile(re.escape(splitter), re.I) + return pattern.split(self, maxsplit) diff --git a/Meliora/gmapenv/Lib/site-packages/importlib_metadata/py.typed b/Meliora/gmapenv/Lib/site-packages/importlib_metadata/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst new file mode 100644 index 00000000..7b190ca6 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2011 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/METADATA b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/METADATA new file mode 100644 index 00000000..1d935ed3 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/METADATA @@ -0,0 +1,97 @@ +Metadata-Version: 2.1 +Name: itsdangerous +Version: 2.1.2 +Summary: Safely pass data to untrusted environments and back. +Home-page: https://palletsprojects.com/p/itsdangerous/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ +Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/itsdangerous/ +Project-URL: Issue Tracker, https://github.com/pallets/itsdangerous/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst + +ItsDangerous +============ + +... so better sign this + +Various helpers to pass data to untrusted environments and to get it +back safe and sound. Data is cryptographically signed to ensure that a +token has not been tampered with. + +It's possible to customize how data is serialized. Data is compressed as +needed. A timestamp can be added and verified automatically while +loading a token. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U itsdangerous + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +Here's how you could generate a token for transmitting a user's id and +name between web requests. + +.. code-block:: python + + from itsdangerous import URLSafeSerializer + auth_s = URLSafeSerializer("secret key", "auth") + token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) + + print(token) + # eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg + + data = auth_s.loads(token) + print(data["name"]) + # itsdangerous + + +Donate +------ + +The Pallets organization develops and supports ItsDangerous and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://itsdangerous.palletsprojects.com/ +- Changes: https://itsdangerous.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/ItsDangerous/ +- Source Code: https://github.com/pallets/itsdangerous/ +- Issue Tracker: https://github.com/pallets/itsdangerous/issues/ +- Website: https://palletsprojects.com/p/itsdangerous/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/RECORD b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/RECORD new file mode 100644 index 00000000..4f77c974 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/RECORD @@ -0,0 +1,23 @@ +itsdangerous-2.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +itsdangerous-2.1.2.dist-info/LICENSE.rst,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 +itsdangerous-2.1.2.dist-info/METADATA,sha256=ThrHIJQ_6XlfbDMCAVe_hawT7IXiIxnTBIDrwxxtucQ,2928 +itsdangerous-2.1.2.dist-info/RECORD,, +itsdangerous-2.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +itsdangerous-2.1.2.dist-info/top_level.txt,sha256=gKN1OKLk81i7fbWWildJA88EQ9NhnGMSvZqhfz9ICjk,13 +itsdangerous/__init__.py,sha256=n4mkyjlIVn23pgsgCIw0MJKPdcHIetyeRpe5Fwsn8qg,876 +itsdangerous/__pycache__/__init__.cpython-39.pyc,, +itsdangerous/__pycache__/_json.cpython-39.pyc,, +itsdangerous/__pycache__/encoding.cpython-39.pyc,, +itsdangerous/__pycache__/exc.cpython-39.pyc,, +itsdangerous/__pycache__/serializer.cpython-39.pyc,, +itsdangerous/__pycache__/signer.cpython-39.pyc,, +itsdangerous/__pycache__/timed.cpython-39.pyc,, +itsdangerous/__pycache__/url_safe.cpython-39.pyc,, +itsdangerous/_json.py,sha256=wIhs_7-_XZolmyr-JvKNiy_LgAcfevYR0qhCVdlIhg8,450 +itsdangerous/encoding.py,sha256=pgh86snHC76dPLNCnPlrjR5SaYL_M8H-gWRiiLNbhCU,1419 +itsdangerous/exc.py,sha256=VFxmP2lMoSJFqxNMzWonqs35ROII4-fvCBfG0v1Tkbs,3206 +itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous/serializer.py,sha256=zgZ1-U705jHDpt62x_pmLJdryEKDNAbt5UkJtnkcCSw,11144 +itsdangerous/signer.py,sha256=QUH0iX0in-OTptMAXKU5zWMwmOCXn1fsDsubXiGdFN4,9367 +itsdangerous/timed.py,sha256=5CBWLds4Nm8-3bFVC8RxNzFjx6PSwjch8wuZ5cwcHFI,8174 +itsdangerous/url_safe.py,sha256=5bC4jSKOjWNRkWrFseifWVXUnHnPgwOLROjiOwb-eeo,2402 diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/WHEEL b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/WHEEL new file mode 100644 index 00000000..becc9a66 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt new file mode 100644 index 00000000..e163955e --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +itsdangerous diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/__init__.py b/Meliora/gmapenv/Lib/site-packages/itsdangerous/__init__.py new file mode 100644 index 00000000..fdb2dfd0 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous/__init__.py @@ -0,0 +1,19 @@ +from .encoding import base64_decode as base64_decode +from .encoding import base64_encode as base64_encode +from .encoding import want_bytes as want_bytes +from .exc import BadData as BadData +from .exc import BadHeader as BadHeader +from .exc import BadPayload as BadPayload +from .exc import BadSignature as BadSignature +from .exc import BadTimeSignature as BadTimeSignature +from .exc import SignatureExpired as SignatureExpired +from .serializer import Serializer as Serializer +from .signer import HMACAlgorithm as HMACAlgorithm +from .signer import NoneAlgorithm as NoneAlgorithm +from .signer import Signer as Signer +from .timed import TimedSerializer as TimedSerializer +from .timed import TimestampSigner as TimestampSigner +from .url_safe import URLSafeSerializer as URLSafeSerializer +from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer + +__version__ = "2.1.2" diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2eb3a2f0f477e5d1b78da8148506cc29b5bd0143 GIT binary patch literal 870 zcmaiyPjAyO7{-&fNz*iG`e*AnPTYE+hzWs&5MpeI9>#UfYpPlL=yPx^*?VjzcPXgC5Mk&)rPIFN_r(C`3wOvb=Na+Hqd*5u%~ z4M&^Ub-19KJ$ss@Y+0miCt&$~;NQ@^N*0@nX&7$5q3JoTC}0P0#%RhE7$3|Bx)B9U z!3E&vJj-ddR#>zT{u7sMFWZ{8wOWgR74hbNYqt%^Tl`|5UhhPNq+$Czq24wP!vC&ohOcp`c|f z)dH!T>~^Ufv@S{;#Y5?!V3XCp-X2MHAt0_cdsYEX2~m0&I~5*4MHuuk@YYHs8aAs2 zm<>VdZjxLxrFoGj$u~4%F;%Sf<0RoZuaab1ZfftPEYh`Ludr+MLy*A! H&)xV73b5om literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6128947161c767df4a15b59bdf500758c81433e4 GIT binary patch literal 926 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81850227815a9b170021ee2e7a3b28a4bd67e184 GIT binary patch literal 9747 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 G`Tqbb&|w1r literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ab5e5b7a630fbaac07421b646e582d3fe7f30fa GIT binary patch literal 8438 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 AtpET3 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6e418a23eca22c326271a7e1d05aded0406b0d6 GIT binary patch literal 6484 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 _t.Any: + return _json.loads(payload) + + @staticmethod + def dumps(obj: _t.Any, **kwargs: _t.Any) -> str: + kwargs.setdefault("ensure_ascii", False) + kwargs.setdefault("separators", (",", ":")) + return _json.dumps(obj, **kwargs) diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/encoding.py b/Meliora/gmapenv/Lib/site-packages/itsdangerous/encoding.py new file mode 100644 index 00000000..edb04d1a --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous/encoding.py @@ -0,0 +1,54 @@ +import base64 +import string +import struct +import typing as _t + +from .exc import BadData + +_t_str_bytes = _t.Union[str, bytes] + + +def want_bytes( + s: _t_str_bytes, encoding: str = "utf-8", errors: str = "strict" +) -> bytes: + if isinstance(s, str): + s = s.encode(encoding, errors) + + return s + + +def base64_encode(string: _t_str_bytes) -> bytes: + """Base64 encode a string of bytes or text. The resulting bytes are + safe to use in URLs. + """ + string = want_bytes(string) + return base64.urlsafe_b64encode(string).rstrip(b"=") + + +def base64_decode(string: _t_str_bytes) -> bytes: + """Base64 decode a URL-safe string of bytes or text. The result is + bytes. + """ + string = want_bytes(string, encoding="ascii", errors="ignore") + string += b"=" * (-len(string) % 4) + + try: + return base64.urlsafe_b64decode(string) + except (TypeError, ValueError) as e: + raise BadData("Invalid base64-encoded data") from e + + +# The alphabet used by base64.urlsafe_* +_base64_alphabet = f"{string.ascii_letters}{string.digits}-_=".encode("ascii") + +_int64_struct = struct.Struct(">Q") +_int_to_bytes = _int64_struct.pack +_bytes_to_int = _t.cast("_t.Callable[[bytes], _t.Tuple[int]]", _int64_struct.unpack) + + +def int_to_bytes(num: int) -> bytes: + return _int_to_bytes(num).lstrip(b"\x00") + + +def bytes_to_int(bytestr: bytes) -> int: + return _bytes_to_int(bytestr.rjust(8, b"\x00"))[0] diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/exc.py b/Meliora/gmapenv/Lib/site-packages/itsdangerous/exc.py new file mode 100644 index 00000000..c38a6af5 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous/exc.py @@ -0,0 +1,107 @@ +import typing as _t +from datetime import datetime + +_t_opt_any = _t.Optional[_t.Any] +_t_opt_exc = _t.Optional[Exception] + + +class BadData(Exception): + """Raised if bad data of any sort was encountered. This is the base + for all exceptions that ItsDangerous defines. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str): + super().__init__(message) + self.message = message + + def __str__(self) -> str: + return self.message + + +class BadSignature(BadData): + """Raised if a signature does not match.""" + + def __init__(self, message: str, payload: _t_opt_any = None): + super().__init__(message) + + #: The payload that failed the signature test. In some + #: situations you might still want to inspect this, even if + #: you know it was tampered with. + #: + #: .. versionadded:: 0.14 + self.payload: _t_opt_any = payload + + +class BadTimeSignature(BadSignature): + """Raised if a time-based signature is invalid. This is a subclass + of :class:`BadSignature`. + """ + + def __init__( + self, + message: str, + payload: _t_opt_any = None, + date_signed: _t.Optional[datetime] = None, + ): + super().__init__(message, payload) + + #: If the signature expired this exposes the date of when the + #: signature was created. This can be helpful in order to + #: tell the user how long a link has been gone stale. + #: + #: .. versionchanged:: 2.0 + #: The datetime value is timezone-aware rather than naive. + #: + #: .. versionadded:: 0.14 + self.date_signed = date_signed + + +class SignatureExpired(BadTimeSignature): + """Raised if a signature timestamp is older than ``max_age``. This + is a subclass of :exc:`BadTimeSignature`. + """ + + +class BadHeader(BadSignature): + """Raised if a signed header is invalid in some form. This only + happens for serializers that have a header that goes with the + signature. + + .. versionadded:: 0.24 + """ + + def __init__( + self, + message: str, + payload: _t_opt_any = None, + header: _t_opt_any = None, + original_error: _t_opt_exc = None, + ): + super().__init__(message, payload) + + #: If the header is actually available but just malformed it + #: might be stored here. + self.header: _t_opt_any = header + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: _t_opt_exc = original_error + + +class BadPayload(BadData): + """Raised if a payload is invalid. This could happen if the payload + is loaded despite an invalid signature, or if there is a mismatch + between the serializer and deserializer. The original exception + that occurred during loading is stored on as :attr:`original_error`. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str, original_error: _t_opt_exc = None): + super().__init__(message) + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: _t_opt_exc = original_error diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/py.typed b/Meliora/gmapenv/Lib/site-packages/itsdangerous/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/serializer.py b/Meliora/gmapenv/Lib/site-packages/itsdangerous/serializer.py new file mode 100644 index 00000000..9f4a84a1 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous/serializer.py @@ -0,0 +1,295 @@ +import json +import typing as _t + +from .encoding import want_bytes +from .exc import BadPayload +from .exc import BadSignature +from .signer import _make_keys_list +from .signer import Signer + +_t_str_bytes = _t.Union[str, bytes] +_t_opt_str_bytes = _t.Optional[_t_str_bytes] +_t_kwargs = _t.Dict[str, _t.Any] +_t_opt_kwargs = _t.Optional[_t_kwargs] +_t_signer = _t.Type[Signer] +_t_fallbacks = _t.List[_t.Union[_t_kwargs, _t.Tuple[_t_signer, _t_kwargs], _t_signer]] +_t_load_unsafe = _t.Tuple[bool, _t.Any] +_t_secret_key = _t.Union[_t.Iterable[_t_str_bytes], _t_str_bytes] + + +def is_text_serializer(serializer: _t.Any) -> bool: + """Checks whether a serializer generates text or binary.""" + return isinstance(serializer.dumps({}), str) + + +class Serializer: + """A serializer wraps a :class:`~itsdangerous.signer.Signer` to + enable serializing and securely signing data other than bytes. It + can unsign to verify that the data hasn't been changed. + + The serializer provides :meth:`dumps` and :meth:`loads`, similar to + :mod:`json`, and by default uses :mod:`json` internally to serialize + the data to bytes. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param serializer: An object that provides ``dumps`` and ``loads`` + methods for serializing data to a string. Defaults to + :attr:`default_serializer`, which defaults to :mod:`json`. + :param serializer_kwargs: Keyword arguments to pass when calling + ``serializer.dumps``. + :param signer: A ``Signer`` class to instantiate when signing data. + Defaults to :attr:`default_signer`, which defaults to + :class:`~itsdangerous.signer.Signer`. + :param signer_kwargs: Keyword arguments to pass when instantiating + the ``Signer`` class. + :param fallback_signers: List of signer parameters to try when + unsigning with the default signer fails. Each item can be a dict + of ``signer_kwargs``, a ``Signer`` class, or a tuple of + ``(signer, signer_kwargs)``. Defaults to + :attr:`default_fallback_signers`. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 2.0 + Removed the default SHA-512 fallback signer from + ``default_fallback_signers``. + + .. versionchanged:: 1.1 + Added support for ``fallback_signers`` and configured a default + SHA-512 fallback. This fallback is for users who used the yanked + 1.0.0 release which defaulted to SHA-512. + + .. versionchanged:: 0.14 + The ``signer`` and ``signer_kwargs`` parameters were added to + the constructor. + """ + + #: The default serialization module to use to serialize data to a + #: string internally. The default is :mod:`json`, but can be changed + #: to any object that provides ``dumps`` and ``loads`` methods. + default_serializer: _t.Any = json + + #: The default ``Signer`` class to instantiate when signing data. + #: The default is :class:`itsdangerous.signer.Signer`. + default_signer: _t_signer = Signer + + #: The default fallback signers to try when unsigning fails. + default_fallback_signers: _t_fallbacks = [] + + def __init__( + self, + secret_key: _t_secret_key, + salt: _t_opt_str_bytes = b"itsdangerous", + serializer: _t.Any = None, + serializer_kwargs: _t_opt_kwargs = None, + signer: _t.Optional[_t_signer] = None, + signer_kwargs: _t_opt_kwargs = None, + fallback_signers: _t.Optional[_t_fallbacks] = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: _t.List[bytes] = _make_keys_list(secret_key) + + if salt is not None: + salt = want_bytes(salt) + # if salt is None then the signer's default is used + + self.salt = salt + + if serializer is None: + serializer = self.default_serializer + + self.serializer: _t.Any = serializer + self.is_text_serializer: bool = is_text_serializer(serializer) + + if signer is None: + signer = self.default_signer + + self.signer: _t_signer = signer + self.signer_kwargs: _t_kwargs = signer_kwargs or {} + + if fallback_signers is None: + fallback_signers = list(self.default_fallback_signers or ()) + + self.fallback_signers: _t_fallbacks = fallback_signers + self.serializer_kwargs: _t_kwargs = serializer_kwargs or {} + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def load_payload( + self, payload: bytes, serializer: _t.Optional[_t.Any] = None + ) -> _t.Any: + """Loads the encoded object. This function raises + :class:`.BadPayload` if the payload is not valid. The + ``serializer`` parameter can be used to override the serializer + stored on the class. The encoded ``payload`` should always be + bytes. + """ + if serializer is None: + serializer = self.serializer + is_text = self.is_text_serializer + else: + is_text = is_text_serializer(serializer) + + try: + if is_text: + return serializer.loads(payload.decode("utf-8")) + + return serializer.loads(payload) + except Exception as e: + raise BadPayload( + "Could not load the payload because an exception" + " occurred on unserializing the data.", + original_error=e, + ) from e + + def dump_payload(self, obj: _t.Any) -> bytes: + """Dumps the encoded object. The return value is always bytes. + If the internal serializer returns text, the value will be + encoded as UTF-8. + """ + return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs)) + + def make_signer(self, salt: _t_opt_str_bytes = None) -> Signer: + """Creates a new instance of the signer to be used. The default + implementation uses the :class:`.Signer` base class. + """ + if salt is None: + salt = self.salt + + return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) + + def iter_unsigners(self, salt: _t_opt_str_bytes = None) -> _t.Iterator[Signer]: + """Iterates over all signers to be tried for unsigning. Starts + with the configured signer, then constructs each signer + specified in ``fallback_signers``. + """ + if salt is None: + salt = self.salt + + yield self.make_signer(salt) + + for fallback in self.fallback_signers: + if isinstance(fallback, dict): + kwargs = fallback + fallback = self.signer + elif isinstance(fallback, tuple): + fallback, kwargs = fallback + else: + kwargs = self.signer_kwargs + + for secret_key in self.secret_keys: + yield fallback(secret_key, salt=salt, **kwargs) + + def dumps(self, obj: _t.Any, salt: _t_opt_str_bytes = None) -> _t_str_bytes: + """Returns a signed string serialized with the internal + serializer. The return value can be either a byte or unicode + string depending on the format of the internal serializer. + """ + payload = want_bytes(self.dump_payload(obj)) + rv = self.make_signer(salt).sign(payload) + + if self.is_text_serializer: + return rv.decode("utf-8") + + return rv + + def dump(self, obj: _t.Any, f: _t.IO, salt: _t_opt_str_bytes = None) -> None: + """Like :meth:`dumps` but dumps into a file. The file handle has + to be compatible with what the internal serializer expects. + """ + f.write(self.dumps(obj, salt)) + + def loads( + self, s: _t_str_bytes, salt: _t_opt_str_bytes = None, **kwargs: _t.Any + ) -> _t.Any: + """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the + signature validation fails. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + return self.load_payload(signer.unsign(s)) + except BadSignature as err: + last_exception = err + + raise _t.cast(BadSignature, last_exception) + + def load(self, f: _t.IO, salt: _t_opt_str_bytes = None) -> _t.Any: + """Like :meth:`loads` but loads from a file.""" + return self.loads(f.read(), salt) + + def loads_unsafe( + self, s: _t_str_bytes, salt: _t_opt_str_bytes = None + ) -> _t_load_unsafe: + """Like :meth:`loads` but without verifying the signature. This + is potentially very dangerous to use depending on how your + serializer works. The return value is ``(signature_valid, + payload)`` instead of just the payload. The first item will be a + boolean that indicates if the signature is valid. This function + never fails. + + Use it for debugging only and if you know that your serializer + module is not exploitable (for example, do not use it with a + pickle serializer). + + .. versionadded:: 0.15 + """ + return self._loads_unsafe_impl(s, salt) + + def _loads_unsafe_impl( + self, + s: _t_str_bytes, + salt: _t_opt_str_bytes, + load_kwargs: _t_opt_kwargs = None, + load_payload_kwargs: _t_opt_kwargs = None, + ) -> _t_load_unsafe: + """Low level helper function to implement :meth:`loads_unsafe` + in serializer subclasses. + """ + if load_kwargs is None: + load_kwargs = {} + + try: + return True, self.loads(s, salt=salt, **load_kwargs) + except BadSignature as e: + if e.payload is None: + return False, None + + if load_payload_kwargs is None: + load_payload_kwargs = {} + + try: + return ( + False, + self.load_payload(e.payload, **load_payload_kwargs), + ) + except BadPayload: + return False, None + + def load_unsafe(self, f: _t.IO, salt: _t_opt_str_bytes = None) -> _t_load_unsafe: + """Like :meth:`loads_unsafe` but loads from a file. + + .. versionadded:: 0.15 + """ + return self.loads_unsafe(f.read(), salt=salt) diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/signer.py b/Meliora/gmapenv/Lib/site-packages/itsdangerous/signer.py new file mode 100644 index 00000000..aa12005e --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous/signer.py @@ -0,0 +1,257 @@ +import hashlib +import hmac +import typing as _t + +from .encoding import _base64_alphabet +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import want_bytes +from .exc import BadSignature + +_t_str_bytes = _t.Union[str, bytes] +_t_opt_str_bytes = _t.Optional[_t_str_bytes] +_t_secret_key = _t.Union[_t.Iterable[_t_str_bytes], _t_str_bytes] + + +class SigningAlgorithm: + """Subclasses must implement :meth:`get_signature` to provide + signature generation functionality. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + """Returns the signature for the given key and value.""" + raise NotImplementedError() + + def verify_signature(self, key: bytes, value: bytes, sig: bytes) -> bool: + """Verifies the given signature matches the expected + signature. + """ + return hmac.compare_digest(sig, self.get_signature(key, value)) + + +class NoneAlgorithm(SigningAlgorithm): + """Provides an algorithm that does not perform any signing and + returns an empty signature. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + return b"" + + +class HMACAlgorithm(SigningAlgorithm): + """Provides signature generation using HMACs.""" + + #: The digest method to use with the MAC algorithm. This defaults to + #: SHA1, but can be changed to any other function in the hashlib + #: module. + default_digest_method: _t.Any = staticmethod(hashlib.sha1) + + def __init__(self, digest_method: _t.Any = None): + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: _t.Any = digest_method + + def get_signature(self, key: bytes, value: bytes) -> bytes: + mac = hmac.new(key, msg=value, digestmod=self.digest_method) + return mac.digest() + + +def _make_keys_list(secret_key: _t_secret_key) -> _t.List[bytes]: + if isinstance(secret_key, (str, bytes)): + return [want_bytes(secret_key)] + + return [want_bytes(s) for s in secret_key] + + +class Signer: + """A signer securely signs bytes, then unsigns them to verify that + the value hasn't been changed. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param sep: Separator between the signature and value. + :param key_derivation: How to derive the signing key from the secret + key and salt. Possible values are ``concat``, ``django-concat``, + or ``hmac``. Defaults to :attr:`default_key_derivation`, which + defaults to ``django-concat``. + :param digest_method: Hash function to use when generating the HMAC + signature. Defaults to :attr:`default_digest_method`, which + defaults to :func:`hashlib.sha1`. Note that the security of the + hash alone doesn't apply when used intermediately in HMAC. + :param algorithm: A :class:`SigningAlgorithm` instance to use + instead of building a default :class:`HMACAlgorithm` with the + ``digest_method``. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 0.18 + ``algorithm`` was added as an argument to the class constructor. + + .. versionchanged:: 0.14 + ``key_derivation`` and ``digest_method`` were added as arguments + to the class constructor. + """ + + #: The default digest method to use for the signer. The default is + #: :func:`hashlib.sha1`, but can be changed to any :mod:`hashlib` or + #: compatible object. Note that the security of the hash alone + #: doesn't apply when used intermediately in HMAC. + #: + #: .. versionadded:: 0.14 + default_digest_method: _t.Any = staticmethod(hashlib.sha1) + + #: The default scheme to use to derive the signing key from the + #: secret key and salt. The default is ``django-concat``. Possible + #: values are ``concat``, ``django-concat``, and ``hmac``. + #: + #: .. versionadded:: 0.14 + default_key_derivation: str = "django-concat" + + def __init__( + self, + secret_key: _t_secret_key, + salt: _t_opt_str_bytes = b"itsdangerous.Signer", + sep: _t_str_bytes = b".", + key_derivation: _t.Optional[str] = None, + digest_method: _t.Optional[_t.Any] = None, + algorithm: _t.Optional[SigningAlgorithm] = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: _t.List[bytes] = _make_keys_list(secret_key) + self.sep: bytes = want_bytes(sep) + + if self.sep in _base64_alphabet: + raise ValueError( + "The given separator cannot be used because it may be" + " contained in the signature itself. ASCII letters," + " digits, and '-_=' must not be used." + ) + + if salt is not None: + salt = want_bytes(salt) + else: + salt = b"itsdangerous.Signer" + + self.salt = salt + + if key_derivation is None: + key_derivation = self.default_key_derivation + + self.key_derivation: str = key_derivation + + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: _t.Any = digest_method + + if algorithm is None: + algorithm = HMACAlgorithm(self.digest_method) + + self.algorithm: SigningAlgorithm = algorithm + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def derive_key(self, secret_key: _t_opt_str_bytes = None) -> bytes: + """This method is called to derive the key. The default key + derivation choices can be overridden here. Key derivation is not + intended to be used as a security method to make a complex key + out of a short password. Instead you should use large random + secret keys. + + :param secret_key: A specific secret key to derive from. + Defaults to the last item in :attr:`secret_keys`. + + .. versionchanged:: 2.0 + Added the ``secret_key`` parameter. + """ + if secret_key is None: + secret_key = self.secret_keys[-1] + else: + secret_key = want_bytes(secret_key) + + if self.key_derivation == "concat": + return _t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) + elif self.key_derivation == "django-concat": + return _t.cast( + bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() + ) + elif self.key_derivation == "hmac": + mac = hmac.new(secret_key, digestmod=self.digest_method) + mac.update(self.salt) + return mac.digest() + elif self.key_derivation == "none": + return secret_key + else: + raise TypeError("Unknown key derivation method") + + def get_signature(self, value: _t_str_bytes) -> bytes: + """Returns the signature for the given value.""" + value = want_bytes(value) + key = self.derive_key() + sig = self.algorithm.get_signature(key, value) + return base64_encode(sig) + + def sign(self, value: _t_str_bytes) -> bytes: + """Signs the given string.""" + value = want_bytes(value) + return value + self.sep + self.get_signature(value) + + def verify_signature(self, value: _t_str_bytes, sig: _t_str_bytes) -> bool: + """Verifies the signature for the given value.""" + try: + sig = base64_decode(sig) + except Exception: + return False + + value = want_bytes(value) + + for secret_key in reversed(self.secret_keys): + key = self.derive_key(secret_key) + + if self.algorithm.verify_signature(key, value, sig): + return True + + return False + + def unsign(self, signed_value: _t_str_bytes) -> bytes: + """Unsigns the given string.""" + signed_value = want_bytes(signed_value) + + if self.sep not in signed_value: + raise BadSignature(f"No {self.sep!r} found in value") + + value, sig = signed_value.rsplit(self.sep, 1) + + if self.verify_signature(value, sig): + return value + + raise BadSignature(f"Signature {sig!r} does not match", payload=value) + + def validate(self, signed_value: _t_str_bytes) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid. + """ + try: + self.unsign(signed_value) + return True + except BadSignature: + return False diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/timed.py b/Meliora/gmapenv/Lib/site-packages/itsdangerous/timed.py new file mode 100644 index 00000000..cad8da34 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous/timed.py @@ -0,0 +1,234 @@ +import time +import typing +import typing as _t +from datetime import datetime +from datetime import timezone + +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import bytes_to_int +from .encoding import int_to_bytes +from .encoding import want_bytes +from .exc import BadSignature +from .exc import BadTimeSignature +from .exc import SignatureExpired +from .serializer import Serializer +from .signer import Signer + +_t_str_bytes = _t.Union[str, bytes] +_t_opt_str_bytes = _t.Optional[_t_str_bytes] +_t_opt_int = _t.Optional[int] + +if _t.TYPE_CHECKING: + import typing_extensions as _te + + +class TimestampSigner(Signer): + """Works like the regular :class:`.Signer` but also records the time + of the signing and can be used to expire signatures. The + :meth:`unsign` method can raise :exc:`.SignatureExpired` if the + unsigning failed because the signature is expired. + """ + + def get_timestamp(self) -> int: + """Returns the current timestamp. The function must return an + integer. + """ + return int(time.time()) + + def timestamp_to_datetime(self, ts: int) -> datetime: + """Convert the timestamp from :meth:`get_timestamp` into an + aware :class`datetime.datetime` in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + return datetime.fromtimestamp(ts, tz=timezone.utc) + + def sign(self, value: _t_str_bytes) -> bytes: + """Signs the given string and also attaches time information.""" + value = want_bytes(value) + timestamp = base64_encode(int_to_bytes(self.get_timestamp())) + sep = want_bytes(self.sep) + value = value + sep + timestamp + return value + sep + self.get_signature(value) + + # Ignore overlapping signatures check, return_timestamp is the only + # parameter that affects the return type. + + @typing.overload + def unsign( # type: ignore + self, + signed_value: _t_str_bytes, + max_age: _t_opt_int = None, + return_timestamp: "_te.Literal[False]" = False, + ) -> bytes: + ... + + @typing.overload + def unsign( + self, + signed_value: _t_str_bytes, + max_age: _t_opt_int = None, + return_timestamp: "_te.Literal[True]" = True, + ) -> _t.Tuple[bytes, datetime]: + ... + + def unsign( + self, + signed_value: _t_str_bytes, + max_age: _t_opt_int = None, + return_timestamp: bool = False, + ) -> _t.Union[_t.Tuple[bytes, datetime], bytes]: + """Works like the regular :meth:`.Signer.unsign` but can also + validate the time. See the base docstring of the class for + the general behavior. If ``return_timestamp`` is ``True`` the + timestamp of the signature will be returned as an aware + :class:`datetime.datetime` object in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + try: + result = super().unsign(signed_value) + sig_error = None + except BadSignature as e: + sig_error = e + result = e.payload or b"" + + sep = want_bytes(self.sep) + + # If there is no timestamp in the result there is something + # seriously wrong. In case there was a signature error, we raise + # that one directly, otherwise we have a weird situation in + # which we shouldn't have come except someone uses a time-based + # serializer on non-timestamp data, so catch that. + if sep not in result: + if sig_error: + raise sig_error + + raise BadTimeSignature("timestamp missing", payload=result) + + value, ts_bytes = result.rsplit(sep, 1) + ts_int: _t_opt_int = None + ts_dt: _t.Optional[datetime] = None + + try: + ts_int = bytes_to_int(base64_decode(ts_bytes)) + except Exception: + pass + + # Signature is *not* okay. Raise a proper error now that we have + # split the value and the timestamp. + if sig_error is not None: + if ts_int is not None: + try: + ts_dt = self.timestamp_to_datetime(ts_int) + except (ValueError, OSError, OverflowError) as exc: + # Windows raises OSError + # 32-bit raises OverflowError + raise BadTimeSignature( + "Malformed timestamp", payload=value + ) from exc + + raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt) + + # Signature was okay but the timestamp is actually not there or + # malformed. Should not happen, but we handle it anyway. + if ts_int is None: + raise BadTimeSignature("Malformed timestamp", payload=value) + + # Check timestamp is not older than max_age + if max_age is not None: + age = self.get_timestamp() - ts_int + + if age > max_age: + raise SignatureExpired( + f"Signature age {age} > {max_age} seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if age < 0: + raise SignatureExpired( + f"Signature age {age} < 0 seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if return_timestamp: + return value, self.timestamp_to_datetime(ts_int) + + return value + + def validate(self, signed_value: _t_str_bytes, max_age: _t_opt_int = None) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid.""" + try: + self.unsign(signed_value, max_age=max_age) + return True + except BadSignature: + return False + + +class TimedSerializer(Serializer): + """Uses :class:`TimestampSigner` instead of the default + :class:`.Signer`. + """ + + default_signer: _t.Type[TimestampSigner] = TimestampSigner + + def iter_unsigners( + self, salt: _t_opt_str_bytes = None + ) -> _t.Iterator[TimestampSigner]: + return _t.cast("_t.Iterator[TimestampSigner]", super().iter_unsigners(salt)) + + # TODO: Signature is incompatible because parameters were added + # before salt. + + def loads( # type: ignore + self, + s: _t_str_bytes, + max_age: _t_opt_int = None, + return_timestamp: bool = False, + salt: _t_opt_str_bytes = None, + ) -> _t.Any: + """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the + signature validation fails. If a ``max_age`` is provided it will + ensure the signature is not older than that time in seconds. In + case the signature is outdated, :exc:`.SignatureExpired` is + raised. All arguments are forwarded to the signer's + :meth:`~TimestampSigner.unsign` method. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + base64d, timestamp = signer.unsign( + s, max_age=max_age, return_timestamp=True + ) + payload = self.load_payload(base64d) + + if return_timestamp: + return payload, timestamp + + return payload + except SignatureExpired: + # The signature was unsigned successfully but was + # expired. Do not try the next signer. + raise + except BadSignature as err: + last_exception = err + + raise _t.cast(BadSignature, last_exception) + + def loads_unsafe( # type: ignore + self, + s: _t_str_bytes, + max_age: _t_opt_int = None, + salt: _t_opt_str_bytes = None, + ) -> _t.Tuple[bool, _t.Any]: + return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/Meliora/gmapenv/Lib/site-packages/itsdangerous/url_safe.py b/Meliora/gmapenv/Lib/site-packages/itsdangerous/url_safe.py new file mode 100644 index 00000000..d5a9b0c2 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/itsdangerous/url_safe.py @@ -0,0 +1,80 @@ +import typing as _t +import zlib + +from ._json import _CompactJSON +from .encoding import base64_decode +from .encoding import base64_encode +from .exc import BadPayload +from .serializer import Serializer +from .timed import TimedSerializer + + +class URLSafeSerializerMixin(Serializer): + """Mixed in with a regular serializer it will attempt to zlib + compress the string to make it shorter if necessary. It will also + base64 encode the string so that it can safely be placed in a URL. + """ + + default_serializer = _CompactJSON + + def load_payload( + self, + payload: bytes, + *args: _t.Any, + serializer: _t.Optional[_t.Any] = None, + **kwargs: _t.Any, + ) -> _t.Any: + decompress = False + + if payload.startswith(b"."): + payload = payload[1:] + decompress = True + + try: + json = base64_decode(payload) + except Exception as e: + raise BadPayload( + "Could not base64 decode the payload because of an exception", + original_error=e, + ) from e + + if decompress: + try: + json = zlib.decompress(json) + except Exception as e: + raise BadPayload( + "Could not zlib decompress the payload before decoding the payload", + original_error=e, + ) from e + + return super().load_payload(json, *args, **kwargs) + + def dump_payload(self, obj: _t.Any) -> bytes: + json = super().dump_payload(obj) + is_compressed = False + compressed = zlib.compress(json) + + if len(compressed) < (len(json) - 1): + json = compressed + is_compressed = True + + base64d = base64_encode(json) + + if is_compressed: + base64d = b"." + base64d + + return base64d + + +class URLSafeSerializer(URLSafeSerializerMixin, Serializer): + """Works like :class:`.Serializer` but dumps and loads into a URL + safe string consisting of the upper and lowercase character of the + alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ + + +class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer): + """Works like :class:`.TimedSerializer` but dumps and loads into a + URL safe string consisting of the upper and lowercase character of + the alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__init__.py b/Meliora/gmapenv/Lib/site-packages/jinja2/__init__.py new file mode 100644 index 00000000..e3239267 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/jinja2/__init__.py @@ -0,0 +1,37 @@ +"""Jinja is a template engine written in pure Python. It provides a +non-XML syntax that supports inline expressions and an optional +sandboxed environment. +""" +from .bccache import BytecodeCache as BytecodeCache +from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache +from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache +from .environment import Environment as Environment +from .environment import Template as Template +from .exceptions import TemplateAssertionError as TemplateAssertionError +from .exceptions import TemplateError as TemplateError +from .exceptions import TemplateNotFound as TemplateNotFound +from .exceptions import TemplateRuntimeError as TemplateRuntimeError +from .exceptions import TemplatesNotFound as TemplatesNotFound +from .exceptions import TemplateSyntaxError as TemplateSyntaxError +from .exceptions import UndefinedError as UndefinedError +from .loaders import BaseLoader as BaseLoader +from .loaders import ChoiceLoader as ChoiceLoader +from .loaders import DictLoader as DictLoader +from .loaders import FileSystemLoader as FileSystemLoader +from .loaders import FunctionLoader as FunctionLoader +from .loaders import ModuleLoader as ModuleLoader +from .loaders import PackageLoader as PackageLoader +from .loaders import PrefixLoader as PrefixLoader +from .runtime import ChainableUndefined as ChainableUndefined +from .runtime import DebugUndefined as DebugUndefined +from .runtime import make_logging_undefined as make_logging_undefined +from .runtime import StrictUndefined as StrictUndefined +from .runtime import Undefined as Undefined +from .utils import clear_caches as clear_caches +from .utils import is_undefined as is_undefined +from .utils import pass_context as pass_context +from .utils import pass_environment as pass_environment +from .utils import pass_eval_context as pass_eval_context +from .utils import select_autoescape as select_autoescape + +__version__ = "3.1.2" diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6b4fba75033396b42da71ce403d49d262705dd4 GIT binary patch literal 1606 zcmbu9%WfMt6oyB#WJ#mZU6y<|Z6^)9h=Qhz0!2}zvEyD~2S(hW1tDNS%`nm=Gvt7z z94V{r`U-u8zD6HIs{&p16}svq+tGNz5zyI+$|E1(Oe_~_( z$wT8A{PoW{#|a(kgt;&u=aM|l=a4smH|U1t0&syAEEnTqvPm~BZvvNS$#N+!Cly+; zTn2WjYqRd`@nm2&+<0#KHayx1AIUaEbjsz z(nHI8@lir3vAhp_Oph%e0H4qk%ZI?H^wjbZ@B{k5G68-_9|9lKPr{R1=j`;uuir=F zEhCX8j2NDzF*BTSF^&W$?^R?B7bFrSohnXl=4K+rfP802s^nc1av0?bDIWiHeMR(K z7&aqj!VJ;VG?mI|7#ibDe3mM%btDCh5Fz}DObs+y>}oJZa>heg_AXLVBwUz*`xn%Q zbCz4wp3e;rWXR81FyUbIFQb^>&NXEFaaZq}Cjo|qANN#WtmcL}%0K+ORp4I6Uu(@3 zCiOxosc`A6Co`Iv@lu*gITaxUbu;hPRG28?S!^rw^;&QzGjHu-WwG_wBIIx2pu)^? zpEJ#`Bnvqv;+;=q6s+3rMHHB2Z*z4ZORs)86#?#L>3G*NoW`p;YBwx+$HpteyHSwC zY&oEPK4FnyqnIzVgH-Ald^8=eJH3Rx<9;m1P%~p64&{C)5Zkyl3KCrpuBR3hdGf?QUF<0*H%zPv^UXq`7GeJXtjcy%~55P3JP9%s*2*F z)Ib)c*uFij>S#4knkX%lHcAJji?RhmOX|LWR1d8_$~MXl$}Y&FI5knM)gBuACMM)%ATz>5?S4(o29}<@&;5u>P;^aFyzBg3mX}Ey9G|7Kbg}`s#f8P7=%$pq& zTz~7W??>?YjNXm4-iSo*<>dcA4>9=#*!uy7jmXB@O#_k$-?YqvM#qON1w6A*XUk6{e*w?++Hhb;8o{?T;q?buQM=(flBD6_2 z5gfWKGrBw{(n%;6=&2+QY)Yqs_hiDv((N} zJCBJJ;`bFy3sc+B#n+=jQ2xtJSmm&{VFGn7% zo=VDft2Ua1T>7gnO8yA>2cih9w%-X=uAF~SsKu~ZhzxU!5t zTP6!^nY>sgFPF(CRBxF&U8b&q$%$2wb%7x#+A?iKewQNB-{iLxuoJ`?4c zIID`YnmF%?^S;m%LeB_2FLZ+my)EjBsK-SeMk6f@9icCbg=n;xXgH#oWukc^S_%`b zq-c3ev=z~AijK)dXC%y|Fb{>P3UkVYITKb-SOX?3Usz*dO@uWU)T05})#PY3(GlF$#9K}L)wRl2*GH>h5f-wuu#nfof;wUtZo&e7 zs~D0X4KmF3TeS}b`!M1g5N;WZ-<3h24YqSHAP_<5&(WJo&gJp1Tu-96gQ!k zlAaVYskRh;sHM{Y-n18L8ClJsn(-jA3V15TVW{Q05VP60esv0})=U*jeA-kL_-mk=^g& zzx98^zaRbbr_n#`#di0iAMQkdwf)J~tnci-{hRgo|GK{a;r7mS7Sq91K;eYF0QAOC4{Beu1_`IpVu?vHl<{_4%2J=xy) W_;Kv#YuIk@dl=q)_?@)}|M@TUr}~=! literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8730f1d87ced1ae6b0986c13eb273a04aed7ebcd GIT binary patch literal 2665 zcma)7&2Jk;6rY)0+v~41aY9I2J|aHrQcMX@P^qd$w6sMfDovY8uB+9?GfCF9ciowB z(pb)^K}ioqa77#vi37d!7r>vuZB9s>dgjKV;=NfXb{bV+d1l|tyqS6Pd%yQyP%P#M z{C@lMQ}IidkiT#+{DV1i0h;<1I!-ukl4|m$RR&|$bXsoJr8wt+oT{ckc6q9qZe^+& zE2lyBsvaeR?PPgomsWG!y#CV<;Hr?vWyvRrR5g3p1F&IzrB4{7A+Nf3H<1l-S(|J;!cnX%2xiU55w{Of| zzkcb4KRZ8v_43@;m*#HH!*ps*25t3}f)70~=DHlZG}9P5lU+COdT7*`=t?NryaQJ*r8A zb%;EzorbGZoWhG3cQ)NeG%5|vxyc+)Z7`kI8SOo!JJ}xF1q?SFo!fSL4o^R3Adwye z{Jh7`7TKa(Y|B}4d6wrkVF&2C+f071^F0@34qv~}bHVh&T$vd+kju)XrO+K29e4`j zfX|u7rrwp)l^*PULL|cX zPxXtlwOdL^RaLLf1|$|;$Lk1SwUgwEu_@KDB4OGMflCXe76VvuxWD51qu z&{Se^*)ciaZ^gXR6uu8s^`oGLQo;A{cY!_Xs<(4pFy`xdjyEUfD}{cOHRIp@Y?_i$&)}N5|SSMnSKY{27(QZ%HV4}D7n(H zUNz}^YnDHBvFw^$g7;DDu}BDhFuw9pEL#w7R>`7)K$r~1Xj{lP&`Ly+I39Cp z0on-be)#_#*+1uIxhRplRc}egEk9mtNMx|}l5u9E^~6gl-Dx+4ag@*!U0`xNTv`%R zM0Ft%If=1c9k+Z-`0V%T1TH^@Yo5&^077+i@O(eeTB_>U&|{M+`6}#zkaz_?WyhY7 zu;VyPNDD=FpPoo0g_?xssK;__B2~(`w8V0>KqvDq%%y2}`oF;0;|QK4-^9-1j!-8z z77v_&=qq$Ip@kFjE%-u~NI{P52#M9=P>7)J@6gl*=rl0sA=Px1$SKWs91d*5FwyQ# z3M48&wzH5$cG*=ZDpw%A4C_HYl^HmvJEAMIYeA@k#iqEkaJQT`u3m2oQ-W08YQ>S? zmSHQ@;i^!B*fW_hQf*P!CLgL`Z#&@qHXNBed%(F|(9yAPwLXVsWeX)M0O@jov3w7$ zIH@bQqA-r`fHj!Su4*Cs7M+^bm7(F?ZfRHtvI|P(4UIqqArat@YlE6FP%S6Vktad>`4bDno4)~tB$qq#6OhZt|gzdb9Dd! literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffa9481763490aef2353352615c865af3606b273 GIT binary patch literal 13902 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 UzW?L#=Ugfy$`_AF_BY?*Um09900000 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/debug.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/debug.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a40d20c31bc322e8cf5a52f333eb2e96610dee8 GIT binary patch literal 3980 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 LZ<*}B&5!>FMfh?D literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50e1f43b41f1d41a9b6008ebfcb2537ea6828ad0 GIT binary patch literal 1342 zcmY*Z-EJc_6rPzRlmF(w+wLw)pj%auAP863sLz3=-88i&Bn@&1^vK>lh z)i>D};5B#*Umwt487vnVGJj%y71Gs<+ zszTIxk^UBY-9ROrMP-~r6`V&^TtGEkM0LD@8dyb}pnOEOwiU9COD`Y_^mvUa15-gy zpg+Y`^bxLssvdLC$j78fawJRgq<|Z5b@U0|#E-BFZ43G~-gH!4!H?f&(5K*Whirj; zey+tkJ&`+&mDbZ6IK48sQNgxUkv{14C&p+DFf}p86AAS0a_SNas6Hb;p*AO$8&Kj| zPRJIXRQwP)umC7Kusy;;drBhh&2FUaUc>k%(yryW6KOlwqS5aS3~M~;OpFs_FtLUs zm^kj`Z5Na-Z#!0*HaM;)VWzY2YK5OoobT#h%D#`=n^{q?e$1`KlHCnnz zQQMypk;KlFBi)VTMEW#7htTJ7v?A-TVx6Fj9|WO1+)WA+A+ju>+`1%7*2+ZHY2bwp zWT0)cspD9T(Eu5ZL#SEfs8~YP8a?ZQrC6~xw4m0 zZO#I}jTc_XtaDi6PT)tCHS+Qb{IRGEe%j8L-}r4#9nT|Jl=qE;&RHKaciQiDd&ao6 zD|EgL9e*ZNF4E_Y3)x~c0VhGFmH6&rMT!%~8HE?2pyFyVzG{(LaK~j-W`OF_q@~G# z5yi>RL&NGG8QtUF;1E@Ax3eHN;xmYx35^p}ec3R zCsrKR7!~_6&f(pZ7NnqYY#2jpGV1i8t`4oc`l3ZxqZ?9CS>C{;6-vD z>P;j%{_-z{HlkHopk`rYtja1|;$S zF#FE$CWET~9NyBUJtNGVJO14M>I+QH?S;!(J6wv)3opP6mwYE*FFOL0(+cW+({weH cNU9I5s#fD!K~1JK^}fB=^Y<87UDe+G56UKbiU0rr literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/environment.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/environment.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..381a9182701f5eec7729071007a220ccc319404a GIT binary patch literal 53110 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f73a1bff00067a4b0573917deda04928b5f48de GIT binary patch literal 5583 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/ext.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/ext.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f2bb5958d53d67544a4c65e0c624d26e66c9126 GIT binary patch literal 25538 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/filters.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/filters.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f3658e2058bf1c2ed371e664735861158fdcebb GIT binary patch literal 50405 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ⅈHkby*nV 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8aec06cfe4ffbd03dcb9b3b427c6d26d8366cdb0 GIT binary patch literal 11092 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ee39ce40add39817d115ff736016fdb10088372 GIT binary patch literal 20268 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 N*`?fpTxU=Ge*?&j4_yEN literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7379de01d21cd3aa9fb5fd7eeba8f51c9cc8143b GIT binary patch literal 20437 zcmb_^TW}oLnO@)Kg27-2fD~_{q&6)J7=;39+VRR*ic6XjC0P{Ah_oD!=?n(b4Pd~* z%w;Ho&uq@tX61UKeR%Uo?TB2LaQ#H>3DfWk8%Nbok#n+r zZ1Z^SxV$an`b6yn-k!w!C;gKr3~%Zq%d2>Y-g9cFUNyXFZ{|J2n|WZ>p2FR%cNlkv z{ihz-wWo1^#CrnwPssfgmB7m#@F>Haec$+U&LcO}`U1!dABv zxT{^|w!00l)md{xA1@oBkEg1;>3XfzRbL^i>ovkgDd_f9(+?I(zu@#ORn5q5tTb_Q zg7wB%ah^iiT@}_hyI#NT<3Z_7xw^U4^M8TKHSlQqW?aWoH@w>IcRV~Rw>qJ(I*oR- z>+!Qnx94~2t<}1JzZHZ5o=m>dx!Y3R4%>~}Vp7N_R#Z$H9p#lD_Eo3Jnv$Q53li8B z9D#>q&Db`F#tsN%*L>Od;q`4RG&igbduZJ?f{SwPsPp=)pAB`6+-*y}7UqY>1M^+; zPGx8*9G-RC#@XB{46R+$H1OQSaNC0qZuHu%&~3QAM!4>xe_c25*Vz0(W})XR4E!cC z1dUEB+;W@ie)IN%>%P9~;ycd|{bm@HT>R!17Uocb8?O6tX`y?s)o#10(F%N&u$+uW zGNj9{uT)np$mf4$o{h|fYB9P8cVQRU6CO`N;NiULMPP5^u}Q=@mXQy`ndPXH!0w zeq0v6J|yK$>+iiuul$kYO?j2~au3Yfj8_7MOh=_}H3I*dbi48AwqfwL*=_`SMK&mayb z6Qp(%1cgaS)|J~+-Mc6f6-X&kaxx3c_!86UfeIU;+eGsMAxPcExxiiK)hJijMZ1_o zidvM`FQ$aL>~>c+K;R1{d41VMZ?@c(M$l@y{{03yl<=iSJO;YfcDH*waQnRsn*x1t zS**6&x}sn!K#M_h{kDg1ySLqT>$ZkJ+)Yy+`5}0gJDQC%?%wqzjZDAm zf=WS>$%h-=R_6>_O-^-&z1|F4oBpUSJ#lYtU6ZMvAJtRMG>CLagd0N|5#@?Tgt6 z8$zBI&ocyC=yq2nr*1I2DGl8OQ*>8!A#rYOjxG|34vI#ghu3sQPI&cV8HnYb7k zqCJH$tD9j_F?Z6vxrdU4dwQB3VFDC}sLS&`2==ro%gamMj=#LTr+Ns2J|}Kv%e}rO zl9ou0(-^8o(_evr)%bzKBC9lErvClV?*ssUZd}Hm@q-WwG2Y;#@r1^+t2zF1GKtIX zYQNJYh}5v9(T~LsE7Sx?iGw;omn&^FwMBYswC^>x0udpckFG{OY@xJ0Mu%zdDX!Lh z4^=F6-G*B0#~4Zx3<>21UHLL;j4P81p@$qOF)gSIi4Xwvl0G*5dmL?doNc8yQnHFzgr>fw zYA%|=+KL5vUFV6)Z}mGACa)09MNSA99Tn?!l3KkkNDUmvp)^oWgO6x_L#QMGO`XJ5 zR2qqbH*g<_E_NhuT4v>uV-KDf$)kl)&QDCuwz5c?*A@<8TV-5?U{hpLnmG-A_jO=+ z3~%5Pn_!yTDgOxcXtKXT@yhkO$j4C$`aKc9gca$aVXeoDD}lI+{{1H40|r3GV%fd7 z-fBVwYm$V-YxLV((d&)7tpxaz3NFE+Ef|Go(N8^?GORM9 zl{Q3u3Qq$cSpp7>;S5e>MsqyZlA1)0PaK)3$l(-5g|&8f1yrTSnp#To<0R#A$XNdb z7oNH8450}34K>{|wry%KLlZiOb<5t)ZRfWOLvzF2E)Jm#_f2(mSlqGrewZKTcAf2s z;lzfG5}-n(gj>*8oMDb{cllI*^A7XK`*()UaH4LbjNEX7S`Et1L&Gug+#VKo9pG21 zK{e|dgbev(!Ywh+H;GVVtT+N}mH4@pOE$G$KrLk3|->xI7|F zu)!1#gN9-{0V$1&N}#b!ecY6U*{Z<3*HyP!H27b$+inAfiXIH!Exb1^M-xrp&If&v z8VX2I>~-a@w(hgytuO7Z8c*|zdS-0qO6hF*(va((EzRV!*Ku)4GisRZ;cqp zQnjeQ0t%>AR<@uMLP4&}$kk+Fuk@R@{V;O)JStGtg2<_r0_X(st4cENbpfKa31Z*6 zDB2}W-oiTm8mdrdn7n`_%4@z96%%O}6%)2!vsaqUT3#2wcWpQvwA&~laFG~Oj#)Gv zXV%H%JZ_o70* z?sc1BfX^_W4cQ!-VU)W`$sQHI)8lkD+EMWeMw@aca#p(CwhUtAT*KN`ReY$5{JQdH zKV+Uaq40txBKvY@OMQ*6M{G1*`HBkY^EgBkMaQ0YY{z`|)AGq9c`Il9FUzvPR*#t0 zFC}LaImdpi@e+>UT_j_g=po3f>*^^Uznz&{wI2I<;w!Yj`@Ez6x@=Av%*L=f){puj+KU z#-^YKj6o#LF7&hn<`La!ND~8yn^@+eK!DK_UO^nf$aEK+7V=;v=(hWzzu>-=JY`mJ z56Iy(V~ijuDVlvHrl(}NruD~_Ei7R9dj1P50ED*}7u}wKpph!1moL!%-agKsPL@P) zx~lVEhMEY>0~Vm$6t{m3Z3nnvx02dh;5o9M(Y?TLDDW`gnvO7yt^z|i1CY@bVsfD< zvm>i5g|asrVRM~qC#n4Zxf?$?eKxTIoJ|T1PM>j4pN-{V=IIaPjxGWeH#Xyzv#*Qp zW$813C(MA^L4eYyfmPD=E%YWMq?=us5L+-HvX5!~nsLR|_#Mm;`n>4EPNW%M@P_rn+j?}dNlKd?AbmdAyzf@gQ{K{(tF7Tv3I11j8H>9%1!kjDvuvVWsdhEyQt zjqxN1=KR8oDX+imc?6^A$?|fh0;nl6V6es|*0fwdTz%oit4mcU0-GfPu$ritbS#?8 ze7|3^Q_5qBX~}*87a^o8t&I;XbyTixT%8)4Yv#5|!}fc4|1#9Vp;3o2h%^ToY}E6f zK|ABpn6cABc{v<6a0Ew@tU%ZFs{uOzL#nlK zE;4%=#;5V)1yThi%f+7||Np>Y3|`o~rWO*z#li*ZXYJr3E|Tx6g{agDKq_IQ)ASWv z85IRBg7d0h!L9lhlPgSKMpAXOWEy|Ew`D-W+F0^0@rlN@`J-muf}Al2Cm!2E(bUyb z_-0HiCv&E$kdqVaAi-on_a@ZZprQD^Z6~Ce*jY1&_8*#W89z2YFhb`cre-@g%y|ZY z)i>@`2B(I(o!qXm14HpfVb|Qwf6u^^;;vyDolqa;(Rb0qWwD- z%Xw(tw!Vii9V4{2o-uNa3hCcyb@{je4x-EUQ?tPqey| z{DVJ45*iQ0Ng;Iin{ZHwdjj+X`2JfKDAEQ!Dgb|n(0`c6-O6?WxpJU72LRm);f{C! zL-%jMfW1@Xn+*W@osz!tpf-rAV0bojcn(|}??Mf*^%s0MH1C?~JQRh=VNo0#=kGjw zryQ1tQ29V9IcQ38T@pP*6VnPE8*UB@Z(jz#!{;)d`uZD7Q*Ck(600vbZ`VQdB@9gkjdB2}%i~!$6TR z57L7L^Zi%63|u4zAt(T8#VlGU&HN+BDt>A`vU1a)R|3_+Gy7(c+-#)uRV{TH#ayk< z2wGKN$Bp{yOuoV7MI=$~yB)|I&EI4!iq}Df*ISAJN*_J%#zCf1iPdd zFV?>H)IefebYD(UFzwDU64ovR0Eld5Y5CboM|~Z`GzoZEbYF=flQcikm`UCMK~myP zB1%C$1e1yFYNTn$-vkK=T3+ta&juuu;y5WM(|lx6U2(_sTY`ARH8(;|Ukqkn&ra_A z=~0n{q|$~2ZGWfJ-b#jw?F24>8tzfWPTEMAJx{#g!7J(ZTD{b^Qw30!4h&kov;Nwe zSeKC*BLt&jcXPAbsftb!Tb5`##sY zK*~)RjKorz7^_Bhg1GVGN{_7`8W6+AsR3`ShA1p}kWOY6q4uDLr1Yd{8YCBces6L4 z>*voci{TyktVz8}J4~fF()|5&%K~8&g^5&}+vPYzPeG?>RS^csvgB)0rE0+d0dtvK z!vG7B$qJFjqN>2+I{HjTH8He|Mpu(1w6T2v`)dp5q$+}U7;oEM7;+Vj*0827LrhTQ zciSXQ%sf`TPoFcE0@j~=_jzSri)ZHgE7x6&R;H!#U?tW?z1E_MWW)kt-olxQveO7B{0_5WHUuCn$PNBP?x9?m!HqeA@Gjz8U4-&%-0(6Zrb*1JnU1LCAP) z$e0Ez)1Q2&jp&IY^ZmqB7VLw^c};lGadCBmt-+hqcym(9c#=f{{l92@q)n_sQ^>3ohh*-&hpgb%d;D2fpZ&aI!5Fa(hXhQd_-CBv9 ze%NXg@^rj9I~wJ6KVTP&FN$@lrLbM7Yw|5PrT#pcOfP*Ps5lp_(eMaG4$b1x$)LZY z!*}XhyG5b!x6wkXv0GleM*wME)mj50KgKEu#>ifxTr0q3RC>G7?rT$hR7p`&U3I%* zHMTlR2c@g*CA=8uiVAUAn@X0cx7S!^j$b2mg{M8Lpa7^tScbt>6kz0!+GPN| zQ)U@fM*P9*Sf=$+j=bqu1bG$nq~*{aiMt~f&lS^wU9toSReI#)21myxGF5ONqdpSA zlPlObf}bN1I=4c5!vS#5t(k}%0wmXpBb7d?hoUt8j^r#p#417j5!MCQY*=~-?f-%G z_l^_p?@aC*+s^l(q&fI|U}L>af7J+9&xs00B@TRnYqrc%pq5T~R;p0io&$w4*Lis` zjXEnkhnR<@brzrqPH+7u6Fk8*21j+>!~DBY5}_92={xyONuSS&iU{7~?98B)St^sm z+^Q|AKxCr7IMY*gy^>S4D|pK_h^PesHq2WQ6TZlrx>_08nN>fuqvipx^nU_wnry~~7QMd~h- zhfE|w%3;KT`Y!KNRa5nGD@rpP)KJ&?_H8C4@oHhO=J|cTI>+SiB8g02ckBZ`N%hTd zvs*468Tq_<6ogqK`QmsE+UC)m1){E)ZqBg=#~;_}{VFHBz(c6@f8s(%#cg2LVa8Yv zNu8iWsGc@FMYxt&xfgHQAHest4WkF;m?)PyP&jl0QXQ1V;`_#`wpu|-&}t>Bkh3HkPxrb|6$Z0C>zQB#nm_KSetZ!S9u{a9Y3d^1C`hkMCz_j*&>c!oe1_uVGArc_gr(xwM~Y8w$j3 zDiA$m*LoYp+(9rIZ6~4$!;zaICLy6^lpxxz_GYb?#~0!lq1*M{IW4@mgR~$M9sdX)Z}V{hKJ7*rDp?t7j?d}MjGWv4 zRsj1c7D*UT6A>|@mgOC_|9G*`Fc84A8$jHwuF|sLvy4^d%lE_$C&Q`7@yC283x|4h zkHbh4m;sItzHS{gkAllvpO$lFs>zR>!YQc!Q2U*tH4QU>3n?%-^;yG>8KiGZ&||f7 zpyn^uOws3GWX^9gS!5!bJq=P{M7`fYzQ4ecsP|t6oyG1YwEUOl3y%5pr{(7q^EGjd z{ffA|gd^ZEW!3xGt(2!ziFU@1EIO2+v==<>LV{}VS;#dp=1M9+xz}NilXwSr6TU7% zxz`FmL=C8aDk{C)YKGSYQ8ge=_PK@=-9FaCJmiK?L_10nfv*ufw61aeM*AWY-*SxF zpz1)ASnan3+Vv4NhtLBma&c7M#fujcfcFx#_M~m|Kbiw@^6xLKhnwxWMRzU^|6w@D z+;;3G`Ig^opm3KFEpbc-)ge@=;H`pE71u1TTs-w!fevtCuvP4Q(K^Rc)rtynH?&B5VOS3eK3koi-I z5g|ac)k9c`H;lW6dYG!QwiNk-dNTDB^4+W+qP6&KF_9OQaxj&7I zhmi3ba6mi+|D~+gU9+TXkqy}_efq@KofLVdaB;Q%fVcxp9hKe z&4L`f^(A$Gl2q><$Nz%f_%vunWS1`^168?-!)_aC`>gHGr(3jWp@z3agSf zP@e3aKXR&nnwh^7nTp4G{bLvo*-TW3{ny&qDC|c#&#$t^FUoZO0GWT6O)297HpSve z#9G6OSX6w|#4+|`u1h$A-$AmU&8(SV7O)x8UPzWAX@Sfmex6I1jE=C5J>7d*(`3w= zKKFY>V<&8?EG(%MRj$VIX)#;+Q>>9x>l1q*)@~d`)<}cd;?N?ImK2iYH(33`ezfT% zjWmNp+=rT_Ek0SJW6IDNML8Zb=|kH2+WypltC(?xa3~{$m35`xX|8m}ZG2{ArLaj# zd)7UQu4Mb-2umG0xHq_N6n-UP%dxqI9Fwub>~N~H&9mq@qIUrX8U7edNDJ#rFS%pP zG&b7kOw1UEiDCo8!d&uF&ST7Ze3s_Ns*f4+O^i(%cgXH7i>YfgXUS~B^(cXctHQg% ztI-!`jUy1H^8ItNd{gy(6geJ($nPLg5VFIN^DYg9h+crpS-G1CE|jvcPovR7D7-)_ zMyn&@9Cqe7YAF-lGU8E5?3$1T`W0X(rL1_g?oxFgNskE`5BB;0N`CBOaVGME*L(R7 zdBwj=`OoCw*!XOGo(v(Qr~J5rBRG#l0@J|gskVwTfw<;arL~53Naywf-+0(oal;tm z(0tNS(mG+&*HDgdvcwOZI_scm-rd`SuORn-WDm%Yz`%jxiqPUq7JR^C>pv6USe-f$ zya{9zo+&U+aN8OiBg|CzsPI-+nQ6vI8t>r6pRg@#F<9tf2Q~%%%@b$xuW0=xoiopV zs+e~lQ=P!WOE`j`A;~gT>=uhdgvcm?)1cOa;c-h!u9mP^uvfu$1t2?(*h*e0!+x=K zMcA+4II!QTnCWtZ%OpxGds9Gz75@-+r0MUNb6QH6(Ru08foq8S+qju!7Vi%WBAf*x zJnS98_eVUM1&&4KY@A%<>Ca@o9^oLuZ%FL0mw^W}Jl98vVEl-SafN6Jbe1XEzB;v9@6D zibn+F^;sh_nr2)5V|GTEa<<#4)X+Vaz8}zS`S35PlGQzr zq$$M0ukd5lDIL6pn@n#Jr~&J%BfUlZ)~+3g;aFSOQtPYk?`K$F6S9u`OB0n2X~`NE zrI%;;N^I#RiN+Gg)OICxMPZu z?)jMX?Hx<*kHcXF_ZU~{hI0%geGD;4u%A7xH_d7skkhL_2WP})pyMCtVGu%xZH@HI zeZDjbDIsZg^RWRR(`nZrgBgr;9Kku`T^kSUFtw!%*61f5j}ZO=s}zKAidQ3bOXyHg z!yd(px~1X}sb6CvQ}@{c9)E;<|Aj>P94>$)4jGR~matysPfid&lqbhSjw=<#Z<;v9 zekr1$5|>338c!Tx3DP0ROiO-I@IndKlfVn*3|<(iTipCQ12s*5!C+%vC7WLngbchu zWI?WMHXD_*;q#3@M(4$XsacFf?bBT@yE!3=v$MGDZg4}F zC;^@B2n&dyq+_YI+LA3quR|{wDOq}#D1C%0jHv*)puDH6Jg$@CkG?TJld>T2ps{g( zkKB%_G1=D7|3Ka+3e#1H&}@|T{M=bOm(PaXv#=zoQJn5vEZo1qhdS^&`)OKb66`C( zhbG6?DyTPG-98+Z*w0S@#V}gF1Kh%G5=!i@^jmEJo^+V>CNjZNjLcb$|06)+7943R z1wCr5m*78|%?XUwn+XA@@!DbZOM5GZ3stVo?K)i=rmet8-tlS0mw~ zd9L1HHZENDP7%NPTH3V&9jQkoo^CKR*0qDBiH)z>Cz&H!%EqD~XW;-s6zdS)mt8G2 z%Gev5v9skAp_fcal<)Vbt83}8g2xH^Ych)nj6Jhb#f!^qx)=fBDQ0ls;K}i3?~xQs z)gzA=5iQmY$#~mqj-T7WCK|s8b7KzD zE4|CeE$Ypd=*|3B4rSynz;qbv%aBl0nP;+r2G6Jw&v?w6gEpMon31d5SR=-k8b~7lzO3T@*Xd!!lH0N8FCtS9WX2YaI4!Ig=Lj77~W@qb0=2Z-i7$il4$h(<}Vu*Kmf{f&_UwCQOhm#p7o*gv4uDYcpk)y4dwwautVb$7`YkdaP{?g zj|Jl+pg_tV3#*T3C4OugSBeOxMyUQn;{tr%h&n>ZKGJd=dsI77*Z)N#*{hZg zOFc60H@VJ|A8DHW?FNp|+nb?YK_>MolhHbnCGu@NTSHOW2~y3@Y$^mZPGNcwIItJT zn!;vLBp${QRFEX@ZMw8mEd!C<@X;3ZS`Q+-*X_X{^;2Yr^SX_bZksgg@8fnOZPwi9 zHcS4a!bNxut(GUtTq2cZXNY=}MU!E2t21E|HUJjLRlroD9KuTPZ>c|Ho`1$XdEGu~ zP{QWfugJy=-NJvt%+gFE^&g;_0X@`)Jq^dNY#6Z|v;3%3pwfR}(?NkE`Z!kmMluyz zNAXru;0`Eo7s82(&oOSSu$OAN5dYPru3g8rBFRR13H$Y?|w#%Dd6 zCK^act4`lJJAnhRYVg!pllSJ_*Id?o1xGybP)Q+AJyV)#Ee&k^2Of0yPmx3YjLE-c zvZpHJ@X%CU`q}*-#oAx5h4cXcLzrR4e*SSmTTq%hg)zY)+x88pluh#-XhUh!$N9r zDZEn0cff-GgUlU-X+Pp*5jz-wX;AoKGbdQ9n6ATXNAJ#^8Jk9mEbh-e81-;3 zu55cyYrGP`Gs~-WCIW}J`l2#oKEhU0@5pnaTaNMFxXfRDPPS%5l{Auafq|6j4l93w+s+9O$SqY#xNSNOyLEIi_xY z|N1NSE3dtB<&D>uUezd@#IHfWjH1{Hp5!x5n7YJdgUKH-*-l z3!0WLQUV0@b~xC?l>Ots(ZV0X%b4bw+DB(9o$0ryf8CgyK0f`z^sh~yn|A&WZMYl2 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/meta.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/meta.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61ef276bcb3e64661e73760e5c60aa7e7a67846b GIT binary patch literal 3800 zcmcgvTW=f372erhUPOuVO?G6rC?;uKnXSqIX@M3-Y&4NCQERA$t+XhsbUow@#if_K z^vqBR_B1#pAS}>5-rXF1p#oa;rw;L|9ewjpE&b(NxHcodr_F$*gnHei5wB7g) z4)V6XV|cb$UP&{l42b3ih=(dwTG&j}$^$J%3dG|5bT8IfI#Q|a(dPLpEMLqc5X$Q? z_}-VS6G-RzFa0mPK9dz$eYw;LRfT*E?~!lAPF2;?%op`UwtOIKk=qs6i5&H`CCU9K6=BqcUxgzF_W>0u&^mQGFea-TPC<2o)QS`OCUN#!t_ZVnzSbJ5UhP3bbsw>Ih=>5lPq()t( zxkwT|izT0nWjn8-=(1!_ZM7COffXejDlu{@=QVRU>Sl?_D=vG$ytmvQk`TQVMb9T9DOYMyB(q)=x$HqgTdh}cjwYwOv-4(|xIL95;G0F+ zDN3Q%H9RN}oQ`!C`YYkZzjts7taNAS|kH$WGWXYVwso^~&G| zNIfR5f%UN~YQqIb)$y$F;DBGEN<2eEej)fY$vO;p{4&WZ5$%`DD!dIvX`O zt^!&RzXQtw!g_+59jP|wpQxT7?7>GWy*L33VTH$b&G0m{{8@@x<@$DbaD z?UGA{ij{=XC}KKojCyv2I#9id!+9&7L2F^1oKl7L|FQ{~!V4@@vfXf;ckkYHhVY{J zc|00t+VVLVU*`k}XUu>OerJCDR_kmHk--``+DJX4Zmqqz>73ioGJOB}hy3R8ix<2r zH2(>}H{-|0YqQM`cKUHDqgl~JXAZdq*)4wO4u7$R{cFeW%xyhUg&FNO7jl#VM$z+b z-{zZWcc{bEx+YlgAX1xDWGM>sungK8{UA2nxtkgxDMAjP>B7%+X}iNAZhL?&__v#7 zlH1IM6FE`@{hWqVv|TM?%864Ux79)K_S5aML4Rxj<7C8rtuy_U%ZVm6iu5TvdMde~ zyhVqHIY`}8QGHZC41-4faxUOK0ob2t4OhVE;^=Zz=&5lrAsD`oS}d$;g|5yDtf}n9 z=nxKRfXqKaRds6AL(xL#>eiw2_5T^Ucd^Y-U-hmuScBdp4L6oVZm$4zR=JmP3J}V!23Nn9&N{)Wx&Cvd56b zfzXm7GZTne(5lqXY`6|E>m?IMLyRosxI#BLX|vDeA>cdifp4JDjs;ZXZW=7NQIb<> ztn;T^S*o7$5}ur-!&oIa`Tqqd&Mr9fy+j;hv~3UUD0z>NIg}`A<0Z4yZo0Gn_&dKV}3m9>MIjgV2G5ty6rpW@R5n13%Igi4@58z65 zAPACp+~?4m?~AlRYM_Qz-ASBCfV#GZ8W9C_Uv+6X{-6h9U z6WVGmcj~SPk!5JmFfg)*V`cLCseyR|<(wK9ULBy&I+YEihs`V76X=$QkKiLs%`>m; ziDaVm`$X3^DSM>KE4E-GR{|#p5Au-yPoRHH!kVY&xGCX$fH=?Xcd*$IDtMQcSrrq> zW!4Cm*b<(Npvrt7RJhC<{|*BJkVc??2Hw^U{X_iZRTv3`%$dzSXH;GwS%cn?LHNeG@Zr+R41AWdShNK ze)R_=y+t}yK1)$&oqF_G^|#^kyuMjhXMntzxrRp= V)L}IK{3=@tE?!w(U12wZ{{Sr_FyR0I literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/nativetypes.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/nativetypes.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce301e48e2795c330f2a50f3a31f5bd6618311a4 GIT binary patch literal 4964 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 Tq96vmqI{M$Fb-+RCJ_+StdXutpQfz%-( zf8ye73t({ry7>VHK@uXU@CurE!WTi|mq8Lx0`pGMDZ?bBM0)eCejj$iA}V`H4|ali zEV^!tj(yP+@llYhZ4$92`bR|cWq9Z(ec|09!vX(|60$v$Ow~3o^8=}w)wwjxDwe6r zSYBB+QH5agL9L}RIczds305kRPxhIGZ*Sh&j`NDu1znlt$6p(%&3IOiKT&&Cp|~*P&63xK-QwAOZfEd5ifTNCP4LqA^L%FvmgUG2 z&+}@|-+Sko^-;awMyu7!@Q%SOCVoWq1^CZ!akgP3u$db$NRm*_)iIN&BHV!bm~_^$W+vw* zT9xSnl5PQYPb3jHDd-sl`wFmfmXr8)Su3cgJB0-IyoCEsxu_p~35F-M?WJi}aAVT+ zxzqI(IC}%SxeNpGuLgbU(U4xE0S*3+I_GHU9b9=HgBNfQV~knFOPQu^oTgC3p{BsR zpQb-9c(FXu7s0TjrTaKTZM6Q)YTv!x4o*>JvM5%_oG`B9WelEEB(4mGGolv&WAKmL z9S+)VnhKS{qoLi$y1ul(e6a00|0=Cf4DDe1-j^Hc`mK%i&u(vRE;WeRv&4nT<%}-9 c^Ivg(v}AW3<7)6Q=tW+i_Pvny{mb2d0j0A8y#N3J literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/parser.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/parser.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56061b69261ea42cb20f5cfee8576eb4c51576cb GIT binary patch literal 27579 zcmchAdvsjKdEb5Q6ANGoLKI0+(n^*^K@V7zWlN?NS`sNplqHCkAlY71S}ZXaz%CcN zz}y8Nn}y?uvQ0UrUv=HomR-Q7kE4@E8`n)*H+56TCy&-i)1*z)>-5woZdxmCPLtH} zv1wcE@Au8UcOL|;)8u*-Jz+flCa8t#f$_G}CJR3o*LE~h1*Mm|%{NIuiZuH?!&$!C$z zm-DveJM|IWke&+VQ9PY%jIE59$9ZS7sPev7-+^ml%PsGenh}&Hab1O)UH;WemMVPS zK4+JAOMX=HdvJd*u4{1Z!*wmL>u_DK#$HO7OL*rE{*6dqhq{~gSc}dc%YVHZzt4Ku zQbo1n1xxKX=ag?&&QsRZMCaaPRUP=HcI%|y3`&c-wNh#?`=y3|#@D4l+8J4{I{WOmK@E31ua+kYSkeBG|Knh$B+(zvrTzVp=C zX1jVOt{y}03%Yi~ugDnKaImK0pIPPeBM&uC)pV=5;y2sjSmo%-YD>3|HWwP}$`A9E z$Eypvb-3DSOcg>GqYa(fVwgJ7Xf2#9XZ$m5zo~*SwW{$=VQPhq!%QuD+T(YJ>6&yI zx`E#gz0sFP*v+E~9cV)d1 zx~g_6%q})sEzO*}(o*3_Wu@9)t_Z9a2*3UxV(R_4f_%!ddwNk!Gy&mQ3P`+NuH>>?9mr%Yz%D1Q~ zly5}&byB`n-G=f_D8F9Hx2ro)z8U5HQl3_CK=~Gb3Zt4*cVaXL)Lp2#6)kR)7H?E{ zqkKEccS!k7>dh!mqx=Rb-=pqD`A+`;=K3vw%0cy3l<&g*H_H9{)Q_QjH_C64@*(v$ zl;4cA&i)i zO!vbUv%@;h$J_WEuF*vousr%wNjpHC0D1vnW3y<&&y`@-aTcOYmStHBtADfx4DjMctE9XJ+Xs!}6YWbqeKoMt#0Z-g8==LEXF6M+Fz~_6P^kY=xOW3(V=LAIJF1(Q{^e zUA2Md-lIMy&-Kx#@R^8`)q63jpHT0^)5r1jvoeaGRL|qd=R`(*JWPv>(w+CuE!Tn) z{!>CNKn&<=qqGY7RckJl78=zcC_P$h)~luUzz?QNrK9cr0q#Q(DG0cH2|pqT0!XEx zRBfu#LbX{s;j=wkNMAnMtZF|njUe@cHl!JaPB1N9%<3$-G#LJf-zSjLL2F$v_@URV zuK3{lkdcy0$>U*K`|WkzTu9^5_=nxFd>B{IK+?6lRt4#%-F3Qd*XyRXJk&66Ramwv zo?@F+%|e<+%gmN_#Cmq$M!K7>XOSyzWRS~st$MnfxzAdAaP3~@plyDMPmD-fP!>eL zJ3FIAc#rBE@$N8Z(Lgfk?oz$*0G z)g_8pDimR{g867yY6^g>E!KPu5smv5fMek#?m`@!7n+)>Z0H4kV^PMUU&j|GZ`U`= z_>wn;E;@SI(s!f!;?su@9)B8|MsR$2_4tw2>1Lxjt3b19jm;*!B=?ToFRk!QT2C;y6Vby^Rb?=<_JXBQ7qtn?u+-jckn>D|=;Fnf> zd@qoBx!Nx2Y7K-?n#UXGOVnqCa8`iZ_~_ds$`G6;X>fd{=K9JBD1JbDPTxRXH7K3- z8;ufv3;nHYjkzrm%SlT~KQZbXYGKc_Qz<=#ZwfOD<{^DAO1%l5^7H{#+`~j}y@ff> zuSwp7T<9%UYmG;d3xtUBSxi7@BmzC}O`{(oO*lS;T&B;cpiRcR zQUgt&^rs`<3-)Z@!h3BpZ1i$_>BM@w6wN-mfL45x_i0shZZ%B%G!U!5o=CRXYBXA> zr6=%~gQd5`kxGR8Y%}FT;>Ch0=wl=OKpkM+)99}au-0LtK2o(#30l00jv82;MF*i8(6SrNLY3 zAqyvmF)}MJ1vb8jh5?zOmCgej!C7OW7Ppvkz*o;ez~mNlXA>~m0@5iD>?+l{_5tlf%9J3yIOoxqS4-{n)rS8z zOh@5VRo93`97UKD`j>24155qp-0Td#ox(;RL;{`U>?+i;Hh5K~+B`eu7&Mt>gCPtl z)PjnE;ck7#`Ydooxfei=UHWLe&Jm+Yl*n^W!$;$T1txkG(lx^hjs?9oH4s#@3lL-Vp z&TQCSC`8IW>FN>~mZ6-uW;9SM zJe2|7{~^`*bGE!O9BQ4~l((xals#*6oKNDCFJt?U+5BF7p|paMz?$oNHFv^m1ANJK z_6Uf9E;Nk5aK!|n1v4$ep|gW>UG%nCn9Y^bAfLdmgx&&Jf0%|62jl@U6??>_pTvBK zY&1A8qLM5pOr5GW*8OlNb$MeeRZjY6Ps8&SgqbBDm2DlmtF6_rXkNpYRD^iL2~%TU zXzKKB?9|1B`Y3YH9?9FolsE{>8T3Qu9NLRirrVdHpy@Cf%0Ixf!3+`$f;A69CP6#M z?XuHFh}HkYe0B`EKbKqqx&P~+6~u53`R_QXJf4_v(stoex`)6+ubBa9klltON@IXj zN8l#COaxO}kirh*3LZm(`Li}5CyaDJ9(*8{6y%M-P-3iCPbnAJb`Y2W43`#=f9(wK zo}&url2=rp1eqTbmoA);?Hbr-Z~9?7)1h01S`Xa`%3iHeYC-9zA{cR7;|ERzFEl8K z?S*AuQN~Bs_n@`RCr`B0S@x2^92x>%)-F{Wfw8+w_z{3XNr-gL611@@RSalefEd_1 ztR}uCQ8@74g_CeS*EEJ}bdh9ak=6xu0gh{GdR5qX4On_K>w}XuSbuoGc?dEE4e+I= zdo+hGDt#y2#qMpRP*U!&pJ>DeQs}D>So3IO4A@{Ey(b;@z;z6El=2s=m<9oFb)j85 z6?xh*5mILi?Ll#ubVbOLP&jzz;XCF`h*Xr%#^)U6)ZsqD$Vzy;C#|w z6jj{#vpbge~b$Ht-~s4MWarwuC! zvv7b5*hKysmhm{B@?dC1{q11O^xU^{4$JL1o2Mu?dDPNMore) zM4NEL+!4LTNcQvtGK{cb?ijwS18Hn-J;*haskG6Qr2n+(GW2Njlt&_7O)VqzNc+RH zmot51$o~!fnrU+ikpBfR)uJ%rPVpGw0%wcJ9W))7FN*yfE}1VX5oB|QO(rvjrMYOv zc*lzvsK=!cnGY9&RK)#eO64%0kCAm^KI6JPW-x`ij2b~M-KJd)R*D%dfYF{=vS`1f zF2iLIHI5n1wDa{5!322MqIoV}pwQjX*&*KpHbhneOK^3%la;wcdCI<+k$kN=WouDB z--mCSLH(H2Yaje90DFLzJt`Qn&}u3|TUyV?k1y(<#B)>5#RM(T`^B8Wkw)N`)4&vY zp?(1k=kzJ0f=g2cgD)*sa8mVYCTExkrbHCScN*uX;Do`ndA4$qgzgN!CbEpBmo95P zx&onVL(2|x$+zhD@?OfvxGGn`5DfKC&?vYLi6t6h0ixEsly*JAmB`74J45(_2M6$l zVwIQR%TFWI1|4JW9H@s7mUWNR?O7X!!XZjQpHL&=L*@K~mXXiGJ8D;QlIGhZd|He+ zm;M>x&#Ac2dcpJu&f(N^o1;b?ukBs?Bn&;^9@>6V@CH5^mA~M0ol1V~lWTiLogaxb zVA{|SDVS#nf%OIGX6G<$nX4HP`tvAExyjVl7WMm4b1`qGx~Wj{5w>S7aO$J@WoCP7 z%*>Q?ba8mbWwKx7QzUnpo-(GVwph_W#R}mnG@HbbjCeH|HLn&aW>eM>aBcC2 zxEbt2VmW(dD(NfDENPT zB!-i6U)vKA;tkGbz8iB1w!^GbZ9=W6_$;mM19jV#0)4HO zQS>)PUZS#?L%RZnoa*(g%#jg=5Q{4-Rq=VlU%rkJgJl=uIU*rPlTtL3;=L19L)^Ph zPzrI9F2f8MVr8Ly#+dXUkSfE3gD@@HcF>!|NI}*gM>G9*n2-WANppC%@&@i4**N5* zAv}AML??PN88qjt5c#%?cEs3XM$IP&=8R?~=S?W@2r}EvSsRj+<}LZ}ma{}^qvDz+ z9jcT-H-|R)uDt|m1(eefl&?aE0O>>w(%yP}1lSP)YXos1%8_Pr+pte@UlhOlbn3Aqujywed(;<|PSY>Z4C4y4CCjjLnKsTh6^jcm9 zx&+-ne+AG9QUiEkV$k~qY%bIfAUR50=wS(HjS>(UBr$>&L|U%z0=P%XxWq0VBO0q* zjL7x8{%{)+C~D*d+PdRMAo$MN0j=FpRfwKp&tPu#%+;3EaAL-yiMa{Gjg*r>K;Ida zInw^xdJR5geGMC|iY_6xCXJ8CMZ8=UJ(!+a%vVj7j-8c7nx0d`tj?`e&x%$H9@(zq z>E*Ml%UEo>o$GaEpX(5j8gHk54=xJ-;xur@j018|ba{g&17N2hBgT>m26P^Ft!Hl$ zr-E5abK2nRz+$)uS~r2iyPMvY^$gqsYlSt3e)X4au4u5EFkgd>4J{Q*FJWOWvTTmP zun9eyHwZBaM6ZME%9*}1l86h-wT2p|%-nrTKK=9h&_QAol~vDyLHcUv^`cqC1SnrM zeIIl*7*~g;lczfOJQ;!Bc*O%*+-x=BZI9tcX2o?(E(x4ohRl|sby6~MQ#;HTrDV#6 zs74ECn#Y)ods#Gww3+xYo6Nb$j-Hnwkur#lX*Bd_`S=hiMf$0H)Xn`2sYpXTC8j!j z-Nh9A;jd;>d1nI5;Bt5j%r7|-Cr3EajmT`rk$~vX?LjmkD$J;3&>BuLnbyohCSYh7 z48k+uO*E?}+kVlg;jrL9RN9Zkb7_Guz*w0a7<<$Ro&&O(FcX=JmwOF3sDx8If&wU= zhKfV8Wy{frSl)EEtjKgZ)P`a!%4}MBCn>zdPe74~BlcjRdJ?b2S_;iRBeI@C4&G-h`{Vm0(HJ=z%N4a|UmGZFoZ4ikw9Foqrs zIL_O3H&$9-w9eaPH|G(w!TJ~+ORUMZbIN_m{-E_idl9jGD)mBP!#)q?NIw&`6&cQa z9pHs8QVgYTr{X z-?Rx|a(%SxB9cp{sX5lGHIo0F74ThV1ZgPT-&y@j!jhmJP^z7NCamH~FffYY83H@Fou+P}r_sb9_M zFCh)>O6P8h=zy*xgw$f)oF9~EKoYn?=N>(P(5VbA`wC{E#8LbU_Qx-onYzl5P<{rl z|ErJ@;(GaFdU;xnK0`%(2OMIUmoWt#kXafaIfzF=OqVdTTn*^{mjT4?zkkg(;yFk` z|EmTDm|teCKs2&a2&83#lPga#Nv5625qRRE9;D&Lr%Q?6d|W?Fr&!tr+Y|OoWPuJ@ zFYFOZb~20NnkRn5KLgh1r%}5EnG3SAD<(&qu+OI;YBdN9j(J+3AA$u+F-(s`WP#Qp zd|}j0;oTEAa3le*`-hE;to^efo*@_Ud|j`15-dBx>RjK1Qozy`NGSVhKaOziQ!wM z9CCX7_t=)oMoho|i51d=s33_RA`bmu=O{&}dC|&KjHLsMLv!$7^!k})k8LJ0Cd$G1 zhxs2hrikBf*Vi_q`>kYj*@gbMkhoYDj{Q|+x}Kf|LSS8I3lbHf9!^w7um@Ld+Omdo z4pLKEnc8%lVKgbM)p5NpMN8v?i#43bAeq~J?NVr$V>{S#y;e7OZG9fC@+#GJ$;a^| z(G9^Lh^fwO7U*Qd`!buOTUPKZxC56OeA5{yq2rsyEkt8}7NvSt0#Udol&w0L2~qo~ ztC za@hmcetTUY@RAFGjD*Kpbh4J4C!Jj_!cOYsuoD_-ZEZts;{>b zXG?HZi&8q@!|-`oVV;493Xw;$N-d74-q<8o&?vQdV=}gQ{hD{g>YI<>kC*gTtIPWQ0|<}{<5(*?UDXP(!Lm2kx&@r_mDHtUc*;1Fk(iH>5prFYYy4Ov zCkOx-1Y%Jw=8b-M(_aZt$(-~rp1Z2mHn!+9!0iyBc<=_yVW}@4Kv&25OAY=~5@DwZ zXzxeZgiH;G3$NT1ZWy~nJZr+X)>tP(E;akqlm4QfX9a~UVzn?dS=WmV6Y!*!sy?f! zw3YLCL&fwjN&+L@1=^J`MFdJ#_qHQxuKz$uq&mON;({=s|4b6U8SShclacbaTNJrn zSgpsuOIa`L_AUgpLK%M^Z4KiQzQsrJ!#pox36scxJPRN?YYR*fzrh$lVs__C z34QfeE)Bx>6kJe8?55;SX$&3>-%xVC3m6+*=MJ9`|^PJNjLdCdf@SE;cRU<`K zdy%ih@1topj2A$FF{z`sOWqSki)mP6jg}t-I76J2;>reWOdLESgR{fy4ZXJyNMo|t zbPUrIgsFHD&4N0uYYBg#4-u-cehyG(ox~rZj&^q(65&a(yC;DWh-Jl6I3pH4^So?V zu-D*Izzjh?pTnDEol-QH0h^l`tG~fSj0r{y2wIo3hXIm@;0=%0wgk5&CEOFy5 z^XrYn`YZd$6FNj13u;OhTQ#V=GF*g9k)5jqWn#G)!+ro#l)i~TnnB@5Lh8X7QX+s% zpojy}!-Y%nVQj?EaO0KymNvl1^!Zce6Qj@xL?0QD2$4Ha=$E5C5{AYb{vvj<>e|xs zaO8|Ya}U4Y=qilnHBlG%@;Ii~VBI!L=zl}sYyu(pO=N&@vI|cWRjmJ`K_q=2?LL6^ ze~k9SGyF}|-FSsB9E>W#8waKp5A{qEQk9t?y3v8$w_~q|ahiJ@woIislz`gK1)wq} z8SZnSG$zq}5XUPY)bAC4ks}uV%uh2++MPwqS5S;uGPfgv4aHP0Er+O_&2QsZ8q0&x zv(PpNzYhZ#_&!cw2A43+-$$m0fDwwuE9XQ@kA8`E3huQ>+cdo3PJ?~}=VUue&x3hl zOMDK^W!~S+3!Iv98(Gl>i-_7BF>izag3(i7mM0Jxi!z~W%A=7M6}<(zmN1#92WL%M zMGRzD*A0G+Or)KykAca+=7wIzFh^L{@59$&i+5B1FJ$yDvV=Y8&_m3Oj1Qw&w9v%; z*9RmjEt~+`m074@8_p(qx)8>8 zu)$`nm|FunFgNatSI|Hb4kB(1nu0*qCJ}Rsz#wrP9YfSU_C5=W=I9DSSP`XOY8KJT zSmgC3>R$F)8UW>g1YX`{;3K?)I2gLvLu$lf8sZQDj7>m6wckXOVL1II>YgH;ipUU7 zjCZD`P7yG)lwsy%08B)m|IaAoY5M&1wM?#Kay=8_s#g*dtF6;Rn54hMhlX(Gd#HQ% zuZ1&r4FF?62cYWxqv(kSY9Gc#np0ok=#^-QVezNU_nMGe<7MXz$L@#qCbf4_{slLP z%%OV>kNq)n!=L?q)Gha;0Qattxey74T^`F%s*SLx;ojTuns=fdmZP=m+3#paD_hnFlXk3un}?B_CT0scTfczP z2tDGITS8>Qd1eH9!inM_$DWf%C?$bf*`4*5^bhe7gkPY)&Rn#7vx@zMi?uW14x=1J zPCaUxu?l(#t@XE=NUtAfZV2btHAy}oUljVox;1wiNGkgeBxZTgZzdBwfO`XkNcLfX zp6q;auy}ygIORZi-`&O%gp}M z)E2PgoO)pswkURP%hFDmZJf~9x`#7q(vtH#BkR45ys?9zhw}62GV%>TY9P2&ur*|D zB3kr=ES_OPe?k~7xN%=doL9Alwpm7?$r#fBJpd+H#XYgUXu2Mv0TR^e~}zhw^h zNkrt8!B>%BLED&OAQim}B^NukOYjWdh`fjVBsrF{xe&hy;jUaP!>1VouDp$GH=}3S z1Nf9gjh?3~np$po?L0h!xo-NLIHjYvz=sH;IIq$h*`~90KB~nIfwe>3Z16?&_S0P~ zn^SSoC z%dSzx6(_rYdiTWhk+?e)0)JQFqgExj@VI#ffvotw{Z_&`?!TOuqoC*rTficaOS`=wxq*{ zhhV?yeA0yOzu1vU7|@Z26P9G74?^(Q;qnnLpK(6U_xx<)$eSk(_q>JTn-q^8{Im*? z70-RYqbPPbHd~3WX3!^;3~a#Jc#t4Dc=;steaM6ULY3i+#>HDwJZ}ppH<(a9e4?2o zjlp1KbTDGAi;4lVYg&A(?qVSljJ-2d$Sd>?4=)a5);=8yb1+S?^wH3^Bpj5`h~Zz%NlQuod7yoR{DTeFuuaM*fNm{Izq#vHp!T2J4gXP~i_V zQFs72rPbN@P`nT=$PzP-+e=HtyIdm4#)d2vQI^cOT=Wxq=m#75k=1idXt5Y2^{vcN zXoM-@8(5E(PuPxei)`W-$y#=pjrUd?#p)`K=1sgyQS}e`(Qih^+QWz%x{$N(BzB5; zvRfpNFc4XxrqL|U=4_fSXT;E6Lg-*>$Ve1G4JcjwtVGkTqd*nM>^U;K4n*ZaJg~%j z%tCe`Za`Xy%F}ljksxchkMlSr%9Ol(tr)cxe@bK+*j(U^3`RYUk3}qPB}HC6q|^%rKt<7-!F3o{@G&IO$HCFF4XE0$0V*ucF~mCZG$&iRqz=ciY;t2=2HpsG zBml6~1p)VE02TXN?o)e1%s`OyQ$(6L-H&2=B$sVF(+K>|VfqC_ITe*Mg8WpTZA^!As!$ATokv z(466|aAh`o`UxJ*xSHsMjP!UpI%(tMeB|3qhCUt0Zn+q=aX>@+146+HB1sMfmqsSnmB08n zx*z^x?sy;gQU>tcAGN~9O;g&0nwP+WCMS18z}7K!YwwC+0Y8nmT7!q~CcFvm#J~Wg z-}4}LcZc6O&o+^!%&l&^gfG=MFc|^?jv}y%1cA7##I;9NHvz-$0hZloY7T&cER>f_ z{yuaW?^)&KN2}tniQ&M51s>m{2N(AUlo?}Ap`1p%lEd|G?n#yVDMYM22asf803zC% zMh{x&*p_86zC6@mM-EK3{-^n7n0zqDaHbgdPxAe!%c94xbW{2Ztbsm@9hVqO3Ng`Q zgb5Git~lP4__p>KPFAuNOgsJGq2Z3e3F$Q_@Xm3R;y1b*+mC`HFYucB0JwFohLASFSJX7P{lT1bWoTdzXOIDOJ!f6#+T;oBXEsCt1t}JmI2B=y?S*Uv zL4%c>&mo#a zCHeXR_V1xzUV@o_fehvqGizMU#t9()pj&%>9%a$R+PoFmkcwG7F$e8jeT0V>^xAgm zW=OnC(o>U8SY_fQZ;9SU_lJ!GI*fZ3y%NWo*nu6lOxn>m^#^_Zo6(x*zc%>%+8_0v z@9(RP$PTjAu3fV~60uQ=6Sx3+_#@)Ce=$g=Ul2s_Wl+9grx{FsKMsnOwlbeG-$N{A zKPL4MC-qjm6rLqloOw zZslY4no4T2n4!;g!FzamTI&PgIrz=R2n2d#wwQyJoF?Wpe@-EYkneW zZJbDVvCKemjB`Zz*j@cSM6I(M8EJ>T;KZuv-N1lN>~0rH}j?s_NK<*33#*gj}kF7m^0u<8&cJ#oGx>bY?rZ)tY9DT_A@pGZrQZctL2*Kx72oC!9*K*p_#{ z9EBl}`4}Nb{Sk*fGy@n(i^N9`!~za>ZXOV75){gC;$D=yd8ik!Y&`!zVAnS>S!eQ# zOz29R!$xM|ucD*GleEJ0NrVDPjPqH9 z!7!Is$eG&mXk>SDWf0c#tpK#Xj>$Yb5Q>~)QGgIBNy&#kM`-ZekzM0MZ|wlAa+T==ti5>iIsEYO|i=L!6N8@CMnGRAxp zt|W*+Nb1|z@^&V7Fd1T3RE<7LfKY+q<}Cz^4%!s_B$z7F>%V7*`;jd0)$vab8D8>v z#EV$Uh~kUz66hKZjQ(iV9#llimOvGl5(p;kb5c_+Jki$@Zs=a?dg^NH9&om`yOKB1 zfA>7V2#y0V0)!hG`0|R>cyK`yVP^npL@Gc-!igU|5duCzo(FOvvw;&qHk?Sw%+Bf? z2_ivqQN0i0V}!;9(`OK}+M9u%v=GFfXVYX>!t{)ZbM8m%9tdT2LgSRqPA!!-S+(DTU%oApZTOG}_T$=b4 zW)a*Tvk0EfnQUSKAiB?E!MWVi!LtuTWZ*<%k21v3Q|pW+RX6<=o#0?aUtvNuP&NHm%M%`WpptfQQ1`b%^j zn=k0G58)<6+Hw|LdE1Q%JOJ+Jh_CFPYiq>QG;q{J0_+xt5LMf;Z1KBJPV^(R$O;x4 z48DvB5eg7{kD^1vfBKDYvM#b$@}z)^a7)&UyeMR4Ul4Q@Ti+p)U zS_B+0UYX}pU;#_`pA%bN(Gy1Jxs!+7L6_=1$x~`={arI2=ri_5EdAZ{Jm${a`3~;b zTs)J*@XUf)stwDmUE~Hoy&LMr4xCSow>GKSz|s>v1|!1=aGnmw+@4T{bN2H##v<>J zd&l$5UjNNq=AEc*^lI;f&IS5_Rrf5wzknQyJ`Zhm5BUEEbv2wB zQg=}U%kcd;Cl|;5A%crzitB#N*o^LMUucGB@RkzXNWkA?j+6l{=)L$=9^sb$3f8?A zajb+0JW&Mli;eYQxx$!*+(W+BBjT%JrZ&oh`t8W^h%fGG562!D{L>!MNl_#sP_I$~34H+5WDbmZ54#a?-N`z_ zOs^vOJpzkscou!QW`~h837;(v-Xm$#V}jpwAW>oBVKPMtjPeS&k0bi%M}v_Al?egG z_+7Xpd&J@>#~9=TrVa_*!*v)}a3d1#NC88Kz9fElVa)I^!8{OzCX;qMcgifv+R5qV z78U^FBLJ`zgDCAPPE(7{1Tc$a=Cn=2R-=<5vT+Of_VPHEKXA}!@)u1s#{yP#0Kd#( zJ3|^3o#Y-yZZs;`>QE935poG;VfkPdCx*>VIp!B~Hf)G#9E&|S!(&k;wXxbfH|5Rn zpj6yOql*4RbdBTLD_B6ov96U$Sg2Ii)~gMQ5tMK;sA?@B;plQ|}seoMcb3H^Lw>ggt8sCAhYf_VXR zXPNvslb>MnK_(w&La(#_1e3qbEf$O8sLd2}p2POw6t9k@JXc0!Ti-Wh zLZ9~J#WB8({|0Icw@&8JM-Kne#jA@W#XPUciQ-L{w=P~RJc##>PmWIFXwc%Th3ku@ z;(^I5-wa;#YT@e1{pK5xKcESxsr~vM0`m})w=fxDLgeP3OIYxu1BS?S45_5#k1NRv znK_4ibne~99;zIE(Dw{r(ZH_igA^4ULUrTYN?O3_p6C(7>Q{3}IA_*aT%aEOOy&c&%oy2QqUX7}<- z?qfm(4#z7vLm9fHIeZ#N1>eAy+aOSwz0dFx0>zl7JmWkYodHO$&2j;FF#-I+Y39X( O$N({!ZSP_!|Nj6G+~pbo literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2431772db420295a4d30eeb3739746a525117c89 GIT binary patch literal 32169 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/sandbox.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/sandbox.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d18aa6269b53af2611bad4f7501c43432f35d3ba GIT binary patch literal 11922 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/tests.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/tests.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37723bcf3b9233a4337cfdd8590555c48f3680a7 GIT binary patch literal 6574 zcmb_g%X8bt83#a8Bt=PbRLmX(z0v6vSOgkU)T0 zfO14DmpG?hI@9T;Gd?tz&iLGaAd_P+Jr}3W^yE|TKK1wQ0uUroWIYpbu-yIjf!}`b zU3+k_U&Hg`zwh&rQ=0Z4YGj`&G=7dZ5Qe5Pt*SAd8LnQ{<-bwQ;Xmi*8-;2?r@p+~ z*CPXri zV1sCnqD>=)Ugg*^HVn#ftZ^cqGr~qeIhmmxXD2`z;}v$2pTejy%sa(Sf0uu$S5NPw zo?&Mt^-N~=Id&ei&t@nW*hNszWhj@J3Cj5lzs~i|o0)e8b$YGLdkb}XZ)e_F)MwelSCiE{%vjW>AGPoOvgNqp zjN_RhZ!}#y5~l@-%(a$$$Qu-=dsKbzL0oV{AdU*EG< zW0i|HI>>02zwj7eb3D$_7;f4@P~+aVBYdyHy%4m@LZ)d%g>Bny@u*MmuqC`Yt&%)c zhjD20c!L2HyD)??jTu|Cfn0n1b2-NhMT?uxnnb&83&&n{(GERka@S%VJXojHrJMHdjkKOTY?pcDIj37p- zT@jb|_9q6>jLH%Y4L^=%g6A0O(>ckIDCe~rq6|V^f<=WMs?(cc|1Pm#m+Uv%GxHm~ zzD10;%`DrQv+V>9$zXK{U056HVeNsOHk25KvGzf%!xC${!s^ax3`!u6pniyjxh%pE zDiZ21jR6e`qT3&WF+I2#>*`#8zlq1P%)oDnIhjXqv|W1|OEhMGotQwa%@z zy!zY<#@j77Trt;R;#`<(zJMqK2X@ZQ=k|^n`ewjGvy~XDTqN09V9DldBkG4Fy&$x` zIu`|!S0@D@FjCz_U?i^g%u{D8y906}E9Pn|lsogWJt46RAFwSk zdK8`^i6`Bfl_E04Nt#ncF`bKYux6!+-Bq7(?&`bRrnarr>I~E>qx&(7`PU9PPw2d7 zH@IcOudKCPWghX61{lA}C2##^==h%Px-gM#+i}TfS*a3|`pvAmetqjGC7f*7VvE6J zO_HaJ*FT_zQsv-W&0RAYZT42Zbk>2P`_v7FvJJOMTVRYcpuB6{mK%eIFDf{}YeS3? zzxO*`<&-K?Mrz<)3{p0JOq@aeXfJd~6yNR_1ubfJ6NDV_Q;Na$TTF^Tu6$4cvA-Z0 zKuR?BprMnuNI1URY9h#HMI?JWdx(7#UH^IKiHXo?G(AVSn*>4j+lO3CSD6=R|A8QP zebA??_(S~*si2RGb0laAT**WAG~AHNP_%E6#To5hvC#89ZawQ20%_Fmuy7Jj&ZB-b z1PV_ILURcJhJ=!9KkE=s{MAif4@tzfx$65aw>=dC_AL5@~iQJ zD=F}TARl`)@B_U2s4L*dHlj~&m|alzlVodaw9ZBb^QLcWg7C-v$_>i|+B%FUu2=5z_M z@rpZ{O8WP~JH{t|uL5}Z;I93Z<@7oOC@lJSCv#0EWnEq1#tNy(V zw(aX35GQ$xa;k8BbsI+(Yubo%K`5f46G(^H1()pqLyF4~6F)UB>B|#b;wqLWT$0)a zm+b#z2G>+4T&a>ClJ7(ZZe_g_*yDKX;FQ!i39BO-6`s}TKWE@fcZHLPFVr`Umvlzc z+lxH_;ZW5CB6Es4@Sr@bThm?C@19CAatb}EO;r3;t;#BB`8*Ax-u9@n3?25dsq5NrHSa`T3yqx# zU8CQZ2$zf6ZA2>Ro_^mGa=^c8aU}MZxfs_FzXVT@DS>2mxM7Eqj3cj5St=zGkC!Ne zcDWZ-YPEG9qPJ12MdgLB>s+R`9d|z{V@2}eztPr6XSBSbm-K#pKrb2MHrmO-v>=oI z9!FCZ?{-zLptt|KmzsNKtouzLt}~!R51o+$e0aLxBEJA{GZ#3J)O`i_m{oI>NlypM2Tg1I+AaCsU)5DlkwgU5a^sDrzU)(|cP!^G@967}HK%#Q7vgtc!M`fE$ zdG3Uhf!Xu}bpZf|OSJ(%d_+GmIF^V7{V}3Ebw=f-ohDxp!WUh1CegkhXai)Qnqfd+ zq{h65)}f6Y@{tVp0y3Grn1UrntD`!&&VxEGc$if!)oL4I!>!fmD6?S)B%+SUly`~e z{eys!N5WmteUym`=b-KXrvj_vWqU5gmtw;m9hT|h7-!YtYo9K>4-^M=p(qW|@&1WE zg|;9*AheU!94@S?dAcU5Rx%eb)na`25S7ytb=0R0Zc(0=i}I9MN5wc%jS5oX(T98s zF;8Vd;tIYJ6=d9v3Np+^eJZ|0#n?edeabIJrNl!-r9|#gsSfiX|5NQ#svH$#&PRsh zwT*`lBZGfcEy9)AZs@m-%OH6Ct^O!7*28LL9rgunBRdCyw~a>+-|7z{!wst?7ao8* z+QtJ+a{2V#s938pzYdR9N-jR5zHo;^RiuYerS7{fQhuC&<^4Uvkb)iv(z|L=w7k%1 zs5=vEH+0-U^brRJm%jXLp*H`?!u+qEJo`ARWbQ`gy@W7nRGxS#uM7p<(+RryigLg3 zcI1_cy2YTBLLQgpQA*HZMji|VW!{34TS3X87^i})Sxiwu5nP5p8FHkzm7YM56-mvF z%JaS#+PHlYQa8jC>Um1Vr&Ro!iqEL{oQg#h)xy%k;?iP9+oTVY*N>$K4WG4K{)i5E z!Jkm%;p|Ifyav5}`ao{DFkBcdjE;;J4E@9i-jisR@GIk2ihE0-4UP?t_Kz0E%7*@K Lzr5b%_pko}bwmFY literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/utils.cpython-39.pyc b/Meliora/gmapenv/Lib/site-packages/jinja2/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bcbadbfca34acc4bbe2948a4a931b8ae68ef7e9 GIT binary patch literal 24542 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 literal 0 HcmV?d00001 diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/_identifier.py b/Meliora/gmapenv/Lib/site-packages/jinja2/_identifier.py new file mode 100644 index 00000000..928c1503 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/jinja2/_identifier.py @@ -0,0 +1,6 @@ +import re + +# generated by scripts/generate_identifier_pattern.py +pattern = re.compile( + r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 +) diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/async_utils.py b/Meliora/gmapenv/Lib/site-packages/jinja2/async_utils.py new file mode 100644 index 00000000..1a4f3892 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/jinja2/async_utils.py @@ -0,0 +1,84 @@ +import inspect +import typing as t +from functools import WRAPPER_ASSIGNMENTS +from functools import wraps + +from .utils import _PassArg +from .utils import pass_eval_context + +V = t.TypeVar("V") + + +def async_variant(normal_func): # type: ignore + def decorator(async_func): # type: ignore + pass_arg = _PassArg.from_obj(normal_func) + need_eval_context = pass_arg is None + + if pass_arg is _PassArg.environment: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].is_async) + + else: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].environment.is_async) + + # Take the doc and annotations from the sync function, but the + # name from the async function. Pallets-Sphinx-Themes + # build_function_directive expects __wrapped__ to point to the + # sync function. + async_func_attrs = ("__module__", "__name__", "__qualname__") + normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) + + @wraps(normal_func, assigned=normal_func_attrs) + @wraps(async_func, assigned=async_func_attrs, updated=()) + def wrapper(*args, **kwargs): # type: ignore + b = is_async(args) + + if need_eval_context: + args = args[1:] + + if b: + return async_func(*args, **kwargs) + + return normal_func(*args, **kwargs) + + if need_eval_context: + wrapper = pass_eval_context(wrapper) + + wrapper.jinja_async_variant = True + return wrapper + + return decorator + + +_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} + + +async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": + # Avoid a costly call to isawaitable + if type(value) in _common_primitives: + return t.cast("V", value) + + if inspect.isawaitable(value): + return await t.cast("t.Awaitable[V]", value) + + return t.cast("V", value) + + +async def auto_aiter( + iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> "t.AsyncIterator[V]": + if hasattr(iterable, "__aiter__"): + async for item in t.cast("t.AsyncIterable[V]", iterable): + yield item + else: + for item in t.cast("t.Iterable[V]", iterable): + yield item + + +async def auto_to_list( + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> t.List["V"]: + return [x async for x in auto_aiter(value)] diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/bccache.py b/Meliora/gmapenv/Lib/site-packages/jinja2/bccache.py new file mode 100644 index 00000000..d0ddf56e --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/jinja2/bccache.py @@ -0,0 +1,406 @@ +"""The optional bytecode cache system. This is useful if you have very +complex template situations and the compilation of all those templates +slows down your application too much. + +Situations where this is useful are often forking web applications that +are initialized on the first request. +""" +import errno +import fnmatch +import marshal +import os +import pickle +import stat +import sys +import tempfile +import typing as t +from hashlib import sha1 +from io import BytesIO +from types import CodeType + +if t.TYPE_CHECKING: + import typing_extensions as te + from .environment import Environment + + class _MemcachedClient(te.Protocol): + def get(self, key: str) -> bytes: + ... + + def set(self, key: str, value: bytes, timeout: t.Optional[int] = None) -> None: + ... + + +bc_version = 5 +# Magic bytes to identify Jinja bytecode cache files. Contains the +# Python major and minor version to avoid loading incompatible bytecode +# if a project upgrades its Python version. +bc_magic = ( + b"j2" + + pickle.dumps(bc_version, 2) + + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) +) + + +class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment: "Environment", key: str, checksum: str) -> None: + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self) -> None: + """Resets the bucket (unloads the bytecode).""" + self.code: t.Optional[CodeType] = None + + def load_bytecode(self, f: t.BinaryIO) -> None: + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal.load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f: t.IO[bytes]) -> None: + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError("can't write empty bucket") + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal.dump(self.code, f) + + def bytecode_from_string(self, string: bytes) -> None: + """Load bytecode from bytes.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self) -> bytes: + """Return the bytecode as bytes.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja. + """ + + def load_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self) -> None: + """Clears the cache. This method is not used by Jinja but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key( + self, name: str, filename: t.Optional[t.Union[str]] = None + ) -> str: + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode("utf-8")) + + if filename is not None: + hash.update(f"|{filename}".encode()) + + return hash.hexdigest() + + def get_source_checksum(self, source: str) -> str: + """Returns a checksum for the source.""" + return sha1(source.encode("utf-8")).hexdigest() + + def get_bucket( + self, + environment: "Environment", + name: str, + filename: t.Optional[str], + source: str, + ) -> Bucket: + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket: Bucket) -> None: + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__( + self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" + ) -> None: + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self) -> str: + def _unsafe_dir() -> "te.NoReturn": + raise RuntimeError( + "Cannot determine safe temp directory. You " + "need to explicitly provide one." + ) + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == "nt": + return tmpdir + if not hasattr(os, "getuid"): + _unsafe_dir() + + dirname = f"_jinja2-cache-{os.getuid()}" + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket: Bucket) -> str: + return os.path.join(self.directory, self.pattern % (bucket.key,)) + + def load_bytecode(self, bucket: Bucket) -> None: + filename = self._get_cache_filename(bucket) + + # Don't test for existence before opening the file, since the + # file could disappear after the test before the open. + try: + f = open(filename, "rb") + except (FileNotFoundError, IsADirectoryError, PermissionError): + # PermissionError can occur on Windows when an operation is + # in progress, such as calling clear(). + return + + with f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket: Bucket) -> None: + # Write to a temporary file, then rename to the real name after + # writing. This avoids another process reading the file before + # it is fully written. + name = self._get_cache_filename(bucket) + f = tempfile.NamedTemporaryFile( + mode="wb", + dir=os.path.dirname(name), + prefix=os.path.basename(name), + suffix=".tmp", + delete=False, + ) + + def remove_silent() -> None: + try: + os.remove(f.name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + pass + + try: + with f: + bucket.write_bytecode(f) + except BaseException: + remove_silent() + raise + + try: + os.replace(f.name, name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + remove_silent() + except BaseException: + remove_silent() + raise + + def clear(self) -> None: + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + + files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) + for filename in files: + try: + remove(os.path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `cachelib `_ + - `python-memcached `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only text. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__( + self, + client: "_MemcachedClient", + prefix: str = "jinja2/bytecode/", + timeout: t.Optional[int] = None, + ignore_memcache_errors: bool = True, + ): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket: Bucket) -> None: + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + else: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket: Bucket) -> None: + key = self.prefix + bucket.key + value = bucket.bytecode_to_string() + + try: + if self.timeout is not None: + self.client.set(key, value, self.timeout) + else: + self.client.set(key, value) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/compiler.py b/Meliora/gmapenv/Lib/site-packages/jinja2/compiler.py new file mode 100644 index 00000000..3458095f --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/jinja2/compiler.py @@ -0,0 +1,1957 @@ +"""Compiles nodes from the parser into Python code.""" +import typing as t +from contextlib import contextmanager +from functools import update_wrapper +from io import StringIO +from itertools import chain +from keyword import iskeyword as is_python_keyword + +from markupsafe import escape +from markupsafe import Markup + +from . import nodes +from .exceptions import TemplateAssertionError +from .idtracking import Symbols +from .idtracking import VAR_LOAD_ALIAS +from .idtracking import VAR_LOAD_PARAMETER +from .idtracking import VAR_LOAD_RESOLVE +from .idtracking import VAR_LOAD_UNDEFINED +from .nodes import EvalContext +from .optimizer import Optimizer +from .utils import _PassArg +from .utils import concat +from .visitor import NodeVisitor + +if t.TYPE_CHECKING: + import typing_extensions as te + from .environment import Environment + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +operators = { + "eq": "==", + "ne": "!=", + "gt": ">", + "gteq": ">=", + "lt": "<", + "lteq": "<=", + "in": "in", + "notin": "not in", +} + + +def optimizeconst(f: F) -> F: + def new_func( + self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any + ) -> t.Any: + # Only optimize if the frame is not volatile + if self.optimizer is not None and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + + if new_node != node: + return self.visit(new_node, frame) + + return f(self, node, frame, **kwargs) + + return update_wrapper(t.cast(F, new_func), f) + + +def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed + and op in self.environment.intercepted_binops # type: ignore + ): + self.write(f"environment.call_binop(context, {op!r}, ") + self.visit(node.left, frame) + self.write(", ") + self.visit(node.right, frame) + else: + self.write("(") + self.visit(node.left, frame) + self.write(f" {op} ") + self.visit(node.right, frame) + + self.write(")") + + return visitor + + +def _make_unop( + op: str, +) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed + and op in self.environment.intercepted_unops # type: ignore + ): + self.write(f"environment.call_unop(context, {op!r}, ") + self.visit(node.node, frame) + else: + self.write("(" + op) + self.visit(node.node, frame) + + self.write(")") + + return visitor + + +def generate( + node: nodes.Template, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, +) -> t.Optional[str]: + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError("Can't compile non template nodes") + + generator = environment.code_generator_class( + environment, name, filename, stream, defer_init, optimized + ) + generator.visit(node) + + if stream is None: + return generator.stream.getvalue() # type: ignore + + return None + + +def has_safe_repr(value: t.Any) -> bool: + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + + if type(value) in {bool, int, float, complex, range, str, Markup}: + return True + + if type(value) in {tuple, list, set, frozenset}: + return all(has_safe_repr(v) for v in value) + + if type(value) is dict: + return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) + + return False + + +def find_undeclared( + nodes: t.Iterable[nodes.Node], names: t.Iterable[str] +) -> t.Set[str]: + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef: + def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame: + """Holds compile time information for us.""" + + def __init__( + self, + eval_ctx: EvalContext, + parent: t.Optional["Frame"] = None, + level: t.Optional[int] = None, + ) -> None: + self.eval_ctx = eval_ctx + + # the parent of this frame + self.parent = parent + + if parent is None: + self.symbols = Symbols(level=level) + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = False + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer: t.Optional[str] = None + + # the name of the block we're in, otherwise None. + self.block: t.Optional[str] = None + + else: + self.symbols = Symbols(parent.symbols, level=level) + self.require_output_check = parent.require_output_check + self.buffer = parent.buffer + self.block = parent.block + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # variables set inside of loops and blocks should not affect outer frames, + # but they still needs to be kept track of as part of the active context. + self.loop_frame = False + self.block_frame = False + + # track whether the frame is being used in an if-statement or conditional + # expression as it determines which errors should be raised during runtime + # or compile time. + self.soft_frame = False + + def copy(self) -> "Frame": + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self, isolated: bool = False) -> "Frame": + """Return an inner frame.""" + if isolated: + return Frame(self.eval_ctx, level=self.symbols.level + 1) + return Frame(self.eval_ctx, self) + + def soft(self) -> "Frame": + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements and conditional + expressions. + """ + rv = self.copy() + rv.rootlevel = False + rv.soft_frame = True + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self) -> None: + self.filters: t.Set[str] = set() + self.tests: t.Set[str] = set() + + def visit_Filter(self, node: nodes.Filter) -> None: + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node: nodes.Test) -> None: + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names: t.Iterable[str]) -> None: + self.names = set(names) + self.undeclared: t.Set[str] = set() + + def visit_Name(self, node: nodes.Name) -> None: + if node.ctx == "load" and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + def __init__( + self, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, + ) -> None: + if stream is None: + stream = StringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimizer: t.Optional[Optimizer] = None + + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases: t.Dict[str, str] = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks: t.Dict[str, nodes.Block] = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests: t.Dict[str, str] = {} + self.filters: t.Dict[str, str] = {} + + # the debug information + self.debug_info: t.List[t.Tuple[int, int]] = [] + self._write_debug_info: t.Optional[int] = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack: t.List[t.Set[str]] = [] + + # Tracks parameter definition blocks + self._param_def_block: t.List[t.Set[str]] = [] + + # Tracks the current context. + self._context_reference_stack = ["context"] + + @property + def optimized(self) -> bool: + return self.optimizer is not None + + # -- Various compilation helpers + + def fail(self, msg: str, lineno: int) -> "te.NoReturn": + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self) -> str: + """Get a new unique identifier.""" + self._last_identifier += 1 + return f"t_{self._last_identifier}" + + def buffer(self, frame: Frame) -> None: + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline(f"{frame.buffer} = []") + + def return_buffer_contents( + self, frame: Frame, force_unescaped: bool = False + ) -> None: + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline("if context.eval_ctx.autoescape:") + self.indent() + self.writeline(f"return Markup(concat({frame.buffer}))") + self.outdent() + self.writeline("else:") + self.indent() + self.writeline(f"return concat({frame.buffer})") + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline(f"return Markup(concat({frame.buffer}))") + return + self.writeline(f"return concat({frame.buffer})") + + def indent(self) -> None: + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step: int = 1) -> None: + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline("yield ", node) + else: + self.writeline(f"{frame.buffer}.append(", node) + + def end_write(self, frame: Frame) -> None: + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(")") + + def simple_write( + self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None + ) -> None: + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline("pass") + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x: str) -> None: + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write("\n" * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(" " * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline( + self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 + ) -> None: + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature( + self, + node: t.Union[nodes.Call, nodes.Filter, nodes.Test], + frame: Frame, + extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + ) -> None: + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occur. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = any( + is_python_keyword(t.cast(str, k)) + for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) + ) + + for arg in node.args: + self.write(", ") + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(", ") + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f", {key}={value}") + if node.dyn_args: + self.write(", *") + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(", **dict({") + else: + self.write(", **{") + for kwarg in node.kwargs: + self.write(f"{kwarg.key!r}: ") + self.visit(kwarg.value, frame) + self.write(", ") + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f"{key!r}: {value}, ") + if node.dyn_kwargs is not None: + self.write("}, **") + self.visit(node.dyn_kwargs, frame) + self.write(")") + else: + self.write("}") + + elif node.dyn_kwargs is not None: + self.write(", **") + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: + """Find all filter and test names used in the template and + assign them to variables in the compiled namespace. Checking + that the names are registered with the environment is done when + compiling the Filter and Test nodes. If the node is in an If or + CondExpr node, the check is done at runtime instead. + + .. versionchanged:: 3.0 + Filters and tests in If and CondExpr nodes are checked at + runtime instead of compile time. + """ + visitor = DependencyFinderVisitor() + + for node in nodes: + visitor.visit(node) + + for id_map, names, dependency in (self.filters, visitor.filters, "filters"), ( + self.tests, + visitor.tests, + "tests", + ): + for name in sorted(names): + if name not in id_map: + id_map[name] = self.temporary_identifier() + + # add check during runtime that dependencies used inside of executed + # blocks are defined, as this step may be skipped during compile time + self.writeline("try:") + self.indent() + self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") + self.outdent() + self.writeline("except KeyError:") + self.indent() + self.writeline("@internalcode") + self.writeline(f"def {id_map[name]}(*unused):") + self.indent() + self.writeline( + f'raise TemplateRuntimeError("No {dependency[:-1]}' + f' named {name!r} found.")' + ) + self.outdent() + self.outdent() + + def enter_frame(self, frame: Frame) -> None: + undefs = [] + for target, (action, param) in frame.symbols.loads.items(): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") + elif action == VAR_LOAD_ALIAS: + self.writeline(f"{target} = {param}") + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError("unknown load instruction") + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: + if not with_python_scope: + undefs = [] + for target in frame.symbols.loads: + undefs.append(target) + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: + return async_value if self.environment.is_async else sync_value + + def func(self, name: str) -> str: + return f"{self.choose_async()}def {name}" + + def macro_body( + self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame + ) -> t.Tuple[Frame, MacroRef]: + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + + for idx, arg in enumerate(node.args): + if arg.name == "caller": + explicit_caller = idx + if arg.name in ("kwargs", "varargs"): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) + + if "caller" in undeclared: + # In older Jinja versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail( + "When defining macros or call blocks the " + 'special "caller" argument must be omitted ' + "or be given a default.", + node.lineno, + ) + else: + args.append(frame.symbols.declare_parameter("caller")) + macro_ref.accesses_caller = True + if "kwargs" in undeclared and "kwargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("kwargs")) + macro_ref.accesses_kwargs = True + if "varargs" in undeclared and "varargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("varargs")) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline(f"if {ref} is missing:") + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline( + f'{ref} = undefined("parameter {arg.name!r} was not provided",' + f" name={arg.name!r})" + ) + else: + self.writeline(f"{ref} = ") + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, "name", None) + if len(macro_ref.node.args) == 1: + arg_tuple += "," + self.write( + f"Macro(environment, macro, {name!r}, ({arg_tuple})," + f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," + f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" + ) + + def position(self, node: nodes.Node) -> str: + """Return a human readable position for the node.""" + rv = f"line {node.lineno}" + if self.name is not None: + rv = f"{rv} in {self.name!r}" + return rv + + def dump_local_context(self, frame: Frame) -> str: + items_kv = ", ".join( + f"{name!r}: {target}" + for name, target in frame.symbols.dump_stores().items() + ) + return f"{{{items_kv}}}" + + def write_commons(self) -> None: + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline("resolve = context.resolve_or_missing") + self.writeline("undefined = environment.undefined") + self.writeline("concat = environment.concat") + # always use the standard Undefined class for the implicit else of + # conditional expressions + self.writeline("cond_expr_undefined = Undefined") + self.writeline("if 0: yield None") + + def push_parameter_definitions(self, frame: Frame) -> None: + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self) -> None: + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target: str) -> None: + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def push_context_reference(self, target: str) -> None: + self._context_reference_stack.append(target) + + def pop_context_reference(self) -> None: + self._context_reference_stack.pop() + + def get_context_ref(self) -> str: + return self._context_reference_stack[-1] + + def get_resolve_func(self) -> str: + target = self._context_reference_stack[-1] + if target == "context": + return "resolve" + return f"{target}.resolve" + + def derive_context(self, frame: Frame) -> str: + return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" + + def parameter_is_undeclared(self, target: str) -> bool: + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self) -> None: + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame: Frame) -> None: + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if ( + not frame.block_frame + and not frame.loop_frame + and not frame.toplevel + or not vars + ): + return + public_names = [x for x in vars if x[:1] != "_"] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + if frame.loop_frame: + self.writeline(f"_loop_vars[{name!r}] = {ref}") + return + if frame.block_frame: + self.writeline(f"_block_vars[{name!r}] = {ref}") + return + self.writeline(f"context.vars[{name!r}] = {ref}") + else: + if frame.loop_frame: + self.writeline("_loop_vars.update({") + elif frame.block_frame: + self.writeline("_block_vars.update({") + else: + self.writeline("context.vars.update({") + for idx, name in enumerate(vars): + if idx: + self.write(", ") + ref = frame.symbols.ref(name) + self.write(f"{name!r}: {ref}") + self.write("})") + if not frame.block_frame and not frame.loop_frame and public_names: + if len(public_names) == 1: + self.writeline(f"context.exported_vars.add({public_names[0]!r})") + else: + names_str = ", ".join(map(repr, public_names)) + self.writeline(f"context.exported_vars.update(({names_str}))") + + # -- Statement Visitors + + def visit_Template( + self, node: nodes.Template, frame: t.Optional[Frame] = None + ) -> None: + assert frame is None, "no root frame allowed" + eval_ctx = EvalContext(self.environment, self.name) + + from .runtime import exported, async_exported + + if self.environment.is_async: + exported_names = sorted(exported + async_exported) + else: + exported_names = sorted(exported) + + self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = "" if self.defer_init else ", environment=environment" + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail(f"block {block.name!r} defined twice", block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if "." in imp: + module, obj = imp.rsplit(".", 1) + self.writeline(f"from {module} import {obj} as {alias}") + else: + self.writeline(f"import {imp} as {alias}") + + # add the load name + self.writeline(f"name = {self.name!r}") + + # generate the root render function. + self.writeline( + f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 + ) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if "self" in find_undeclared(node.body, ("self",)): + ref = frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline("parent_template = None") + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline("if parent_template is not None:") + self.indent() + if not self.environment.is_async: + self.writeline("yield from parent_template.root_render_func(context)") + else: + self.writeline( + "async for event in parent_template.root_render_func(context):" + ) + self.indent() + self.writeline("yield event") + self.outdent() + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in self.blocks.items(): + self.writeline( + f"{self.func('block_' + name)}(context, missing=missing{envenv}):", + block, + 1, + ) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + block_frame.block_frame = True + undeclared = find_undeclared(block.body, ("self", "super")) + if "self" in undeclared: + ref = block_frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + if "super" in undeclared: + ref = block_frame.symbols.declare_parameter("super") + self.writeline(f"{ref} = context.super({name!r}, block_{name})") + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.writeline("_block_vars = {}") + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) + self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) + debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) + self.writeline(f"debug_info = {debug_kv_str!r}") + + def visit_Block(self, node: nodes.Block, frame: Frame) -> None: + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline("if parent_template is None:") + self.indent() + level += 1 + + if node.scoped: + context = self.derive_context(frame) + else: + context = self.get_context_ref() + + if node.required: + self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) + self.indent() + self.writeline( + f'raise TemplateRuntimeError("Required block {node.name!r} not found")', + node, + ) + self.outdent() + + if not self.environment.is_async and frame.buffer is None: + self.writeline( + f"yield from context.blocks[{node.name!r}][0]({context})", node + ) + else: + self.writeline( + f"{self.choose_async()}for event in" + f" context.blocks[{node.name!r}][0]({context}):", + node, + ) + self.indent() + self.simple_write("event", frame) + self.outdent() + + self.outdent(level) + + def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: + """Calls the extender.""" + if not frame.toplevel: + self.fail("cannot use extend from a non top-level scope", node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline("if parent_template is not None:") + self.indent() + self.writeline('raise TemplateRuntimeError("extended multiple times")') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline("parent_template = environment.get_template(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + self.writeline("for name, parent_block in parent_template.blocks.items():") + self.indent() + self.writeline("context.blocks.setdefault(name, []).append(parent_block)") + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node: nodes.Include, frame: Frame) -> None: + """Handles includes.""" + if node.ignore_missing: + self.writeline("try:") + self.indent() + + func_name = "get_or_select_template" + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, str): + func_name = "get_template" + elif isinstance(node.template.value, (tuple, list)): + func_name = "select_template" + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = "select_template" + + self.writeline(f"template = environment.{func_name}(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + if node.ignore_missing: + self.outdent() + self.writeline("except TemplateNotFound:") + self.indent() + self.writeline("pass") + self.outdent() + self.writeline("else:") + self.indent() + + skip_event_yield = False + if node.with_context: + self.writeline( + f"{self.choose_async()}for event in template.root_render_func(" + "template.new_context(context.get_all(), True," + f" {self.dump_local_context(frame)})):" + ) + elif self.environment.is_async: + self.writeline( + "for event in (await template._get_default_module_async())" + "._body_stream:" + ) + else: + self.writeline("yield from template._get_default_module()._body_stream") + skip_event_yield = True + + if not skip_event_yield: + self.indent() + self.simple_write("event", frame) + self.outdent() + + if node.ignore_missing: + self.outdent() + + def _import_common( + self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame + ) -> None: + self.write(f"{self.choose_async('await ')}environment.get_template(") + self.visit(node.template, frame) + self.write(f", {self.name!r}).") + + if node.with_context: + f_name = f"make_module{self.choose_async('_async')}" + self.write( + f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" + ) + else: + self.write(f"_get_default_module{self.choose_async('_async')}(context)") + + def visit_Import(self, node: nodes.Import, frame: Frame) -> None: + """Visit regular imports.""" + self.writeline(f"{frame.symbols.ref(node.target)} = ", node) + if frame.toplevel: + self.write(f"context.vars[{node.target!r}] = ") + + self._import_common(node, frame) + + if frame.toplevel and not node.target.startswith("_"): + self.writeline(f"context.exported_vars.discard({node.target!r})") + + def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: + """Visit named imports.""" + self.newline(node) + self.write("included_template = ") + self._import_common(node, frame) + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline( + f"{frame.symbols.ref(alias)} =" + f" getattr(included_template, {name!r}, missing)" + ) + self.writeline(f"if {frame.symbols.ref(alias)} is missing:") + self.indent() + message = ( + "the template {included_template.__name__!r}" + f" (imported on {self.position(node)})" + f" does not export the requested name {name!r}" + ) + self.writeline( + f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" + ) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith("_"): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") + else: + names_kv = ", ".join( + f"{name!r}: {frame.symbols.ref(name)}" for name in var_names + ) + self.writeline(f"context.vars.update({{{names_kv}}})") + if discarded_names: + if len(discarded_names) == 1: + self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") + else: + names_str = ", ".join(map(repr, discarded_names)) + self.writeline( + f"context.exported_vars.difference_update(({names_str}))" + ) + + def visit_For(self, node: nodes.For, frame: Frame) -> None: + loop_frame = frame.inner() + loop_frame.loop_frame = True + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body if the body is a scoped block. + extended_loop = ( + node.recursive + or "loop" + in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) + or any(block.scoped for block in node.find_all(nodes.Block)) + ) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter("loop") + + loop_frame.symbols.analyze_node(node, for_branch="body") + if node.else_: + else_frame.symbols.analyze_node(node, for_branch="else") + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch="test") + self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.choose_async("async for ", "for ")) + self.visit(node.target, loop_frame) + self.write(" in ") + self.write(self.choose_async("auto_aiter(fiter)", "fiter")) + self.write(":") + self.indent() + self.writeline("if ", node.test) + self.visit(node.test, test_frame) + self.write(":") + self.indent() + self.writeline("yield ") + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline( + f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node + ) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline(f"{loop_ref} = missing") + + for name in node.find_all(nodes.Name): + if name.ctx == "store" and name.name == "loop": + self.fail( + "Can't assign to special loop variable in for-loop target", + name.lineno, + ) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline(f"{iteration_indicator} = 1") + + self.writeline(self.choose_async("async for ", "for "), node) + self.visit(node.target, loop_frame) + if extended_loop: + self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") + else: + self.write(" in ") + + if node.test: + self.write(f"{loop_filter_func}(") + if node.recursive: + self.write("reciter") + else: + if self.environment.is_async and not extended_loop: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(")") + if node.test: + self.write(")") + + if node.recursive: + self.write(", undefined, loop_render_func, depth):") + else: + self.write(", undefined):" if extended_loop else ":") + + self.indent() + self.enter_frame(loop_frame) + + self.writeline("_loop_vars = {}") + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline(f"{iteration_indicator} = 0") + self.outdent() + self.leave_frame( + loop_frame, with_python_scope=node.recursive and not node.else_ + ) + + if node.else_: + self.writeline(f"if {iteration_indicator}:") + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + self.write(f"{self.choose_async('await ')}loop(") + if self.environment.is_async: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(")") + self.write(", loop)") + self.end_write(frame) + + # at the end of the iteration, clear any assignments made in the + # loop from the top level + if self._assign_stack: + self._assign_stack[-1].difference_update(loop_frame.symbols.stores) + + def visit_If(self, node: nodes.If, frame: Frame) -> None: + if_frame = frame.soft() + self.writeline("if ", node) + self.visit(node.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + for elif_ in node.elif_: + self.writeline("elif ", elif_) + self.visit(elif_.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(elif_.body, if_frame) + self.outdent() + if node.else_: + self.writeline("else:") + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith("_"): + self.write(f"context.exported_vars.add({node.name!r})") + self.writeline(f"context.vars[{node.name!r}] = ") + self.write(f"{frame.symbols.ref(node.name)} = ") + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline("caller = ") + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node: nodes.With, frame: Frame) -> None: + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for target, expr in zip(node.targets, node.values): + self.newline() + self.visit(target, with_frame) + self.write(" = ") + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: + self.newline(node) + self.visit(node.node, frame) + + class _FinalizeInfo(t.NamedTuple): + const: t.Optional[t.Callable[..., str]] + src: t.Optional[str] + + @staticmethod + def _default_finalize(value: t.Any) -> t.Any: + """The default finalize function if the environment isn't + configured with one. Or, if the environment has one, this is + called on that function's output for constants. + """ + return str(value) + + _finalize: t.Optional[_FinalizeInfo] = None + + def _make_finalize(self) -> _FinalizeInfo: + """Build the finalize function to be used on constants and at + runtime. Cached so it's only created once for all output nodes. + + Returns a ``namedtuple`` with the following attributes: + + ``const`` + A function to finalize constant data at compile time. + + ``src`` + Source code to output around nodes to be evaluated at + runtime. + """ + if self._finalize is not None: + return self._finalize + + finalize: t.Optional[t.Callable[..., t.Any]] + finalize = default = self._default_finalize + src = None + + if self.environment.finalize: + src = "environment.finalize(" + env_finalize = self.environment.finalize + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(env_finalize) # type: ignore + ) + finalize = None + + if pass_arg is None: + + def finalize(value: t.Any) -> t.Any: + return default(env_finalize(value)) + + else: + src = f"{src}{pass_arg}, " + + if pass_arg == "environment": + + def finalize(value: t.Any) -> t.Any: + return default(env_finalize(self.environment, value)) + + self._finalize = self._FinalizeInfo(finalize, src) + return self._finalize + + def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: + """Given a group of constant values converted from ``Output`` + child nodes, produce a string to write to the template module + source. + """ + return repr(concat(group)) + + def _output_child_to_const( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> str: + """Try to optimize a child of an ``Output`` node by trying to + convert it to constant, finalized data at compile time. + + If :exc:`Impossible` is raised, the node is not constant and + will be evaluated at runtime. Any other exception will also be + evaluated at runtime for easier debugging. + """ + const = node.as_const(frame.eval_ctx) + + if frame.eval_ctx.autoescape: + const = escape(const) + + # Template data doesn't go through finalize. + if isinstance(node, nodes.TemplateData): + return str(const) + + return finalize.const(const) # type: ignore + + def _output_child_pre( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code before visiting a child of an + ``Output`` node. + """ + if frame.eval_ctx.volatile: + self.write("(escape if context.eval_ctx.autoescape else str)(") + elif frame.eval_ctx.autoescape: + self.write("escape(") + else: + self.write("str(") + + if finalize.src is not None: + self.write(finalize.src) + + def _output_child_post( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code after visiting a child of an + ``Output`` node. + """ + self.write(")") + + if finalize.src is not None: + self.write(")") + + def visit_Output(self, node: nodes.Output, frame: Frame) -> None: + # If an extends is active, don't render outside a block. + if frame.require_output_check: + # A top-level extends is known to exist at compile time. + if self.has_known_extends: + return + + self.writeline("if parent_template is None:") + self.indent() + + finalize = self._make_finalize() + body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] + + # Evaluate constants at compile time if possible. Each item in + # body will be either a list of static data or a node to be + # evaluated at runtime. + for child in node.nodes: + try: + if not ( + # If the finalize function requires runtime context, + # constants can't be evaluated at compile time. + finalize.const + # Unless it's basic template data that won't be + # finalized anyway. + or isinstance(child, nodes.TemplateData) + ): + raise nodes.Impossible() + + const = self._output_child_to_const(child, frame, finalize) + except (nodes.Impossible, Exception): + # The node was not constant and needs to be evaluated at + # runtime. Or another error was raised, which is easier + # to debug at runtime. + body.append(child) + continue + + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + if frame.buffer is not None: + if len(body) == 1: + self.writeline(f"{frame.buffer}.append(") + else: + self.writeline(f"{frame.buffer}.extend((") + + self.indent() + + for item in body: + if isinstance(item, list): + # A group of constant data to join and output. + val = self._output_const_repr(item) + + if frame.buffer is None: + self.writeline("yield " + val) + else: + self.writeline(val + ",") + else: + if frame.buffer is None: + self.writeline("yield ", item) + else: + self.newline(item) + + # A node to be evaluated at runtime. + self._output_child_pre(item, frame, finalize) + self.visit(item, frame) + self._output_child_post(item, frame, finalize) + + if frame.buffer is not None: + self.write(",") + + if frame.buffer is not None: + self.outdent() + self.writeline(")" if len(body) == 1 else "))") + + if frame.require_output_check: + self.outdent() + + def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: + self.push_assign_tracking() + self.newline(node) + self.visit(node.target, frame) + self.write(" = ") + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") + if node.filter is not None: + self.visit_Filter(node.filter, block_frame) + else: + self.write(f"concat({block_frame.buffer})") + self.write(")") + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node: nodes.Name, frame: Frame) -> None: + if node.ctx == "store" and ( + frame.toplevel or frame.loop_frame or frame.block_frame + ): + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == "load": + load = frame.symbols.find_load(ref) + if not ( + load is not None + and load[0] == VAR_LOAD_PARAMETER + and not self.parameter_is_undeclared(ref) + ): + self.write( + f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" + ) + return + + self.write(ref) + + def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: + # NSRefs can only be used to store values; since they use the normal + # `foo.bar` notation they will be parsed as a normal attribute access + # when used anywhere but in a `set` context + ref = frame.symbols.ref(node.name) + self.writeline(f"if not isinstance({ref}, Namespace):") + self.indent() + self.writeline( + "raise TemplateRuntimeError" + '("cannot assign attribute on non-namespace object")' + ) + self.outdent() + self.writeline(f"{ref}[{node.attr!r}]") + + def visit_Const(self, node: nodes.Const, frame: Frame) -> None: + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write( + f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" + ) + + def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: + self.write("(") + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write(",)" if idx == 0 else ")") + + def visit_List(self, node: nodes.List, frame: Frame) -> None: + self.write("[") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write("]") + + def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: + self.write("{") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item.key, frame) + self.write(": ") + self.visit(item.value, frame) + self.write("}") + + visit_Add = _make_binop("+") + visit_Sub = _make_binop("-") + visit_Mul = _make_binop("*") + visit_Div = _make_binop("/") + visit_FloorDiv = _make_binop("//") + visit_Pow = _make_binop("**") + visit_Mod = _make_binop("%") + visit_And = _make_binop("and") + visit_Or = _make_binop("or") + visit_Pos = _make_unop("+") + visit_Neg = _make_unop("-") + visit_Not = _make_unop("not ") + + @optimizeconst + def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: + if frame.eval_ctx.volatile: + func_name = "(markup_join if context.eval_ctx.volatile else str_join)" + elif frame.eval_ctx.autoescape: + func_name = "markup_join" + else: + func_name = "str_join" + self.write(f"{func_name}((") + for arg in node.nodes: + self.visit(arg, frame) + self.write(", ") + self.write("))") + + @optimizeconst + def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: + self.write("(") + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + self.write(")") + + def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: + self.write(f" {operators[node.op]} ") + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getattr(") + self.visit(node.node, frame) + self.write(f", {node.attr!r})") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write("[") + self.visit(node.arg, frame) + self.write("]") + else: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getitem(") + self.visit(node.node, frame) + self.write(", ") + self.visit(node.arg, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: + if node.start is not None: + self.visit(node.start, frame) + self.write(":") + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(":") + self.visit(node.step, frame) + + @contextmanager + def _filter_test_common( + self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool + ) -> t.Iterator[None]: + if self.environment.is_async: + self.write("(await auto_await(") + + if is_filter: + self.write(f"{self.filters[node.name]}(") + func = self.environment.filters.get(node.name) + else: + self.write(f"{self.tests[node.name]}(") + func = self.environment.tests.get(node.name) + + # When inside an If or CondExpr frame, allow the filter to be + # undefined at compile time and only raise an error if it's + # actually called at runtime. See pull_dependencies. + if func is None and not frame.soft_frame: + type_name = "filter" if is_filter else "test" + self.fail(f"No {type_name} named {node.name!r}.", node.lineno) + + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(func) # type: ignore + ) + + if pass_arg is not None: + self.write(f"{pass_arg}, ") + + # Back to the visitor function to handle visiting the target of + # the filter or test. + yield + + self.signature(node, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: + with self._filter_test_common(node, frame, True): + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write( + f"(Markup(concat({frame.buffer}))" + f" if context.eval_ctx.autoescape else concat({frame.buffer}))" + ) + elif frame.eval_ctx.autoescape: + self.write(f"Markup(concat({frame.buffer}))") + else: + self.write(f"concat({frame.buffer})") + + @optimizeconst + def visit_Test(self, node: nodes.Test, frame: Frame) -> None: + with self._filter_test_common(node, frame, False): + self.visit(node.node, frame) + + @optimizeconst + def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: + frame = frame.soft() + + def write_expr2() -> None: + if node.expr2 is not None: + self.visit(node.expr2, frame) + return + + self.write( + f'cond_expr_undefined("the inline if-expression on' + f" {self.position(node)} evaluated to false and no else" + f' section was defined.")' + ) + + self.write("(") + self.visit(node.expr1, frame) + self.write(" if ") + self.visit(node.test, frame) + self.write(" else ") + write_expr2() + self.write(")") + + @optimizeconst + def visit_Call( + self, node: nodes.Call, frame: Frame, forward_caller: bool = False + ) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + if self.environment.sandboxed: + self.write("environment.call(context, ") + else: + self.write("context.call(") + self.visit(node.node, frame) + extra_kwargs = {"caller": "caller"} if forward_caller else None + loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} + block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} + if extra_kwargs: + extra_kwargs.update(loop_kwargs, **block_kwargs) + elif loop_kwargs or block_kwargs: + extra_kwargs = dict(loop_kwargs, **block_kwargs) + self.signature(node, frame, extra_kwargs) + self.write(")") + if self.environment.is_async: + self.write("))") + + def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: + self.write(node.key + "=") + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: + self.write("Markup(") + self.visit(node.expr, frame) + self.write(")") + + def visit_MarkSafeIfAutoescape( + self, node: nodes.MarkSafeIfAutoescape, frame: Frame + ) -> None: + self.write("(Markup if context.eval_ctx.autoescape else identity)(") + self.visit(node.expr, frame) + self.write(")") + + def visit_EnvironmentAttribute( + self, node: nodes.EnvironmentAttribute, frame: Frame + ) -> None: + self.write("environment." + node.name) + + def visit_ExtensionAttribute( + self, node: nodes.ExtensionAttribute, frame: Frame + ) -> None: + self.write(f"environment.extensions[{node.identifier!r}].{node.name}") + + def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: + self.write(node.name) + + def visit_ContextReference( + self, node: nodes.ContextReference, frame: Frame + ) -> None: + self.write("context") + + def visit_DerivedContextReference( + self, node: nodes.DerivedContextReference, frame: Frame + ) -> None: + self.write(self.derive_context(frame)) + + def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: + self.writeline("continue", node) + + def visit_Break(self, node: nodes.Break, frame: Frame) -> None: + self.writeline("break", node) + + def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: + ctx = self.temporary_identifier() + self.writeline(f"{ctx} = {self.derive_context(frame)}") + self.writeline(f"{ctx}.vars = ") + self.visit(node.context, frame) + self.push_context_reference(ctx) + + scope_frame = frame.inner(isolated=True) + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + self.pop_context_reference() + + def visit_EvalContextModifier( + self, node: nodes.EvalContextModifier, frame: Frame + ) -> None: + for keyword in node.options: + self.writeline(f"context.eval_ctx.{keyword.key} = ") + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier( + self, node: nodes.ScopedEvalContextModifier, frame: Frame + ) -> None: + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/constants.py b/Meliora/gmapenv/Lib/site-packages/jinja2/constants.py new file mode 100644 index 00000000..41a1c23b --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/jinja2/constants.py @@ -0,0 +1,20 @@ +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = """\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate""" diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/debug.py b/Meliora/gmapenv/Lib/site-packages/jinja2/debug.py new file mode 100644 index 00000000..7ed7e929 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/jinja2/debug.py @@ -0,0 +1,191 @@ +import sys +import typing as t +from types import CodeType +from types import TracebackType + +from .exceptions import TemplateSyntaxError +from .utils import internal_code +from .utils import missing + +if t.TYPE_CHECKING: + from .runtime import Context + + +def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: + """Rewrite the current exception to replace any tracebacks from + within compiled template code with tracebacks that look like they + came from the template source. + + This must be called within an ``except`` block. + + :param source: For ``TemplateSyntaxError``, the original source if + known. + :return: The original exception with the rewritten traceback. + """ + _, exc_value, tb = sys.exc_info() + exc_value = t.cast(BaseException, exc_value) + tb = t.cast(TracebackType, tb) + + if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: + exc_value.translated = True + exc_value.source = source + # Remove the old traceback, otherwise the frames from the + # compiler still show up. + exc_value.with_traceback(None) + # Outside of runtime, so the frame isn't executing template + # code, but it still needs to point at the template. + tb = fake_traceback( + exc_value, None, exc_value.filename or "", exc_value.lineno + ) + else: + # Skip the frame for the render function. + tb = tb.tb_next + + stack = [] + + # Build the stack of traceback object, replacing any in template + # code with the source file and line information. + while tb is not None: + # Skip frames decorated with @internalcode. These are internal + # calls that aren't useful in template debugging output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + template = tb.tb_frame.f_globals.get("__jinja_template__") + + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) + stack.append(fake_tb) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + # Assign tb_next in reverse to avoid circular references. + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc_value.with_traceback(tb_next) + + +def fake_traceback( # type: ignore + exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int +) -> TracebackType: + """Produce a new traceback object that looks like it came from the + template source instead of the compiled code. The filename, line + number, and location name will point to the template, and the local + variables will be the current template context. + + :param exc_value: The original exception to be re-raised to create + the new traceback. + :param tb: The original traceback to get the local variables and + code info from. + :param filename: The template filename. + :param lineno: The line number in the template source. + """ + if tb is not None: + # Replace the real locals with the context that would be + # available at that point in the template. + locals = get_template_locals(tb.tb_frame.f_locals) + locals.pop("__jinja_exception__", None) + else: + locals = {} + + globals = { + "__name__": filename, + "__file__": filename, + "__jinja_exception__": exc_value, + } + # Raise an exception at the correct line number. + code: CodeType = compile( + "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" + ) + + # Build a new code object that points to the template file and + # replaces the location with a block name. + location = "template" + + if tb is not None: + function = tb.tb_frame.f_code.co_name + + if function == "root": + location = "top-level template code" + elif function.startswith("block_"): + location = f"block {function[6:]!r}" + + if sys.version_info >= (3, 8): + code = code.replace(co_name=location) + else: + code = CodeType( + code.co_argcount, + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + location, + code.co_firstlineno, + code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + # Execute the new code, which is guaranteed to raise, and return + # the new traceback without this frame. + try: + exec(code, globals, locals) + except BaseException: + return sys.exc_info()[2].tb_next # type: ignore + + +def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: + """Based on the runtime locals, get the context that would be + available at that point in the template. + """ + # Start with the current template context. + ctx: "t.Optional[Context]" = real_locals.get("context") + + if ctx is not None: + data: t.Dict[str, t.Any] = ctx.get_all().copy() + else: + data = {} + + # Might be in a derived context that only sets local variables + # rather than pushing a context. Local variables follow the scheme + # l_depth_name. Find the highest-depth local that has a value for + # each name. + local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} + + for name, value in real_locals.items(): + if not name.startswith("l_") or value is missing: + # Not a template variable, or no longer relevant. + continue + + try: + _, depth_str, name = name.split("_", 2) + depth = int(depth_str) + except ValueError: + continue + + cur_depth = local_overrides.get(name, (-1,))[0] + + if cur_depth < depth: + local_overrides[name] = (depth, value) + + # Modify the context with any derived context. + for name, (_, value) in local_overrides.items(): + if value is missing: + data.pop(name, None) + else: + data[name] = value + + return data diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/defaults.py b/Meliora/gmapenv/Lib/site-packages/jinja2/defaults.py new file mode 100644 index 00000000..638cad3d --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/jinja2/defaults.py @@ -0,0 +1,48 @@ +import typing as t + +from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 +from .tests import TESTS as DEFAULT_TESTS # noqa: F401 +from .utils import Cycler +from .utils import generate_lorem_ipsum +from .utils import Joiner +from .utils import Namespace + +if t.TYPE_CHECKING: + import typing_extensions as te + +# defaults for the parser / lexer +BLOCK_START_STRING = "{%" +BLOCK_END_STRING = "%}" +VARIABLE_START_STRING = "{{" +VARIABLE_END_STRING = "}}" +COMMENT_START_STRING = "{#" +COMMENT_END_STRING = "#}" +LINE_STATEMENT_PREFIX: t.Optional[str] = None +LINE_COMMENT_PREFIX: t.Optional[str] = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" +KEEP_TRAILING_NEWLINE = False + +# default filters, tests and namespace + +DEFAULT_NAMESPACE = { + "range": range, + "dict": dict, + "lipsum": generate_lorem_ipsum, + "cycler": Cycler, + "joiner": Joiner, + "namespace": Namespace, +} + +# default policies +DEFAULT_POLICIES: t.Dict[str, t.Any] = { + "compiler.ascii_str": True, + "urlize.rel": "noopener", + "urlize.target": None, + "urlize.extra_schemes": None, + "truncate.leeway": 5, + "json.dumps_function": None, + "json.dumps_kwargs": {"sort_keys": True}, + "ext.i18n.trimmed": False, +} diff --git a/Meliora/gmapenv/Lib/site-packages/jinja2/environment.py b/Meliora/gmapenv/Lib/site-packages/jinja2/environment.py new file mode 100644 index 00000000..ea04e8b4 --- /dev/null +++ b/Meliora/gmapenv/Lib/site-packages/jinja2/environment.py @@ -0,0 +1,1667 @@ +"""Classes for managing templates and their runtime and compile time +options. +""" +import os +import typing +import typing as t +import weakref +from collections import ChainMap +from functools import lru_cache +from functools import partial +from functools import reduce +from types import CodeType + +from markupsafe import Markup + +from . import nodes +from .compiler import CodeGenerator +from .compiler import generate +from .defaults import BLOCK_END_STRING +from .defaults import BLOCK_START_STRING +from .defaults import COMMENT_END_STRING +from .defaults import COMMENT_START_STRING +from .defaults import DEFAULT_FILTERS +from .defaults import DEFAULT_NAMESPACE +from .defaults import DEFAULT_POLICIES +from .defaults import DEFAULT_TESTS +from .defaults import KEEP_TRAILING_NEWLINE +from .defaults import LINE_COMMENT_PREFIX +from .defaults import LINE_STATEMENT_PREFIX +from .defaults import LSTRIP_BLOCKS +from .defaults import NEWLINE_SEQUENCE +from .defaults import TRIM_BLOCKS +from .defaults import VARIABLE_END_STRING +from .defaults import VARIABLE_START_STRING +from .exceptions import TemplateNotFound +from .exceptions import TemplateRuntimeError +from .exceptions import TemplatesNotFound +from .exceptions import TemplateSyntaxError +from .exceptions import UndefinedError +from .lexer import get_lexer +from .lexer import Lexer +from .lexer import TokenStream +from .nodes import EvalContext +from .parser import Parser +from .runtime import Context +from .runtime import new_context +from .runtime import Undefined +from .utils import _PassArg +from .utils import concat +from .utils import consume +from .utils import import_string +from .utils import internalcode +from .utils import LRUCache +from .utils import missing + +if t.TYPE_CHECKING: + import typing_extensions as te + from .bccache import BytecodeCache + from .ext import Extension + from .loaders import BaseLoader + +_env_bound = t.TypeVar("_env_bound", bound="Environment") + + +# for direct template usage we have up to ten living environments +@lru_cache(maxsize=10) +def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: + """Return a new spontaneous environment. A spontaneous environment + is used for templates created directly rather than through an + existing environment. + + :param cls: Environment class to create. + :param args: Positional arguments passed to environment. + """ + env = cls(*args) + env.shared = True + return env + + +def create_cache( + size: int, +) -> t.Optional[t.MutableMapping[t.Tuple[weakref.ref, str], "Template"]]: + """Return the cache class for the given size.""" + if size == 0: + return None + + if size < 0: + return {} + + return LRUCache(size) # type: ignore + + +def copy_cache( + cache: t.Optional[t.MutableMapping], +) -> t.Optional[t.MutableMapping[t.Tuple[weakref.ref, str], "Template"]]: + """Create an empty copy of the given cache.""" + if cache is None: + return None + + if type(cache) is dict: + return {} + + return LRUCache(cache.capacity) # type: ignore + + +def load_extensions( + environment: "Environment", + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], +) -> t.Dict[str, "Extension"]: + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated extensions. + """ + result = {} + + for extension in extensions: + if isinstance(extension, str): + extension = t.cast(t.Type["Extension"], import_string(extension)) + + result[extension.identifier] = extension(environment) + + return result + + +def _environment_config_check(environment: "Environment") -> "Environment": + """Perform a sanity check on the environment.""" + assert issubclass( + environment.undefined, Undefined + ), "'undefined' must be a subclass of 'jinja2.Undefined'." + assert ( + environment.block_start_string + != environment.variable_start_string + != environment.comment_start_string + ), "block, variable and comment start strings must be different." + assert environment.newline_sequence in { + "\r", + "\r\n", + "\n", + }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." + return environment + + +class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which + allows using async functions and generators. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to: t.Optional["Environment"] = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class: t.Type["CodeGenerator"] = CodeGenerator + + concat = "".join + + #: the context class that is used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class: t.Type[Context] = Context + + template_class: t.Type["Template"] + + def __init__( + self, + block_start_string: str = BLOCK_START_STRING, + block_end_string: str = BLOCK_END_STRING, + variable_start_string: str = VARIABLE_START_STRING, + variable_end_string: str = VARIABLE_END_STRING, + comment_start_string: str = COMMENT_START_STRING, + comment_end_string: str = COMMENT_END_STRING, + line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, + line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, + trim_blocks: bool = TRIM_BLOCKS, + lstrip_blocks: bool = LSTRIP_BLOCKS, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, + keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), + optimized: bool = True, + undefined: t.Type[Undefined] = Undefined, + finalize: t.Optional[t.Callable[..., t.Any]] = None, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, + loader: t.Optional["BaseLoader"] = None, + cache_size: int = 400, + auto_reload: bool = True, + bytecode_cache: t.Optional["BytecodeCache"] = None, + enable_async: bool = False, + ): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined: t.Type[Undefined] = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.is_async = enable_async + _environment_config_check(self) + + def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes: t.Any) -> None: + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in attributes.items(): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay( + self, + block_start_string: str = missing, + block_end_string: str = missing, + variable_start_string: str = missing, + variable_end_string: str = missing, + comment_start_string: str = missing, + comment_end_string: str = missing, + line_statement_prefix: t.Optional[str] = missing, + line_comment_prefix: t.Optional[str] = missing, + trim_blocks: bool = missing, + lstrip_blocks: bool = missing, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, + keep_trailing_newline: bool = missing, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, + optimized: bool = missing, + undefined: t.Type[Undefined] = missing, + finalize: t.Optional[t.Callable[..., t.Any]] = missing, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, + loader: t.Optional["BaseLoader"] = missing, + cache_size: int = missing, + auto_reload: bool = missing, + bytecode_cache: t.Optional["BytecodeCache"] = missing, + enable_async: bool = False, + ) -> "Environment": + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + + .. versionchanged:: 3.1.2 + Added the ``newline_sequence``,, ``keep_trailing_newline``, + and ``enable_async`` parameters to match ``__init__``. + """ + args = dict(locals()) + del args["self"], args["cache_size"], args["extensions"], args["enable_async"] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in args.items(): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in self.extensions.items(): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + if enable_async is not missing: + rv.is_async = enable_async + + return _environment_config_check(rv) + + @property + def lexer(self) -> Lexer: + """The lexer for this environment.""" + return get_lexer(self) + + def iter_extensions(self) -> t.Iterator["Extension"]: + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) + + def getitem( + self, obj: t.Any, argument: t.Union[str, t.Any] + ) -> t.Union[t.Any, Undefined]: + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, str): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj: t.Any, attribute: str) -> t.Any: + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a string. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def _filter_test_common( + self, + name: t.Union[str, Undefined], + value: t.Any, + args: t.Optional[t.Sequence[t.Any]], + kwargs: t.Optional[t.Mapping[str, t.Any]], + context: t.Optional[Context], + eval_ctx: t.Optional[EvalContext], + is_filter: bool, + ) -> t.Any: + if is_filter: + env_map = self.filters + type_name = "filter" + else: + env_map = self.tests + type_name = "test" + + func = env_map.get(name) # type: ignore + + if func is None: + msg = f"No {type_name} named {name!r}." + + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = f"{msg} ({e}; did you forget to quote the callable name?)" + + raise TemplateRuntimeError(msg) + + args = [value, *(args if args is not None else ())] + kwargs = kwargs if kwargs is not None else {} + pass_arg = _PassArg.from_obj(func) + + if pass_arg is _PassArg.context: + if context is None: + raise TemplateRuntimeError( + f"Attempted to invoke a context {type_name} without context." + ) + + args.insert(0, context) + elif pass_arg is _PassArg.eval_context: + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + + args.insert(0, eval_ctx) + elif pass_arg is _PassArg.environment: + args.insert(0, self) + + return func(*args, **kwargs) + + def call_filter( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a filter on a value the same way the compiler does. + + This might return a coroutine if the filter is running from an + environment in async mode and the filter supports async + execution. It's your responsibility to await this if needed. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, True + ) + + def call_test( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a test on a value the same way the compiler does. + + This might return a coroutine if the test is running from an + environment in async mode and the test supports async execution. + It's your responsibility to await this if needed. + + .. versionchanged:: 3.0 + Tests support ``@pass_context``, etc. decorators. Added + the ``context`` and ``eval_ctx`` parameters. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, False + ) + + @internalcode + def parse( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> nodes.Template: + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def _parse( + self, source: str, name: t.Optional[str], filename: t.Optional[str] + ) -> nodes.Template: + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, filename).parse() + + def lex( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> t.Iterator[t.Tuple[int, str, str]]: + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = str(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def preprocess( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> str: + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce( + lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), + str(source), + ) + + def _tokenize( + self, + source: str, + name: t.Optional[str], + filename: t.Optional[str] = None, + state: t.Optional[str] = None, + ) -> TokenStream: + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) # type: ignore + + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) # type: ignore + + return stream + + def _generate( + self, + source: nodes.Template, + name: t.Optional[str], + filename: t.Optional[str], + defer_init: bool = False, + ) -> str: + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate( # type: ignore + source, + self, + name, + filename, + defer_init=defer_init, + optimized=self.optimized, + ) + + def _compile(self, source: str, filename: str) -> CodeType: + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, "exec") # type: ignore + + @typing.overload + def compile( # type: ignore + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[False]" = False, + defer_init: bool = False, + ) -> CodeType: + ... + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[True]" = ..., + defer_init: bool = False, + ) -> str: + ... + + @internalcode + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: bool = False, + defer_init: bool = False, + ) -> t.Union[str, CodeType]: + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, str): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, defer_init=defer_init) + if raw: + return source + if filename is None: + filename = "